Python学习之路(九):基础知识之迭代器及生成器

一、迭代器

迭代器用来遍历列表,字符串,元组等可迭代对象

print(dir(str)) :dir查看xx类型的数据可以执行那些方法 __iter__

print(dir(list))

可迭代对象可以使用__iter__()来获取迭代器

1.可以通过dir来判断数据是否可迭代,以及数据是否可迭代

1 lst = ['a', 'b', 'c', 'd']
2 it = lst.__iter__()
3 print('__iter__'in dir(it))
4 print('__next__' in dir(it))
5 # 结果:True
6 #      True
# 官方方案判断迭代器和可迭代对象
"""
lst = ['a', 'b', 'c', 'd']
it = lst.__iter__()

from collections import Iterable  # 可迭代对象
from collections import Iterator  # 迭代器

print(isinstance(lst, Iterable))
print(isinstance(lst, Iterator))

print(isinstance(it, Iterable))
print(isinstance(it, Iterator))

2.获取可迭代对象中的内容

迭代器里面有__next__(),用来获取可迭代对象中的内容,每执行一次取一次。

1 s = '黑的白的红的蓝的紫的'
2 it= s.__iter__()  #  获取迭代器
3 print(dir(it))
4 print(it.__next__())
5 print(it.__next__())
6 print(it.__next__())
7 # 结果:黑
8 #
9 #

3.通过迭代器实行for循环

for循环的内部机制:

   1.首先获取迭代器

   2.使用while循环获取数据

   3.it.__next__()来获取数据

   4.处理异常 try:xxx except StopIteration

1 lst = ['a', 'b', 'c', 'd']
2 it = lst.__iter__()
3 while 1:
4     try:
5         el = it.__next__()
6         print(el)
7     except StopIteration:
8         break

4.迭代器的特点:

1.只能向前

2.惰性机制

lst = ['a', 'b', 'c', 'd']
it = lst.__iter__()  # 在取值时一次取一个
s = list(it) # 在list中存在for,一定存在__next__()
print(s)
结果:['a', 'b', 'c', 'd']

3.省内存

二、生成器

1.生成器定义

def func():
    print('w')
    yield 1
    print('r')


gen = func()  # 不会执行函数,拿到的是生成器
ret = gen.__next__()  # 会执行到下一个yield
print(ret)
gen.__next__()  # 此时没有yield,报错,认为迭代器中的yield执行完毕
函数中如果有yield,这个函数就是生成器函数,生成器函数名()就是获取生成器,这个时候不执行函数
yield:相当于return可以返回数据,但是yield不会彻底终中断函数,而是分段执行函数
gen.__next__()执行函数,执行到下一个yield时停止,

生成器中需存在yield来达到分段执行该函数的效果,与return不同,遇到return会停止执行该函数,接受到的是返回值,而yield返回迭代器

2.生成器的作用

生成器能够延迟函数体的操作,在必需的时候才产生结果,如果函数体执行内容过多,立即产生结果会产生大量数据占用内存,使用生成器可以节省内存。

1 def order():
2     for i in range(10000):
3         yield '衣服'+str(i)
4 clothes = order()
5 clothe = clothes.__next__()  # 没执行一次next,才会执行一次函数体
6 print(clothe)

3.send方法

send()和__next__()是一样的,可以执行到下一个yield,但send()可以给上一个yield返回一个值

 1 def func():
 2     print('我是第一个')
 3     a = yield 123
 4     print(a)
 5     print('石头')
 6     b = yield 456
 7     print(b)
 8     print('沙子')
 9     c = yield 789
10     print(c)
11     print('砂石')
12     yield 777
13 
14 
15 g = func()
16 print(g.__next__())  # 第一个yield,不存在上一个yield
17 print(g.send('肉包子'))  # send必须给参数,将”肉包子“传给yield,然后yield将值给a
18 print(g.send('煎饼'))
19 print(g.send('锅包肉'))
20 # 结果:
21 我是第一个
22 123
23 肉包子
24 石头
25 456
26 煎饼
27 沙子
28 789
29 锅包肉
30 砂石
31 777

4.yield from

yield from可以将可迭代对象中的元素作为生成器的结果返回:

1 def func():
2     lst = ['Kobe', 'CP3', 'AI', 'LBJ']
3     yield from lst
4 g = func()
5 for i in g:
6     print(i)

猜你喜欢

转载自www.cnblogs.com/Studying-Du/p/12356446.html