代码笔记:
'''
可迭代对象(Iterable):
遍历:依次从可迭代对象中取出元素的过程。
可迭代对象的条件:
1.实现了__iter__()方法
2.__iter__()方法返回了迭代器对象
for循环的工作原理:
1.先通过__iter__()获取迭代器对象的迭代器
2.再对迭代器不断调用__next__()方法获取下一个值并赋值给临时变量(i)
isinstance(o,t):判断一个对象是否是已知类型。o:object(对象名),t(type):类型。
'''
from collections.abc import Iterable # 导入模块
i = [1, 2, 3]
b = 'abcd'
print(isinstance(b, Iterable))
it = iter(i) # 创建一个迭代器对象(Iterator)
print(next(it)) # 取下一个元素
print(next(it))
print(next(it))
# print(next(it)) # 取出所有元素后,使用next()方法会引发StopIteration异常
'''
可迭代对象(Iterable):可以作用于for循环。
迭代器对象(Iterator):可以调用next()方法。
注意:迭代器对象一定是可迭代对象;可迭代对象可以使用iter()方法强制转换为迭代器对象。
'''
from collections.abc import Iterator, Iterable
c = 'python'
print(isinstance(c, Iterable)) # 判断是否为可迭代对象
print(isinstance(c, Iterator)) # 判断是否为迭代器对象
c1 = iter(c)
print(isinstance(c1, Iterable)) # 判断是否为可迭代对象
print(isinstance(c1, Iterator)) # 判断是否为迭代器对象
for i in range(1, 7):
print(c1.__next__(), end='\t')
print('\n', dir(c1))
'''
自定义迭代器类:必须具备__iter__()方法和__next__()方法。
'''
class MyIterator(object):
def __init__(self): # 构造函数:赋初始值
self.num = 0 # 实例属性
def __iter__(self):
return self # 返回当前迭代器类的实例本身
def __next__(self):
if self.num == 10: # 当num=10时停止调用__next__()方法并抛出异常
raise StopIteration("停止迭代") # 抛出异常
self.num += 1
return self.num
mi = MyIterator() # 实例化对象(实例化的对象为迭代器对象)
print(isinstance(mi, Iterator))
for i in mi:
print(i, end=' ')
'''
生成器(generator):Python中,边循环边计算的机制叫生成器。
实现方法:生成器表达式和生成器函数。
'''
li = [i * 5 for i in range(5)] # 列表推导式
gen = (i * 5 for i in range(5)) # 生成器表达式
print(li)
print(gen)
for i in range(5):
print(gen.__next__())
'''
生成器函数是一种特殊类型的函数(迭代器),它通过 yield 关键字返回值,并能够在每次调用时保留函数的状态。
与普通函数一次性返回所有值不同,生成器函数可以按需生成序列中的值,节省内存和计算资源。
含义:
懒惰求值:生成器按需生成数据,只有在需要时才计算下一个值。
状态保持:生成器在每次调用 next() 时会从上一次暂停的地方继续执行,保持内部状态。
'''
def gen():
yield 'a'
yield 'b'
yield 'c'
gen_1 = gen()
a = 0
while a < 3:
print(a, gen_1.__next__())
a += 1
def gen2(n):
li = []
a = 0
while a < n:
li.append(a)
yield a
a += 1
print(li)
for i in gen2(5):
print(i)
运行结果:
True
1
2
3
True
False
True
True
p y t h o n
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__length_hint__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__']
True
1 2 3 4 5 6 7 8 9 10 [0, 5, 10, 15, 20]
<generator object <genexpr> at 0x000001586B7B5510>
0
5
10
15
20
0 a
1 b
2 c
0
1
2
3
4
[0, 1, 2, 3, 4]
Process finished with exit code 0