#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())