【问题标题】:Document of Functions that accept iterators接受迭代器的函数文档
【发布时间】:2018-01-17 14:00:00
【问题描述】:

我在一个项目上遇到了麻烦,后来成功地完成了它。但是,在运行其他人编写的一些代码时,我注意到他们能够在连接函数中使用迭代器(for 循环)。

示例:

' '.join(x for x in name.split('*')) 

我认为这太棒了,因为它帮助我减少了原始草稿中的代码行数。

所以我的问题是:是否有任何文档包含接受迭代器的函数列表?

【问题讨论】:

  • 如果你知道一个函数需要一个列表,假设它需要一个任意的迭代,直到证明不是这样。一类明显的例外是您知道就地修改列表的函数。
  • 注意到了。谢谢你的信息。

标签: python function iterator


【解决方案1】:

我在这里可能弄错了,但我认为迭代器的意思实际上在 python 中称为列表推导。并不是说有问题的列表推导不返回一个可迭代的,但似乎你印象深刻的不是你可以将一个迭代传递给连接函数,而是你可以把似乎是流动的东西控制内联。再说一次,如果我错了,请告诉我。

列表推导可以是元组(返回一个生成器)或列表(返回一个列表)的形式。要查看这两者之间的区别,请在 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

【讨论】:

  • 你说得对,这正是我印象深刻的原因。谢谢你的链接。
【解决方案2】:

它们被称为生成器,它们在许多接受lists 或tuples 的地方工作。这三个的通用术语是iterable。但这取决于相关代码的作用。如果它只是迭代,那么生成器将工作。如果它试图获取len() 或按索引访问项目,它不会。

没有接受生成器或迭代器的函数列表,不;没有人以这种方式组织文档。

【讨论】:

    【解决方案3】:

    从技术上讲,您示例中str.join() 的参数称为“生成器表达式”。生成器表达式评估为可迭代对象 - 请注意,可迭代对象不一定是迭代器(但迭代器是可迭代的)。

    我认为您的问题确实是关于“接受生成器表达式的函数”。如果是,答案就在上面:任何需要可迭代的函数,因为参数在被传递之前已经过评估,所以生成器表达式在函数被实际调用之前就变成了可迭代的。

    请注意,可迭代对象和“序列类型”(字符串、元组、列表、集合等)之间是有区别的:后者确实是可迭代的,它们也有一些其他特性(即它们通常有一个长度,可以迭代多次等)因此并非所有期望序列的函数都可以与非序列迭代器一起使用。但这通常会记录在案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-30
      • 2019-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-11
      相关资源
      最近更新 更多