Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 23, 2017 23:21:31

Rusl
Зарегистрирован: 2017-10-23
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопросы от новичков.

Romissevd
Спасибо. Громоздко выходит. Думал можно в меньше строк можно.



python: 3.6.6 64-bit
система: windows 10, 64-bit
редактор: PyCharm 2018.1.4 (Community Edition)

учебник: Изучаем Python. Программирование игр, визуализация данных, веб-приложения. Мэтиз Эрик.

Офлайн

#2 Окт. 24, 2017 05:39:12

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Вопросы от новичков.

Rusl
Громоздко выходит
Сделай цикл, будет негромоздко



Офлайн

#3 Окт. 24, 2017 08:25:59

Retterhalm
Зарегистрирован: 2017-02-09
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопросы от новичков.

Здравствуйте, уважаемые форумчане!
Изучаю Python сравнительно недавно, пройденный материал закрепляю написанием задач.
Вчера решил написать программу, которая будет эмулировать броски игральных костей.
Программа консольная, с текстовым юзер-интерфейсом. Ничего особенного. Работает
Но, я знаю, что новички склонны к излишне “тяжёлым решениям”, поэтому хочу попросить Вас проглядеть мой код и, возможно подсказать, что можно улучшить или исправить.
Заранее благодарен.
С уважением, Денис
Вот, собственно, код:

 #Dice roller program.
import random
def dice_roller(): # main function
    dice_qty = int(input('How many dices do you want to roll ?')) # getting amount of dices
    dices= {}
    for n in range (1, (dice_qty  + 1)):                          # finding out how many side ech dice is  
        if n == 1:
            sides = int(input('How many sides is your first dice ?'))
        elif n == dice_qty:
            sides = int(input('How many sides is your last dice ?'))
        else:
            sides = int(input('How many sides is your next dice ?'))
        dices[n] = sides                                          # forming a dictionary, where key is an index number of a dice and a value is a number of sides
    def roll_dice(dices,n):# 'rolling function'
        
        if n > dice_qty:   #return statement. If we roll all dices - exit
            return
        else:               # else roll dice
            roll = random.randint(1, dices[n])
            print(' Your ' + str(n) + ' dice  ( ' + str(dices[n]) + ' sides ) has rolled  ' + str(roll) + ' ! ' )# printing out results
            n = n + 1
            roll_dice(dices,n) #rolling next dice
    roll_dice(dices,1)
dice_roller ()

Офлайн

#4 Окт. 24, 2017 09:47:43

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Вопросы от новичков.

Конкатенацию строк забыть. Открыть для себя .format

Архитектурно как-то не вполне понятен мотив организовывать вложенные функции, если вы все равно передаете локальные переменные в замыкание. Зачем так?



Отредактировано FishHook (Окт. 24, 2017 09:49:55)

Офлайн

#5 Окт. 24, 2017 10:01:49

Retterhalm
Зарегистрирован: 2017-02-09
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопросы от новичков.

Благодарю Вас за ответ!

FishHook
Конкатенацию строк забыть. Открыть для себя .format
Спасибо, почитаю.
FishHook
Архитектурно как-то не вполне понятен мотив организовывать вложенные функции, если вы все равно передаете локальные переменные в замыкание. Зачем так?
Да я сам не знаю пока. Хотелось, чтобы можно было “бросить” сколько угодно костей со сколько угодно гранями. Поэтому и написал рекурсивную функцию на бросок и вывод результата.
Но я подумаю, как можно без неё обойтись.
Словарь для хранения данных по костям приемлем? Или что-то другое поискать?
База маловата, к сожалению, но я учусь.
Готовых кодов не надо, пожалуйста.

Офлайн

#6 Окт. 24, 2017 10:17:01

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Вопросы от новичков.

Retterhalm
Поэтому и написал рекурсивную функцию на бросок и вывод результата.
Рекурсию то я и не заметил. Рекурсия здесь - как собаке пятая нога, лишнее вообще и более того вредное, никогда не применяйте рекурсию без обоснованной алгоритмической необходимости. Рекурсия - это хороший способ переполнить стек вызовов и уронить программу.



Офлайн

#7 Окт. 24, 2017 10:21:05

Retterhalm
Зарегистрирован: 2017-02-09
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопросы от новичков.

FishHook
Рекурсию то я и не заметил. Рекурсия здесь - как собаке пятая нога, лишнее вообще и более того вредное, никогда не применяйте рекурсию без обоснованной алгоритмической необходимости. Рекурсия - это хороший способ переполнить стек вызовов и уронить программу.

Спасибо, приму к сведению! (Не так давно читал про неё, наверное поэтому везде пихаю )
Попробую с циклом.

Конкатенацию строк искоренил:
 print(' Your  {} dice ( {}  sides ) has rolled {} !'.format(n, dices[n], roll))# printing out results

Отредактировано Retterhalm (Окт. 24, 2017 10:22:37)

Офлайн

#8 Окт. 24, 2017 10:56:23

Retterhalm
Зарегистрирован: 2017-02-09
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопросы от новичков.

Вот вариант вообще без функций.

  #Dice roller program.
import random
dice_qty = int(input('How many dices do you want to roll ?')) # getting amount of dices
dices= {}
for n in range (1, (dice_qty  + 1)):                          # finding out how many side ech dice is  
    if n == 1:
        sides = int(input('How many sides is your first dice ?'))
    elif n == dice_qty:
        sides = int(input('How many sides is your last dice ?'))
    else:
        sides = int(input('How many sides is your next dice ?'))
    dices[n] = sides                                          # forming a dictionary, where key is an index number of a dice and a value is a number of sides
n = 1
while n < dice_qty + 1:
    roll = random.randint(1, dices[n])
    print(' Your  {} dice ( {}  sides ) has rolled {} !'.format(n, dices[n], roll))# printing out results
    n = n + 1

Переменную n начал использовать повторно. Почему-то это мне не очень нравится. Это нормально так переопределять значения или лучше(чтобы не путаться) определить другую переменную?

Отредактировано Retterhalm (Окт. 24, 2017 10:58:38)

Офлайн

#9 Окт. 24, 2017 11:08:46

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Вопросы от новичков.

Retterhalm
Программу тут в принципе больше обсуждать и нечего, но я дам один совет:

     if n == 1:
        sides = int(input('How many sides is your first dice ?'))
    elif n == dice_qty:
        sides = int(input('How many sides is your last dice ?'))
    else:
        sides = int(input('How many sides is your next dice ?'))

тут как бы претензий нет, но смотрите какая логика: в ветках вашего ифа происходит одно и то же, сама по себе операция получения значения sides по сути одна и та же, меняется только сообщение пользователю. Ну так и работайте с сообщением, а не вызовом функции

     if n == 1:
        message = 'How many sides is your first dice ?'
    elif n == dice_qty:
        message = 'How many sides is your last dice ?'
    else:
        message = 'How many sides is your next dice ?'
    sides = int(input(message))
такой код логичней и чище



Офлайн

#10 Окт. 24, 2017 11:10:13

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Вопросы от новичков.

Retterhalm
Это нормально так переопределять значения или лучше(чтобы не путаться) определить другую переменную?
Ненормально вообще давать переменным ничего не значащие имена



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version