Почему функция добавления прерывает мой while l oop? - PullRequest
0 голосов
/ 08 мая 2020

Я работал над функцией all_dice (), которая должна принимать значение выбора, сколько кубиков хочет бросить пользователь, а затем бросает соответствующее количество кубиков. Я хочу сохранить каждую переменную roll_ () в пустом наборе thisset = set (), чтобы иметь возможность получить окончательный результат, просто вернув и распечатав all_dice (). Но я получаю только одно значение. Идея набора, кажется, перехватывает while l oop. Например, когда я устанавливаю choice == 5, этот набор содержит только {4}. Если он работает, как задумано, функция должна начинаться с выбора = 5, получать число roll_ (), сохранять его в thisset {}, затем вести обратный отсчет по выбору = выбор-1, go до выбора == 4 и скоро. Итак, с choice = 5, id ожидает 5 значений внутри thisset {}.

без функции thisset.add () функция all_dice () работает так, как задумано - обратный отсчет вариантов и получение соответствующих значений.

Может кто подскажет, почему в то время как l oop перехватывается / в чем проблема?

Это моя первая программа, поэтому будьте осторожны со мной -thx за вашу помощь!

#function to role many dice 
import random
choice =5
print("choice is:",choice)
def all_dice(choice):
    while choice>=1:
        thisset=set()
        if choice==1:
            roll_1=random.randint(1,6)
            thisset.add(roll_1)
            choice=choice-1
        if choice==2:
            roll_2=random.randint(1,6)
            thisset.add(roll_2)
            choice=choice-1
        if choice==3:
            roll_3=random.randint(1,6)
            thisset.add(roll_3)
            choice=choice-1
        if choice==4:
            roll_4=random.randint(1,6)
            thisset.add(roll_4)
            choice=choice-1
        if choice==5:
            roll_5=random.randint(1,6)
            thisset.add(roll_5)
            choice=choice-1
    return thisset
print(all_dice(choice))

Ответы [ 3 ]

1 голос
/ 08 мая 2020

Вы очищаете набор каждый раз через l oop, поэтому вы теряете предыдущие элементы. Вам нужно инициализировать его только один раз перед l oop. (По какой-то причине этот тип ошибок очень распространен среди новичков.)

И вам не нужны все эти разные переменные или if операторы, поскольку все они делают одно и то же.

def all_dice(choice):
    thisset = set()
    for _ in range(choice):
        thisset.add(random.randint(1, 6))
    return thisset

Я не уверен, зачем вам использовать набор для бросания нескольких кубиков. В наборе не может быть дубликатов, поэтому, если вы бросите одно и то же число несколько раз, набор будет содержать только один из них. Если вы хотите бросить 5 кубиков, вы обычно используете список для хранения всех бросков. А если вас интересует только сумма, вам вообще не нужно сохранять все разные рулоны, просто добавьте их в общую переменную.

0 голосов
/ 08 мая 2020
#function to role many dice 
import random
choice =5
print("choice is:",choice)
def all_dice(choice):
    thisset = [] 
    while choice>=1:
        if choice==1:
            roll_1=random.randint(1,6)
            thisset.append(roll_1)
            choice=choice-1
        if choice==2:
            roll_2=random.randint(1,6)
            thisset.append(roll_2)
            choice=choice-1
        if choice==3:
            roll_3=random.randint(1,6)
            thisset.append(roll_3)
            choice=choice-1
        if choice==4:
            roll_4=random.randint(1,6)
            thisset.append(roll_4)
            choice=choice-1
        if choice==5:
            roll_5=random.randint(1,6)
            thisset.append(roll_5)
            choice=choice-1
    return thisset
print(all_dice(choice))

Пример вывода, который я получил: -

[3, 1, 6, 5, 2]

set не может иметь дубликатов, поэтому я использовал list.

0 голосов
/ 08 мая 2020

Это самый c pythoni * способ, который я могу придумать. Я бы НЕ рекомендовал использовать set(), если вам не нужны дубликаты в ваших данных:

import random

def roll_dice(rolls=1):
    return [random.randint(1, 6) for roll in range(rolls)]

roll_dice(5)

Или другой способ сделать это:

import random

roll_dice = lambda rolls: [random.randint(1, 6) for roll in range(rolls)]

roll_dice(5)

Вывод:

[2, 1, 1, 5, 1]
...