Неверный вывод Python Cointoss

#python #python-3.x

#python #python-3.x

Вопрос:

Это сценарий подбрасывания монеты, который я написал на python 3

 import random

def tosscoin():
    numbers = input("Times to flip coin: ")
    recordList = ['Heads', 'Tails']
    heads = 0
    tails = 0
    for number in numbers:
        flip = random.randint(0, 1)
        if (flip == 0):
            print("Heads")
            recordList.append('Heads')
        else:
            print("Tails")
            recordList.append('Tails')
            print(str(recordList))
            print(str(recordList.count('Heads'))   str(recordList.count('Tails')))

print(tosscoin())
 

и мой ввод был 10

результат, который я получил, был

 Tails
['Heads', 'Tails', 'Tails']
12
Tails
['Heads', 'Tails', 'Tails', 'Tails']
13
None
 

Процесс завершен с кодом выхода 0

почему вывод получается таким образом?

Комментарии:

1. какой вывод вы хотели?

Ответ №1:

Вместо for number in numbers того, чтобы делать for number in range(int(numbers))

Причина в том, что результатом input является строка, а не число. Поэтому, если вы хотите сделать это 10 раз, вам нужно сначала проанализировать int , а затем выполнить итерацию для такого количества шагов

Ответ №2:

Измененный код выглядит следующим образом:

 import random

def tosscoin():
    numbers = int(input("Times to flip coin: "))
    recordList = []
    heads = 0
    tails = 0
    for number in range(numbers):
        flip = random.randint(0, 1)
        # print(flip)
        if (flip == 0):
            print("Heads")
            recordList.append('Heads')
        else:
            print("Tails")
            recordList.append('Tails')
            
        print(recordList)
        print(recordList.count('Heads')   recordList.count('Tails'))
    
    return recordList

print(tosscoin())
 

Вывод:

 Times to flip coin:  10

Heads
['Heads']
1
Heads
['Heads', 'Heads']
2
Tails
['Heads', 'Heads', 'Tails']
3
Tails
['Heads', 'Heads', 'Tails', 'Tails']
4
Heads
['Heads', 'Heads', 'Tails', 'Tails', 'Heads']
5
Tails
['Heads', 'Heads', 'Tails', 'Tails', 'Heads', 'Tails']
6
Heads
['Heads', 'Heads', 'Tails', 'Tails', 'Heads', 'Tails', 'Heads']
7
Heads
['Heads', 'Heads', 'Tails', 'Tails', 'Heads', 'Tails', 'Heads', 'Heads']
8
Heads
['Heads', 'Heads', 'Tails', 'Tails', 'Heads', 'Tails', 'Heads', 'Heads', 'Heads']
9
Tails
['Heads', 'Heads', 'Tails', 'Tails', 'Heads', 'Tails', 'Heads', 'Heads', 'Heads', 'Tails']
10
['Heads', 'Heads', 'Tails', 'Tails', 'Heads', 'Tails', 'Heads', 'Heads', 'Heads', 'Tails']
 

Ответ №3:

Здесь было несколько проблем:

  • recordList не инициализируется как пустой список, поэтому вы на самом деле считаете, что 1 слишком много «хвостов» и 1 слишком много «голов»
  • отступ неверен, поэтому вы печатаете recordList , и орел и решка учитываются каждый раз, когда результат подбрасывания монеты — «Решка»
  • input функция возвращает строку. Следовательно, ваш for цикл зацикливается на символах вашего ввода. Итак, если ваш ввод равен «10», будет 2 итерации, потому что в «10» есть 2 символа. Сначала вам нужно преобразовать входные данные в целое число и использовать range функцию для выполнения цикла столько раз, сколько необходимо
  • print(tosscoin()) отображается None , потому tosscoin что функция не возвращает никакого значения

Вот код, который должен работать так, как вы ожидаете:

 import random

def tosscoin():
    numbers = int(input("Times to flip coin: "))
    recordList = []
    for number in range(numbers):
        flip = random.randint(0, 1)
        if (flip == 0):
            print("Heads")
            recordList.append('Heads')
        else:
            print("Tails")
            recordList.append('Tails')
    print(str(recordList))
    print(str(recordList.count('Heads'))   " "   str(recordList.count('Tails')))

tosscoin()
 

Ответ №4:

здесь нужно распаковать несколько вещей

во-первых: numbers = input("Times to flip coin: ") результатом input является строка, поэтому numbers это строка, если вы вводите 10, это строка «10», и когда вы выполняете for number in numbers: итерацию по символу внутри нее, а в «10» всего два символа, так что вы получаете только 2 итерации

во-вторых: блочный код в python, как вы должны знать, является базовым с отступом, поэтому вы можете печатать свой код только recordList всякий раз, когда получаете хвост, и так уж получилось, что в этом случае вы случайно получили два хвоста подряд

в-третьих: здесь print(str(recordList.count('Heads')) str(recordList.count('Tails'))) вы добавляете две строки, строки with — это конкатенация, в этом случае у вас есть 2 хвоста подряд, поэтому количество ваших заголовков равно 1, потому что у вас есть список записей, начинающийся с одного заголовка и хвоста внутри, recordList = ['Heads', 'Tails'] а количество хвостов равно 2, которое вы просто добавляетеи тот, который был внутри него ранее в первом цикле и 3 во втором, так что именно отсюда берутся ваши 12 и 13

наконец, здесь print(tosscoin()) вы печатаете результат tosscoin функции, но эта функция не возвращает никакого значения, когда любая функция в python завершает работу, если нет какого-либо оператора return, он вернет None, и именно отсюда None происходит

Некоторые простые решения:

  • преобразуйте свой ввод в число, вызвав int его
  • используйте функцию range, чтобы получить желаемое количество итераций
  • вы объявляете переменные heads и, tail но не используете их, а вместо этого используете recordList , если вы хотите, чтобы список был пустым, чтобы у вас были правильные значения, и удалите предыдущие два или используйте их вместе, вы также можете добавить возвращаемое значение к этой функции, скажем, например, этот список записей

.

 import random

def tosscoin():
    numbers = int(input("Times to flip coin: "))
    recordList = []
    heads = 0
    tails = 0
    for n in range(numbers):
        flip = random.randint(0, 1)
        if flip == 0 :
            heads  = 1
            recordList.append("Heads") 
            print("Heads",heads)
        else:
            tails  = 1
            recordList.append("Tails")
            print("Tails",tails)
        #print(recordList) #uncomment this if you want to print the list in each iteration
    return recordList

print(tosscoin())