我遇到了一个项目问题,后来才能成功完成它。但是,在运行其他人编写的代码时,我注意到他们能够在join-function中使用迭代器(for
循环)。
示例:
' '.join(x for x in name.split('*'))
我认为这很棒,因为它帮助我减少了原始草稿中的代码行。
所以我的问题是:是否有任何文档包含接受迭代器的函数列表?
答案 0 :(得分:0)
他们称之为生成器,他们在许多接受list
或tuple
的地方工作。所有三个的通用术语是 iterable 。但这取决于相关代码的作用。如果它只是迭代,那么生成器将工作。如果它试图通过索引获取len()
或访问项目,则会赢得
没有接受生成器或迭代的函数列表,没有;没有人以这种方式组织文件。
答案 1 :(得分:0)
从技术上讲,示例中str.join()
的参数称为"生成器表达式"。生成器表达式演变为可迭代对象
- 请注意,iterable不一定是迭代器(但迭代器是可迭代的)。
我认为你的问题确实是关于"接受生成器表达式的函数"。如果是,答案如上:任何期望迭代的函数,因为参数在传递之前是eval,所以在实际调用函数之前,生成器表达式变为可迭代的。
请注意,在迭代和"序列类型之间存在区别" (字符串,元组,列表,集等):后者确实是可迭代的,但是它们也有一些其他的特征(即它们通常有一个长度,可以多次迭代等)所以不是全部期望序列的函数将与非序列迭代器一起使用。但这通常是记录在案的。
答案 2 :(得分:0)
我可能会在这里弄错,但我认为你在迭代器中的意思实际上是在python中被称为列表理解。这并不是说有问题的列表理解不会返回一个可迭代的,但似乎你不是因为你可以将一个iterable传递给join函数,而是你可以把什么似乎是流量控制内联。再说一遍,告诉我,我是否错了。
列表推导可以采用元组(返回生成器)或列表(返回列表)的形式。要查看这两者之间的区别,请在python shell中键入以下内容:
>>> (x for x in 'cool')
<generator object <genexpr> at 0x03980990>
>>> [x for x in 'cool']
['c', 'o', 'o', 'l']
我认为很明显如何使用列表,但如果您想了解有关生成器如何工作的更多信息,您可能需要check this out。
此外,乐趣并没有以列表理解结束。可能性是无穷无尽的。
>>> [x for x in [1,5,4,7,8,2,6,3] if x > 3]
[5, 4, 7, 8, 6]
>>> [(x,y) for x in range(3) for y in range(3)]
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
要了解有关列表推导的更多信息,请try here。