字符串上的“TypeError:'function'对象不可订阅”?

时间:2017-11-19 03:27:51

标签: python string python-3.x function typeerror

我正在编写一个小游戏来猜测一个数字而且我不明白为什么我会收到这个错误,因为我的numCheck()函数中的num和userNum应该是字符串而不是函数。

import random

def num():
    """Returns a number between 1000 and 9999."""
    num = str(random.randint(1000, 9999))
    print("Random number is: " + num) #for testing purposes
    return num

def userNum():
    """Asks user for a number between 1000 and 9999."""
    while True:
        try:
            userNum = int(input("Choose a number between 1000 and 9999: "))
        except ValueError:
            print("This isn't a number, try again.")
            continue
        if userNum < 1000 or userNum > 9990:
            print("Your number isn't between 1000 and 9999, try again.")
            continue
        else:
            break
    userNum = str(userNum)
    return userNum

def numCheck(num, userNum):
    """Checks the number of cows and bulls."""
    cow = 0
    bull = 0
    for i in range(0, 3):
        if userNum[i] == num[i]:
            cow += 1
        else:
            bull += 1
    print("You have " + str(cow) + " cow(s) and you have " + str(bull) + " bull(s).")
    return cow

def gameLoop():
    """Loops the game until the user find the right number."""
    num()
    cow = 0
    if cow < 4:
        userNum()
        numCheck(num, userNum)
    else:
        print("Congratulation, You found the right number!")

gameLoop()

运行脚本时出现的错误如下:

==================== RESTART: /home/pi/Desktop/cowbull.py ====================
Random number is: 8104
Choose a number between 1000 and 9999: 5555
Traceback (most recent call last):
  File "/home/pi/Desktop/cowbull.py", line 47, in <module>
    gameLoop()
  File "/home/pi/Desktop/cowbull.py", line 43, in gameLoop
    numCheck(num, userNum)
  File "/home/pi/Desktop/cowbull.py", line 30, in numCheck
    if userNum[i] == num[i]:
TypeError: 'function' object is not subscriptable
>>> 

请注意,其他事情目前可能无法正常工作或完美,但我只想弄清楚这个错误的逻辑,以便继续。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

以下是您的函数gameLoop

def gameLoop():
    """Loops the game until the user find the right number."""
    num()
    cow = 0
    if cow < 4:
        userNum()
        numCheck(num, userNum)
    else:
        print("Congratulation, You found the right number!")

您调用名为userNum()的函数,但不将其返回值分配给变量。在下一行中,您将userNum作为参数传递给函数numCheck。由于userNum是上一行中的一个函数,它现在仍然必须是一个函数(在Python中将函数作为参数传递给另一个函数是完全合法的)。

在上一行中,您需要将userNum的返回值分配给新变量。然后将该变量传递给numCheck

        x = userNum()
        numCheck(num, x)

您使用函数num犯了完全相同的错误。即使您希望numuserNum成为字符串,实际上它们都是函数。这两个函数返回一个字符串,但您需要将返回的值分配给新变量,以便以后使用它们。

Abdou的评论是正确的,因为使用相同的变量名来表示不同的事情会让人感到困惑。