Каковы семантические ошибки с этим кодом

#python #semantics

#python #семантика

Вопрос:

У меня есть этот код, в котором есть некоторые семантические ошибки, которые я не могу найти. Первая строка не сообщает нам, каким был бросок монеты. 1000 переворотов — это математически невероятные 1000 хвостов. Кубик выдает 0, когда значения должны быть от 1 до 6. Результат с двумя кубиками просто рассказывает нам о функции, а результат с 10 кубиками также содержит нули.

 import random
import numpy as np

def flipacoin():
    #This function flips a virtual coin and returns "Heads" or "Tails"
    coin = random.randint(1, 2) #returns a 1 or a 2
    if coin == 1:
        coin = "Heads"
    elif coin == 2:
        coin = "Tails"

def flipNcoins(n):
    #This function flips a coin a number of times (n flips total) and returns a string stating results.
    total_heads = 0
    total_tails = 0
    for i in range(n):
        if flipacoin() == "Heads":
            total_heads  = 1
        else:
            total_tails  = 1
    return "Heads "   str(total_heads)   ", Tails "   str(total_tails)


def rolladie():
    #This function rolls a virtual die and returns a number between 1 and 6.
    die = random.randint(0,6)
    return die

def rolltwodice():
    #This function rollstwo virtual dice and returns a tuple of the two values.
    die1 = rolladie()
    die2 = rolladie()
    return die1, die2

def rollNdice(n):
    #This function rolls n virtual dice and returns an array of roll values between 1 and 6.
    rolls = np.zeros((n,))
    for i in range(n):
        die = rolladie()
        rolls[i] = die
    return rolls
  

Ответ №1:

coin = "Heads" устанавливает локальную переменную coin в "Heads" . Он не возвращает его. return "Heads" бы (или, что эквивалентно, return coin в конце функции). Предполагается, что любая функция, которая не выполняет a return до своего завершения, возвращает None . None очевидно, что нет "Heads" , поэтому вы накапливаете 1000 total_tails .

Не должно вызывать большого удивления то, random.randint(0,6) что числа изменяются от 0 до 6, а не от 1 до 6. Чтобы сделать последнее, используйте random.randint(1,6) вместо этого.

Я не понимаю, что вы подразумеваете под «Результатом двух кубиков, который просто рассказывает нам о функции».