【python学习】python迭代器和生成器

中国史之【伯益让国】:
启继禹位的另一种说法为伯益让国。相传发明凿井技术的伯益,因治水有功,被禹选为继承人。但禹死后,民意属启,于是伯益禅让于启,并隐居到至箕山南麓。亦有一说,大禹生前即暗中要求启厚植实力以取代伯益。
-来源:全历史APP

今天讲python的迭代器和生成器。有需要的也可以直接去我的github查看全部笔记:

https://github.com/JackKoLing/python_notes_with_ten_days
在这里插入图片描述
俗话说:“好记性不如烂笔头”,多写写多记记,总不会错。多一些不为什么的坚持,少一些功利主义的追求。对于环境的配置,可以参考以下两篇:

1 python迭代

  • 迭代的概念在工科是非常常见的。所谓的迭代,就是重复做一件事。
  • 如果某个对象,在其内部实现了__iter__()或__getitem__()的方法,则其为可迭代对象
  • 可迭代(iterable)对象支持每次返回自己所包含的一个成员的对象,也就是可遍历对象
  • 上一篇介绍的列表解析就是python迭代机制的一种应用
(1)可迭代对象包括:
  • 序列类型:list, str, tuple
  • 非序列类型:dict, file
  • 用户自定义包含__iter__()或__getitem__()方法的类
(2)for循环可用于任何可迭代对象:
  • for循环开始时,会通过迭代协议传递给iter()内置函数,从而能够从可迭代对象中获得一个迭代器,返回的对象含有需要的__next__()方法
l1 = [1, 2, 3]
print(dir(l1)) # 可以看到含有iter、getitem的方法,所以是可迭代对象
>>>
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', 
'__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', 
'__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', 
'__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', 
'__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', 
'__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 
'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
i1 = l1.__iter__()
print(i1)  # 返回一个迭代器对象,每次使用循环时,系统自动创建迭代器,来遍历每个元素
print(i1.__next__())
print(i1.__next__())
print(i1.__next__()) # 注意:迭代器不可逆,要想再迭代就要创建新的迭代器
>>>
<list_iterator object at 0x000001449EEA60B8>
1
2
3

2 迭代器

  • 迭代器(iterator),又称为游标(cursor),它是程序设计的软件设计模式,是一种可在容器(container)上实现元素遍历的接口
  • 迭代器是一种特殊的数据结构,也是以对象的形式存在
  • 简单的理解就是:迭代器定义了遍历可迭代对象中的每个元素的顺序或方法
i2 = iter(l1) # 等价于 i2 = l1.__iter__()
print(i2.__next__())
print(i2.__next__())
print(i2.__next__())
>>>
1
2
3

3 生成器

  • 列表解析表达式是一次生成全部对象,如果没有使用到的对象就很占内存
  • 而生成器表达式是一次只生成一个对象,调用一次生成一次。使用“懒性计算”或称为“延迟求值”的机制
  • 其并不真正创建数字列表,而是返回一个生成器对象,此对象在每次计算出一个条目后,就“产生”(yield)出来
  • 序列过长,并且每次只需要获取一个元素时,应当考虑使用生成器表达式而不是列表解析
  • 生成器表达式的语法就是把列表解析的[]换成()
print((i**2 for i in range(1, 11))) # 注意返回的是生成器对象
g1 = (i**2 for i in range(1, 11))
print(g1.__next__())
print(g1.__next__())
print(g1.__next__())
print(g1.__next__())
>>>
<generator object <genexpr> at 0x000001449EE0CCF0>
1
4
9
16
for i in (i**2 for i in range(1, 11)):
    print(i//2)
>>>
0
2
4
8
12
18
24
32
40
50

(补充)
enumerate语句:

  • range可在非完备遍历中用于生成索引偏移,如range(1,100,2)
  • 若同时需要偏移的索引和偏移元素,则可以使用enumerate()函数,其内置函数返回一个生成器对象
  • 此函数用在for函数非常适用,既能获取索引位置,也能获取元素值。
url = "www.baidu.com"
g1 = enumerate(url) # 获取枚举的生成器
print(g1.__next__()) # 可以获取对象的索引以及元素本身
print(g1.__next__())
print(g1.__next__())
print(g1.__next__())
>>>
(0, 'w')
(1, 'w')
(2, 'w')
(3, '.')
for i,value in enumerate(url):
    if i < 4:
        print(i)
        print(value)
>>>
0
w
1
w
2
w
3
.

【声明】:学习笔记基于互联网上各种学习资源的个人整理。

以上是本期内容,下期介绍python文件对象的用法。

我叫小保,一名计算机视觉爱好者、学习者、追随者,欢迎关注我一起学习。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JackkoLing

感谢你的支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值