中国史之【伯益让国】:
启继禹位的另一种说法为伯益让国。相传发明凿井技术的伯益,因治水有功,被禹选为继承人。但禹死后,民意属启,于是伯益禅让于启,并隐居到至箕山南麓。亦有一说,大禹生前即暗中要求启厚植实力以取代伯益。
-来源:全历史APP
今天讲python的迭代器和生成器。有需要的也可以直接去我的github查看全部笔记:
https://github.com/JackKoLing/python_notes_with_ten_days
俗话说:“好记性不如烂笔头”,多写写多记记,总不会错。多一些不为什么的坚持,少一些功利主义的追求。对于环境的配置,可以参考以下两篇:
- win10版 @小保,公众号:CV之道
【深度学习环境配置】手把手实战配置深度学习环境(win10版) - Linux版 @小保,公众号:CV之道
【深度学习环境配置】手把手实战配置深度学习环境(Ubuntu20.04版)
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文件对象的用法。
我叫小保,一名计算机视觉爱好者、学习者、追随者,欢迎关注我一起学习。
![](https://i-blog.csdnimg.cn/blog_migrate/37d6a533cafcd7c7f3a6d3d4d64ac915.png)