Как заставить функцию повторять себя, не генерируя код выхода 0?

Я сделал простой ролик для игры в кости с for-in loop, который принимает 2 части input, количество костей и количество граней костей. Когда рулон сделан, результаты распечатываются на экране.

После того, как первоначальный бросок сделан, я хотел бы, чтобы код начался снова, с новым inputs, без создания exit code 0.

##Original design obviously does not loop
from random import randint
import time
dice = int(input("\nHow many dice?\n   "))
sides = int(input("How many sides?\n   "))

def roll():
    for quantity in range(dice):
        time.sleep(.5)
        print(randint(1, sides))

roll()

Я переместил переменные input из global scope в local scope, чтобы их можно было обновлять при каждом повторении. Когда я заканчиваю function вызовом function, я достигаю некоторого успеха. Я могу loop выполнять процесс бесконечно, не создавая exit code 0, но любое количество кубиков сверх 1, похоже, не регистрируется. Таким образом я могу бросать только один кубик за раз.

##Design 2 does not generate any exit codes and continues to loop
##endlessly but will not register more than 1 dice
from random import randint
import time

def roll():
    dice = int(input("\nHow many dice?\n   "))
    sides = int(input("How many sides?\n   "))
    for quantity in range(dice):
        time.sleep(.5)
        print(randint(1, sides))
        roll()

roll()

Я изменил function так, чтобы он не заканчивался на calling сам по себе. Вместо этого я создал новую функцию, которая ничего не делает, кроме вызова первой. Я поместил избыточную функцию после первой и смог успешно достичь своей цели, бросив любое количество граненых кубиков, сколько мне заблагорассудится... дважды. После двух итераций/циклов генерируется exit code 0

##Current design will register all input data correctly 
##but only loops 2 times before generating an `exit code 0`
from random import randint
import time

def roll():
    dice = int(input("\nHow many dice?\n   "))
    sides = int(input("How many sides?\n   "))
    for quantity in range(dice):
        time.sleep(.5)
        print(randint(1, sides))

def roll_again():
    roll()

roll()
roll_again()

Кто-нибудь знает, что я делаю неправильно?

Вы хотите, чтобы скрипт выполнялся непрерывно? Просите новый input после всех роллов? Если это так, вы можете обернуть свой код в цикл while True:.

ilja 30.05.2019 09:06

Да, 100% это то, что я хочу. Хотя я никогда раньше не использовал Boolean. Мне нужно будет проверить некоторые циклы while и посмотреть, что случилось.

Marcvs 30.05.2019 09:11
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
2
151
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать цикл while

from random import randint
import time

def roll():
    dice = int(input("\nHow many dice?\n   "))
    sides = int(input("How many sides?\n   "))
    for quantity in range(dice):
        time.sleep(.5)
        print(randint(1, sides))

while True:
    roll()

Это запустит скрипт навсегда, новый ввод после всех бросков.

Для выхода нажмите Ctrl+C

Предыстория: цикл while проверяет условие в начале и запускается, если оно выполнено (True). В этом случае условие всегда установлено на True, то есть выполняется навсегда ;-)

Ответ принят как подходящий

Вам нужно поместить игровую логику в цикл while; введите ноль кубиков, чтобы выйти, когда вы закончите играть.

from random import randint
import time


def roll():
    for quantity in range(dice):
        time.sleep(.5)
        print(randint(1, sides))

while True:
    dice = int(input("\nHow many dice? (zero to stop)\n   "))
    if dice == 0:
        break
    sides = int(input("How many sides?\n   "))
    roll()

Другие вопросы по теме