Unpack a list in Python?
我认为"解包"可能是错误的词汇-抱歉,因为我确信这是一个重复的问题。
我的问题很简单:在一个需要项目列表的函数中,如何在不出错的情况下传递一个python列表项目?
1 2 3
| my_list = ['red', 'blue', 'orange']
function_that_needs_strings('red', 'blue', 'orange') # works!
function_that_needs_strings(my_list) # breaks! |
当然,必须有一种方法来扩展列表,并在hoof上传递函数'red','blue','orange'?
- 我对python的抱怨是很难找到像*操作符这样整洁的东西。:)
- 是的,你怎么会事先知道怎么做?
- 如果您搜索"python apply"并阅读其中的文档,它会指出其中的语法。""应用"以这种方式在许多语言中使用。
- 这就是为什么了解许多语言如此重要的原因:你不需要找出一种特定语言拥有哪些很酷的特性,而需要找出哪些特性是缺失的,或者以不同的方式完成的!
- @加里:完成教程。
- @Justinardini是的,所以这就是为什么浏览指导文档很好的原因。这应该是学习Python的第一步。
- @Justinardini我相信TCL,一个非常类似的特性被称为"参数扩展操作符"。
1
| function_that_needs_strings(*my_list) # works! |
你可以在这里读到所有关于它的信息。
- -1假设你的csvfile是csv.writer对象,那么它的writerow方法只有一个参数。函数/方法调用中的*args只是写入arg[0], arg[1], ...的一种短方法。函数或方法必须能够处理您提供的参数。*args不是覆盖函数/方法arg声明的voodoo。只有当len(my_list) == 1时,您的示例才"有效"。这是我见过的最糟糕的加达伦反对案。
- @约翰:你没抓住问题的关键。我刚从问题的第一个修订版中复制了这个函数——但我只是为你修改了它。
- @THC4K:我很清楚这个问题的要点。从何处复制部分答案无关紧要。我的观点是你回答的第一句话是荒谬的错误。
- 然后,我在此声明,你是错误的,"假设你的csvfile是csv.writer对象":p我不明白这个讨论的重点。
- 是的,@thc4k得到了正确的答案-我不擅长第一次在问题中发布错误的函数…
是的,您可以使用*args语法:
1
| function_that_needs_strings(*my_list) |
其中my_list可以是任何一个iterable;python将在给定的对象上循环,并使用每个元素作为函数的单独参数。
请参阅调用表达式文档。
还有一个关键字参数等效,使用两个星:
1 2
| kwargs = {'foo': 'bar', 'spam': 'ham'}
f(**kwargs) |
在函数签名中指定catch all参数的语法是等效的:
1 2
| def func(*args, **kw):
# args now holds positional arguments, kw keyword arguments |
由于python 3.5,您可以无限量地解包lists。
PEP 448-其他解包概括
所以这是可行的:
1 2 3
| a = ['1', '2', '3', '4']
b = ['5', '6']
function_that_needs_strings(*a, *b) |
- 我如何使用Python2.7或3.4呢?
- @寻找答案者效率不高,但function_that_needs_strings(*(a+b))。