2013-10-22 33 views
0

我在random.randint(使用*)的混淆,但沒有找到任何文件使用*運營商在函數調用

random.randint(*(1,300)) 

VS

random.randint(1,300) 

random.randint(*300) 
TypeError: randint() argument after * must be a sequence, not int 
+3

是文字代碼嗎?如果它是'r = [1,300]; random.randint(* r)'...但是一個文字元組被解開,有點奇怪......我認爲@ecatmur提供的鏈接很可能是您的問題的答案 –

+0

是的,它不是文字代碼。元組參數傳遞給random.randint()。謝謝。 – user138645

回答

4

在此上下文中的*將元組擴展爲單獨的元素。而

random.randint((1,300)) 

會錯誤地傳遞一個元組作爲單個參數random.randint

random.randint(*(1,300)) 

經過「修飾」元組的每個元素作爲參數傳遞給函數。這對硬編碼元組來說並不是很有用,因爲刪除*和括號會更快更清晰。但是,當你有一個引用元組的名字時,它更有意義。

range = (1,300) 
random_value = random.randint(*range) 
2

*是Python的一部分function call syntax*需要一個迭代器並將其元素添加到函數調用的參數中。

random.randint(*(1,300)) 

是一回事

random.randint(1,300) 

下面是一個語法錯誤,因爲300不是一個迭代。

random.randint(*300) 

*語法有時可能有用。如果你有一個清單(或其他可迭代)x包含您想在一個函數調用中使用位置參數,你可以說:

func(x[0], x[1], x[2]) 

,或者乾脆:

func(*x) 
1

在任何python函數中使用*表示後面的序列*是傳遞給函數的參數列表。所以,

random.randint(*(1, 300)) 

是相同的是

random.randint(1, 300) 

代碼

random.randint(*300) 

失敗了,因爲300不是一個序列,它是一個整數。