簡體   English   中英

函數正好接受2個參數(給定1個)

[英]Function takes exactly 2 arguments (1 given)

我正在編寫一個模擬彩票游戲的程序,但我陷入了困境。 我正在嘗試將用戶的猜測與中獎彩票上的數字相匹配,但是我的函數“ checkmatch”顯然帶有2個參數,但我只給出了1個? 我知道網站上也有類似的問題,但是我是一個非常新手的程序員,其他人似乎……比我高一點。 這是我程序的全部(到目前為止):

import random

def main():
random.seed()

#Prompts the user to enter the number of tickets they wish to play.
tickets = int(input("How many lottery tickets do you want?\n"))

#Creates the dictionaries "winning_numbers" and "guess"
winning_numbers = []
guess = []

#Generates the winning lotto numbers.
for i in range(tickets):
    del winning_numbers[:]
    del guess[:]
    a = random.randint(1,30)
    winning_numbers.append(a)

    b = random.randint(1,30)
    while not (b in winning_numbers):
        winning_numbers.append(b)


    c = random.randint(1,30)
    while not (c in winning_numbers):
        winning_numbers.append(c)


    d = random.randint(1,30)
    while not (d in winning_numbers):
        winning_numbers.append(d)

getguess(guess, tickets)
nummatches = checkmatch(guess)
nummisses = checkmiss()

    #print(winning_numbers)

#Gets the guess from the user.
def getguess(guess, tickets):
    del guess[:]

for i in range(tickets):
    bubble = input("What numbers do you want to choose for ticket #"+str(i+1)+"?\n").split(" ")
    guess.append(bubble)

#Checks the user's guesses with the winning numbers.
def checkmatch(winning_numbers, guess):
    match = 0
    for i in range(5):
        if winning_numbers[i] == guess[i]:
            match = match+1

return match

這就是給我帶來麻煩的部分:

def checkmatch(winning_numbers, guess):
match = 0
for i in range(5):
    if winning_numbers[i] == guess[i]:
        match = match+1

return match

這是我嘗試測試時得到的結果:

How many lottery tickets do you want?
3
What numbers do you want to choose for ticket #1?
1 2 3 4 5
What numbers do you want to choose for ticket #2?
1 2 3 4 5
What numbers do you want to choose for ticket #3?
1 2 3 4 5 
Traceback (most recent call last):
  File "C:/Users/Ryan/Downloads/Program # 2/Program # 2/lottery.py", line 64, in    <module>
    main()
   File "C:/Users/Ryan/Downloads/Program # 2/Program # 2/lottery.py", line 36, in main
    checkmatch(guess)
TypeError: checkmatch() takes exactly 2 arguments (1 given)

感謝您提供的所有幫助!

問題是

nummatches = checkmatch(guess)

在您的代碼中, checkmatch接受2個參數winning_numbers & guess但是當您調用它時,您僅給出一個參數。

例如

>>> def myfunc(str1,str2):
...   print str1+str2
...
>>> myfunc('a','b') #takes 2 argument and concatenates
ab
>>> myfunc('a') # only one given so ERROR
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: myfunc() takes exactly 2 arguments (1 given)
>>>

問題不在函數定義中。 它在這里:

nummatches = checkmatch(guess)

在錯誤語句中,您會注意到有行號。 導致錯誤的行在錯誤語句的最底部。 問題在第36行。 如果您有一個顯示行號的文本編輯器,您會發現找出錯誤的位置更加容易。

在用於checkmatch的函數定義中,無論何時調用此函數,您都明確地告訴Python需要兩個參數:

def checkmatch(winning_numbers, guess):
   ...

但是,在程序主體中,僅使用一個參數來調用它:

nummatches = checkmatch(guess)

由於您沒有為checkmatch提供winning_numbers參數,因此會出現錯誤。

看來您正在執行此操作是因為您已經在主程序的主體中使用了winning_numbers。 這就是實際錯誤所在的位置,您認為是因為程序主體中的變量與函數定義中的變量具有相同的名稱,因此變量winning_numbers會自動傳遞。

函數定義中的winning_numbers參數是函數checkmatch的局部變量 ,它僅告訴Python期望用戶在調用該函數時在該位置給出一個值,然后允許該名稱用於表示該值。函數定義本身內部的值。 但是,您在主程序中擁有的winning_numbers列表是一個全局變量的示例,並且由於函數定義重復使用了完全相同的名稱,因此您將遵循Python不合邏輯的指示,從而導致錯誤。

要解決此問題,請a)顯式傳遞變量:

nummatches = checkmatch(winning_numbers, guess)

...或b)正確使用全局變量。

def checkmatch(guess):
    global winning_numbers
    ...

但是,我建議您最好閱讀有關Python名稱空間,全局變量與局部變量以及何時使用它們的更多信息。

而且,順便說一句,除非在非常特殊的情況下,否則使用del buildin通常不是一個好主意。 您已經將變量分配為空列表,在代碼上下文中無需再次手動刪除其內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM