Форум сайта python.su
RomissevdСпасибо. Громоздко выходит. Думал можно в меньше строк можно.
Офлайн
RuslСделай цикл, будет негромоздко
Громоздко выходит
Офлайн
Здравствуйте, уважаемые форумчане!
Изучаю 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 ()
Офлайн
Конкатенацию строк забыть. Открыть для себя .format
Архитектурно как-то не вполне понятен мотив организовывать вложенные функции, если вы все равно передаете локальные переменные в замыкание. Зачем так?
Отредактировано FishHook (Окт. 24, 2017 09:49:55)
Офлайн
Благодарю Вас за ответ!
FishHookСпасибо, почитаю.
Конкатенацию строк забыть. Открыть для себя .format
FishHookДа я сам не знаю пока. Хотелось, чтобы можно было “бросить” сколько угодно костей со сколько угодно гранями. Поэтому и написал рекурсивную функцию на бросок и вывод результата.
Архитектурно как-то не вполне понятен мотив организовывать вложенные функции, если вы все равно передаете локальные переменные в замыкание. Зачем так?
Офлайн
RetterhalmРекурсию то я и не заметил. Рекурсия здесь - как собаке пятая нога, лишнее вообще и более того вредное, никогда не применяйте рекурсию без обоснованной алгоритмической необходимости. Рекурсия - это хороший способ переполнить стек вызовов и уронить программу.
Поэтому и написал рекурсивную функцию на бросок и вывод результата.
Офлайн
FishHookСпасибо, приму к сведению! (Не так давно читал про неё, наверное поэтому везде пихаю
Рекурсию то я и не заметил. Рекурсия здесь - как собаке пятая нога, лишнее вообще и более того вредное, никогда не применяйте рекурсию без обоснованной алгоритмической необходимости. Рекурсия - это хороший способ переполнить стек вызовов и уронить программу.
print(' Your {} dice ( {} sides ) has rolled {} !'.format(n, dices[n], roll))# printing out results
Отредактировано Retterhalm (Окт. 24, 2017 10:22:37)
Офлайн
Вот вариант вообще без функций.
#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
Отредактировано Retterhalm (Окт. 24, 2017 10:58:38)
Офлайн
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 ?'))
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))
Офлайн
RetterhalmНенормально вообще давать переменным ничего не значащие имена
Это нормально так переопределять значения или лучше(чтобы не путаться) определить другую переменную?
Офлайн