Найти - Пользователи
Полная версия: Вопросы от новичков.
Начало » Python для новичков » Вопросы от новичков.
1 2 3 4 None 20 21 22 23 24 25 26 27 28 29 30 31
Rusl
Romissevd
Спасибо. Громоздко выходит. Думал можно в меньше строк можно.
FishHook
Rusl
Громоздко выходит
Сделай цикл, будет негромоздко
Retterhalm
Здравствуйте, уважаемые форумчане!
Изучаю 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 ()
FishHook
Конкатенацию строк забыть. Открыть для себя .format

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

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

Конкатенацию строк искоренил:
 print(' Your  {} dice ( {}  sides ) has rolled {} !'.format(n, dices[n], roll))# printing out results
Retterhalm
Вот вариант вообще без функций.
  #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 начал использовать повторно. Почему-то это мне не очень нравится. Это нормально так переопределять значения или лучше(чтобы не путаться) определить другую переменную?
FishHook
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))
такой код логичней и чище
FishHook
Retterhalm
Это нормально так переопределять значения или лучше(чтобы не путаться) определить другую переменную?
Ненормально вообще давать переменным ничего не значащие имена
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB