2013-10-22 36 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不是一个序列,它是一个整数。