[toc]
python基础十二 迭代器、生成器
1.迭代器
1.1 含义
一个一个取值
1.2 可迭代对象
#Python中规定,只要是具有__iter__()方法就是可迭代对象
str.__iter__()
list.__iter__()
tuple.__iter__()
dict.__iter__()
set.__iter__()
⚠️可迭代对象能够重复取值
1.3 迭代器使用示例
//使用示例1 将迭代器赋值给一个变量,这样就能重复取值了
可迭代对象能够重复取值
lst = [1,1,2]
将可迭代对象转换成迭代器
l = lst.__iter__()
print(l)
#结果:<list_iterator object at 0x7fc49811a0f0>,迭代器的内存空间地址
print(l.__next__()) #结果:1
print(l.__next__()) #结果:1
print(l.__next__()) #结果:2
print(1.__next__()) #结果:StopIteration 停止迭代,不能超过元素个数
⚠️有多少个元素就只能next多少次
//使用示例1 单独执行迭代器,这样每次只能取第一个值
lst = [1,1,2,4,5]
⚠️以下两个lst.__iter__()迭代器内存地址,mac中显示的是一样,win本有的一样,有的不一样!!!
print(lst.__iter__()) #<list_iterator object at 0x7fd0a80110f0>
print(lst.__iter__()) #<list_iterator object at 0x7fd0a80110f0>
print(lst.__iter__().__next__()) #结果:1 #lst.__iter__() 是一个迭代器1
print(lst.__iter__().__next__()) #结果:1 #lst.__iter__() 是一个迭代器1
⚠️这里迭代器是多个
1.4 for循环本质
⚠️⚠️⚠️for循环就是一个迭代器
s = "hehe"
for i in s:
print (i)
h
e
h
e
s = "hehe"
s1 = s.__iter__()
while True:
print (s1.__next__())
结果会报错如下:停止迭代
StopIteration
s = "hehe"
s1 = s.__iter__()
while True:
try: #尝试着运行一下缩进体中的内容,如果运行有问题用except接收一下
print (s1.__next__())
except StopIteration:
break
结果如下:
h
e
h
e
1.5 python3中迭代器用法
//python1和python2中迭代器共同用法
lst = ['a',1,2,4,5]
print (iter(lst))
print (iter(lst))
print (iter(lst).__next__())
print (iter(lst).__next__())
结果如下:
<list_iterator object at 0x7fe4e8071668>
<list_iterator object at 0x7fe4e8071668>
a
a
//python1中支持__iter__()方法
//python1中不支持 __next__()方法
2.生成器
2.1 生成器含义
控制循环迭代行为,一边循环一边计算的特殊程序
例如,创建一个包含100万元素的列表,不仅占空间。而且如果只访问前边几个元素,后续的元素空间就白白浪费了,生成器可以根据规则生成后续元素
2.2 生成器定义
1.基于函数实现的生成器 2.表达式实现生成器
2.3 生成器本质
生成器的本质就是一个迭代器
迭代器:文件句柄,通过数据转换,python自带提供
生成器:程序员自己实现
2.4 生成器使用示例
2.4.1 定义及创建生成器
#定义一个函数
def func():
print (1)
return 5
print (func())
1
5
⚠️函数题中存在关键字yield就是定义一个生成器
#定义一个生成器
def func():
print (1)
yield 5
print (func()) #⚠️这一步才算是创建一个生成器对象
<generator object func at 0x7f8df8127d00>
2.4.2 语法及词法
⚠️代码执行的时候有多个对象在工作
语法检查
词法检查
//示例1
def func():
print (foo)
返回结果为空
原因:
函数没有被调用,因此不报错
//示例1
def func():
if 2 > 1
结果:
SyntaxError: invalid syntax
原因:
首先进行语法检查,语法错误
//示例2
def func():
foo()
func()
结果:
报错,语法检查没有问题,但是词法检查有问题
2.4.3 生成器使用
2.4.3.1 生成器使用示例1
⚠️⚠️⚠️生成器最大特点:惰性机制
//示例1
def func():
yield 1 #记录执行位置,当第一次next的时候记录,第二次next的时候就开始从下边取值
yield 1
yield 2
g = func() #获取的是生成器的内存地址
print (next(g)) #取值 1
print (next(g)) #取值 1
print (next(g)) #取值 2
print (next(g)) #取值 会报错 StopIteration