簡體   English   中英

Python中的定義函數接受(x,* args),但不接受(* args,x)。 為什么?

[英]Defining function in Python accepts (x, *args), but not (*args, x). Why?

我最近開始自學Python,並且對定義函數有疑問。 我了解了函數中的*args**args可能性,並決定嘗試一下。 我試圖通過在IDLE中創建此函數來制作一個非常簡單的計算器:

def test(*args, tool):
    total = 0
    if(tool == '+' or tool == 'plus'):
        for a in args:
            total += a
        return total

但是,當我通過第一行時,Python向我拋出了此錯誤:

SyntaxError: invalid syntax

剛開始,我不知道自己做錯了什么,所以我嘗試對它們都進行type() ,並意識到* args是一個元組,** args是一個字典。 因此,我理解了當嘗試將字母字符串轉換為元組然后查找代碼的tool部分時,Python會感到困惑的地方。

但是,當我在* args和tool上切換位置: def test(tool, *args) ,根本沒有遇到任何錯誤,並且代碼按預期運行(奇怪的是,根本沒有工具參數)。 但是,當我嘗試以這種方式調用該函數: test(4, 2, 3, 'tool') ,它再次向我拋出錯誤,抱怨它無法將int和字符串加在一起。

到底是怎么回事?

*args必須在函數調用的末尾。 這是因為,如果*args之后有*args ,Python將無法知道*args何時結束以及其余參數開始。 如果在開始處有一定數量的參數,則*args ,它知道在函數的末尾停止。

Python是一種解釋型語言,因此它將從左到右讀取該函數並隨其分配變量。 采取以下措施:

def foo(bar, *args):
    print("Hello, world!", bar, args)

如果我傳入foo(3, 4, 5, 6) Python會說:“好吧,我們將bar設置為3。然后,其余參數都放入args 。那就是(4, 5, 6) ”。

現在使用相反的參數:

def foo(*args, bar):
    print("Hello, world!", bar, args)

使用相同的參數,Python會說:“其余參數可以放入args 。即為(3, 4, 5, 6) args (3, 4, 5, 6) 。等等,那bar呢?我們什么都沒有了!” 因此,它將引發錯誤。

使用函數test ,如果要加*args ,則不能輸入三個數字和一個字符串。 您必須先傳遞tool ,然后傳遞數字。

這僅僅是因為解釋器(或在其他語言的情況下是編譯器)。 當您定義一個函數時,解釋器先尋找參數,然后尋找額外的參數,然后尋找關鍵詞參數。 為了正確解釋:

在這種情況下,解釋器將僅找到一個參數:

def (myArg): 

在這種情況下,解釋器將找到一個參數和“剩余”參數,因此它知道如何映射第一個參數,然后再映射其他參數。

def (myArg, *args):

但是在這種情況下,解釋器會查找參數list ,以便將所有參數都打包到args中。 那么myArg會怎樣?

def(*args, myArg): 

沒有更多的參數,因為它已經將所有參數打包到了args中,只是因為解釋器不知道args何時結束。

暫無
暫無

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

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