当前位置: 首页 > 面试题库 >

chain(* iterable)与chain.from_iterable(iterable)之间的区别

汪丁雷
2023-03-14
问题内容

我对所有有趣的迭代器都非常着迷itertools,但是我感到困惑的是这两个函数之间的区别以及为什么chain.from_iterable存在。

from itertools import chain

def foo(n):
    for i in range(n):
        yield [i, i**2]

chain(*foo(5))

chain.from_iterable(foo(5))

两种功能有什么区别?


问题答案:

前者只能处理不可打包的迭代。后者可以处理无法完全解包的可迭代对象,例如无限生成器。

考虑

>>> from itertools import chain
>>> def inf():
...     i=0
...     while True:
...         i += 1
...         yield (i, i)
... 
>>> x=inf()
>>> y=chain.from_iterable(x)
>>> z=chain(*x)
<hangs forever>

此外,仅拆箱操作是一项急切的,前期成本高的活动,因此,如果您的迭代有效果,则希望懒惰地进行评估,这from_iterable是您的最佳选择。



 类似资料:
  • 遍历Array可以采用下标循环,遍历Map和Set就无法使用下标。为了统一集合类型,ES6标准引入了新的iterable类型,Array、Map和Set都属于iterable类型。 具有iterable类型的集合可以通过新的for ... of循环来遍历。 for ... of循环是ES6引入的新的语法,请测试你的浏览器是否支持: 'use strict'; var a = [1, 2, 3];

  • 我需要创建一个助手方法,该方法允许创建任何Iterable的和 然而,这种方法只适用于int,但我们也有double和long。因为不能有两个具有相同签名的方法(我们的编译器认为整数和(Iterable)) 但是这个方法不会编译(原因:操作符=是未定义的对象,对象)。我能在这里做什么?我知道在C中你可以重载运算符,但在Java中不行。但是每个扩展数字的类都会重载=运算符。我能在这里做什么? 提前谢

  • 问题内容: 我在互联网上找不到任何有效的示例,可以看到它们之间的区别以及为什么要选择一个而不是另一个。 问题答案: 第一个带有0个或多个参数,每个参数都是可迭代的,第二个带有一个参数,该参数有望产生可迭代的: 但可以是产生可迭代对象的任何迭代器: 使用第二种形式通常是方便的情况,但是由于它懒惰地遍历输入可迭代对象,因此这也是链接 无限 数量的有限迭代器的唯一方法: 上面的示例将为您提供一个可迭代的

  • 什么是迭代? 例子: for a in b.value(): pass for x, y in de.items(): pass 字符串也可以 for a in 'abcv': pass 如何判断是否可以迭代 请看代码 from collections import Iterable isinstance('abc', Iterable) True 这里就引出了

  • 本文向大家介绍对Python中Iterator和Iterable的区别详解,包括了对Python中Iterator和Iterable的区别详解的使用技巧和注意事项,需要的朋友参考一下 Python中 list,truple,str,dict这些都可以被迭代,但他们并不是迭代器。为什么? 因为和迭代器相比有一个很大的不同,list/truple/map/dict这些数据的大小是确定的,也就是说有多少

  • 我已经用MapStruct 1.1工作了几天,但还没有达到我所需要的。 我想做的是:我想将JPA实体映射到DTO,以便在Primefaces项目中实现更好的属性视图绑定。 所以我有我的实体如下: 病人JAVA 人JAVA 我想把这些实体画成这样: 耐心等待。JAVA 潘松多。JAVA 我编写了Mapper类和一个实用程序,就像GitHub上的官方示例中描述的那样(https://github.co