首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >用来表示可重复多次迭代的Iterable的pythonic方法是什么?

用来表示可重复多次迭代的Iterable的pythonic方法是什么?
EN

Stack Overflow用户
提问于 2020-07-26 11:24:54
回答 2查看 775关注 0票数 11

我想获得您关于用python以类型提示表示以下函数的最python方式的建议:

我希望将函数公开为接受输入参数并返回输出的库的一部分。输入参数的合同应该是:

我的函数可以迭代它,reference)

  • it's,

  • ,如果我的函数保持对输入的引用(例如,返回一个保持该 ok的对象来迭代输入不止一次)

一个例子可能是一个函数,它接受一个URL序列,然后向这些URL发出请求,可能会使用一些重试逻辑,因此我必须多次迭代原始序列。但我的问题比这个例子更笼统。

乍一看,一个合适的签名是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from typing import Iterable

def do_sth(input: Iterable[str]) -> SomeResult:
  ...

然而,这违反了第三个需求,因为在python中,不能保证您可以多次迭代一个Iterable,例如,因为迭代器和生成器本身就是可迭代的。

另一种尝试可能是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from typing import Sequence

def do_sth(input: Sequence[str]) -> SomeResult:
  ...

但是,Sequence契约超出了我的函数所需的范围,因为它包括索引访问和长度知识。

我想到的一个解决方案是使用Iterable签名,然后在内部复制输入。但是,如果源序列很大,这似乎会带来潜在的内存问题。

对此是否有解决方案,即python是否知道Iterable的概念,即每次返回一个新的迭代器?

EN

回答 2

Stack Overflow用户

发布于 2022-03-29 13:11:10

我可以想出两种自然的方法来表达这一点。

首先是使用Iterable[str],并在文档中提到,不应该使用IteratorGenerator对象,因为您可能有多个对__iter__的调用。Iterable的全部要点是,您可以在它上获得一个迭代器,而且可以说,首先使Iterator支持Iterable是一个错误。它不是完美的,但很简单,这通常更多的是“琵琶”,而不是一个技术上更正确的注释,这是非常复杂的。

您可以添加一些运行时检查,这些检查将提醒用户,如果他们传递了错误的东西,就会出现问题:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
iter1 = iter(input)
for item in iter1:
    do_something(item)
iter2 = iter(input)
if iter2 is iter1:
    raise ValueError("Must pass an iterable that can be iterated multiple times. Got {input}.")

或者检查是否有Iterator,并使用内存惩罚来处理它:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if isinstance(input, Iterator):
    input = list(input)  # or itertools.tee or whatever
    warn("This may eat up a lot of memory")

另一种选择是使用io.TextIOBase。这可以通过寻求开始重复多次。这取决于您的用例,可能不是很合适。如果输入在概念上是字符序列上的某种块视图,则io流是一个很好的匹配,即使迭代器在技术上不返回文本行。如果它在概念上是一个不连续的字符串序列,那么流就不是一个很好的匹配。

票数 1
EN

Stack Overflow用户

发布于 2022-11-14 16:17:50

您可以使用不接受输入并返回可迭代的函数。在输入提示方面,您将使用Callable

在文档中,如果您不熟悉Callable

需要特定签名的回调函数的

框架可以使用Callable[[Arg1Type, Arg2Type], ReturnType]进行类型提示。

解决方案:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from typing import Callable, Iterable

def do_sth(get_input: Callable[[], Iterable[str]]) -> SomeResult:
    # ...
    pass

def main():
    do_sth(lambda : (str(i) for i in range(10)))

我的函数可以迭代它

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def do_sth(get_input: Callable[[], Iterable[str]]) -> SomeResult:
    for item in get_input():
        pass

如果我的函数维护对输入的引用(例如,通过返回保存该引用的对象),这是可以的。

为什么不呢。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def do_sth(get_input: Callable[[], Iterable[str]]) -> SomeResult:
    return dict(reference=get_input)

可以多次迭代输入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def do_sth(get_input: Callable[[], Iterable[str]]) -> SomeResult:
    for i in range(10**82):
        for item in get_input():
            pass
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63104689

复制
相关文章
盘点JavaScript中的Iterable object(可迭代对象)
可迭代(Iterable) 对象是数组的泛化。这个概念是说任何对象都可以被定制为可在 for..of 循环中使用的对象。
前端进阶者
2021/09/10
1.7K0
盘点JavaScript中的Iterable object(可迭代对象)
探索Python中的迭代器(Iterator)和可迭代对象(Iterable)
在Python编程中,迭代器(Iterator)和可迭代对象(Iterable)是两个重要的概念。它们为我们提供了一种简洁而有效的方式来处理数据集合,同时也是深入理解Python语言内部机制的关键。本文将深入探讨迭代器和可迭代对象的概念、工作原理以及在实际代码中的应用。
疯狂的KK
2023/10/08
3260
探索Python中的迭代器(Iterator)和可迭代对象(Iterable)
Python中的迭代协议(iteration protocol)和可迭代对象(iterable)的概念
在Python中,迭代是一种非常常见的操作,它允许我们遍历数据集合中的每个元素。为了实现迭代功能,Python引入了迭代协议(iteration protocol)和可迭代对象(iterable)的概念。本文将详细解释这两个概念,并给出相应的代码示例。
疯狂的KK
2023/08/03
3590
Python中的迭代协议(iteration protocol)和可迭代对象(iterable)的概念
[Python]生成器generator,可迭代Iterable和迭代器Iterator
[Python]生成器generator,可迭代Iterable和迭代器Iterator
祥知道
2020/03/10
7010
迭代(iterable)和迭代器
简介: 迭代(iterable) #任何可迭代对象都可以作用于for循环,包括我们自定义的数据类型,只要符合迭代条件,就可以使用for循环 d = {'a': 1, 'b': 2, 'c': 3} #对dict迭代 for k,v in d.
狼啸风云
2020/07/06
8530
精读《迭代器 Iterable》
本周精读的文章是 Iterables 与 Iteration protocols,按照为什么需要迭代器、迭代器是如何设计的,我们还能怎么利用迭代器展开来讲。
黄子毅
2022/11/21
2730
Python 迭代器 - Iterable对象
迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
Devops海洋的渔夫
2019/06/02
2.1K0
一文彻底搞懂Python可迭代(Iterable)、迭代器(Iterator)和生成器(Generator)的概念
在Python中可迭代(Iterable)、迭代器(Iterator)和生成器(Generator)这几个概念是经常用到的,初学时对这几个概念也是经常混淆,现在是时候把这几个概念搞清楚了。
阳仔
2019/08/01
6.1K0
[Python]迭代和对象的可迭代性
Python文档整理目录: https://blog.csdn.net/humanking7/article/details/80757533
祥知道
2020/03/10
1.1K0
【前端】iterable类型的 forEach方法
zhaokang555
2023/10/17
880
on方法多次绑定会多次执行的解决方法
当重复使用on方法为一个元素绑定事件时,这个事件不会覆盖而是会叠加; 例如 for(var i=0;i<5;i++) $('#test').on('click',function(){ console.log(1); }) 这样的话,只要点击test元素,将会在控制台生成5个1 解决方法为遇到这种情况需要在每次绑定事件之前,对该事件解绑,也就是 $(“#test”).off(“click”); ,off方法解绑。
仙士可
2019/12/18
1.1K0
【Java】Collection遍历使用Iterable迭代器
package com.example.demo.test; import java.util.Arrays; import java.util.Iterator; import java.util.List; /** * @Author bennyrhys * @Date 9/1/21 11:48 PM * Iterable随机数生成器 */ public class RandomString<T> implements Iterable{ private final List<T
瑞新
2021/12/06
4690
Python可迭代的对象与迭代器的对比
什么是迭代?迭代是指按需一次获取一个数据。是否可以迭代,可以通过是否可以使用for循环取值来进行简单的判断。更准确的判断是使用iter()函数,这是一个Python内置函数。
dongfanger
2021/11/30
1.6K0
MySQL 的可重复读
我在这里分享一篇关于 MySQL 的可重复读介绍,讲得挺好的,可以解决一些疑惑,链接在下方引用处。
RendaZhang
2020/09/08
1.8K0
MySQL 的可重复读
可迭代对象、迭代器、生成器的理解
该文章介绍了如何利用Python的yield关键字、生成器表达式、迭代器协议和自定义类实现一个简单的生成器。生成器是一种特殊的迭代器,它可以用来生成一系列值,并且可以在需要时动态生成值。生成器可以通过yield关键字来暂停和恢复其执行状态,这样可以避免重复生成值。生成器还可以通过生成器表达式来创建,它可以用来生成一个不可变的序列。
coders
2018/01/04
1.2K0
可迭代对象、迭代器、生成器的理解
java中Iterable接口的使用,实现一个单链表的迭代器
Iterable接口中需要实现的抽象方法iterator()的返回值会返回一个迭代器对象,这个迭代器对象可以作为一个工具来遍历集合类中的对象。此外,迭代器更是设计模式,如对图的遍历可以实现一个图迭代器,简化代码,将遍历的思想抽象出来。
lexingsen
2022/02/24
5950
java中Iterable接口的使用,实现一个单链表的迭代器
后端处理高并发状态的多次重复请求
  相信做Web的,都有可能遇到有多次重复请求发送到后端的情况。而这些重复请求,可能大都是由于在网络较差的情况下,用户多次连续点击。最后导致后端面临处理大量重复请求的境地。阻止这些情况发生的方法有很多。   比如在前端,可以设置当用户点击按钮之后,禁用按钮直到有结果返回。如果是用ajax发送请求,那么在发送请求之前,可以调用XMLHttpRequest的abort()函数,abort 函数是清除上一个XMLHttpRequest 重置为 readyState 为 0 的状态,并且取消所有未决的网络活动,等等
ShenduCC
2018/04/27
3.6K0
Pythonic:递归、回溯等5种方法生成不重复数字整数
问题描述:从0到9这10个数字任选3个不重复的数字,能构成哪些三位数? So easy!看到这样的问题,很多人会写出类似(注意,只是类似,我为了使得本文几个函数具有相同的调用形式,给demo1和demo2加了点多余的东西)下面这样的代码: def demo1(data, k=3): '''从data中选择不同的3个数字组成三位数''' assert k == 3, 'k must be 3' for i in data: if i == 0:continue ii = i*100
Python小屋屋主
2018/04/16
1.2K0
点击加载更多

相似问题

在可迭代中跳过项的Pythonic方法?

31

可以多次迭代的iterable的Python名称

211

Pythonic可迭代差分

31

迭代字典和列表的Pythonic方法是什么?

52

Pythonic复制可迭代对象的方式

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文