一、生成式与生成器
可以把迭代器看成一种容器,类似列表。生成器就是来生成迭代器。
if __name__ == '__main__':
# 1.生成式 ---- 产生一个迭代器的表达式
# a是生成器,能够生成0-9中的所有的数字
a = (x for x in range(10))
print(a, type(a))
a0 = (x*2 for x in range(10))
a1 = (char for char in 'hello world')
a2 = (char for char in 'h0el761lo p2yt3ho4n902' if '0'<=char<='9')
#2.生成器和迭代器都是通过next来获取里面的数据
print(next(a))
print(next(a))
print(next(a))
print(next(a))
print('=======')
for x in a:
print(x)
# 3.将生成器转换成列表
# 通过将生成式产生的迭代器转换成了一个列表
list1 = [x for x in range(10)]
print(list1)
# 4.将生成器转换成字典
# 注意:容器类型的元素是元祖,并且元素中有且只有两个元素的,才能转换成字典
dict1 = dict((x, x*2) for x in range(5)) # {0: 0, 1: 2, 2: 4, 3: 6, 4: 8}
print(dict1)
# 练习:一句代码实现交换一个字典中的key和value的值. {'a':1, 'b':2} --> {1:'a', 2:'b'}
dict2 = dict((value, key) for key,value in {'a': 1, 'b': 2, 'c': 3}.items())
old = {'a': 1, 'b': 2, 'c': 3}
dict3 = dict((old[key], key) for key in old)
print(dict3)
二、生成器
if __name__ == '__main__':
def func1():
for x in range(10):
return x
# 0 <class 'int'> < class 'function' >
print(func1(), type(func1()), type(func1))
1.yield关键字
只要函数中有yield关键字,那么这个函数就会变成一个生成器。
a.有yield的函数,在调用函数的时候不再是获取返回值,
而是产生一个生成器对象,生成器对象中保留的是函数体。
b.当通过next获取生成器中的数据的时候,才会去执行函数体,执行到yield为止,
并且将yield后面的结果作为生成的数据返回。同时记录结束的位置,下次再调用next的时候,
从上次结束的位置接着往后执行。
def func2():
print('abc')
for x in range(10):
yield x
print('aaa')
# 注意:函数中只要有yield,不管yield会不会执行到,函数的调用结果都是生成器
def func3(x):
print('abc')
if x > 10:
yield 100
return 20
# print(func2(), type(func2()), type(func2))
# 这儿的func2()是一个生成器
gen = func2()
print(next(gen))
print(next(gen))
print(next(gen))
gen2 = func3(1)
print(gen2)
练习:写一个生成器,可以产生斐波那契数列(可以无限生成)
# 1,1,2,3,5,8,13,21,34....
def sequence():
yield 1
yield 1
x = 1
y = 1
while True:
yield x + y
x, y = y, x+y
se = sequence()
print(next(se))
print(next(se))
print(next(se))
print(next(se))
print(next(se))
print(next(se))
print(next(se))
print(next(se))
print(next(se))
print(next(se))
2.生成器和生成式产生的对象就是迭代器
将列表转换成迭代器对象
迭代器(iter)
iter1 = iter([1, 2, 3, 4])
print(iter1)
print(next(iter1))
print(next(iter1))
for item in iter1:
print(item)
三、迭代器
1.什么是迭代器(iter)
迭代器是python中一种容器类的数据类型。属于序列。没有具体的字面量,可以将其他的序列转换成迭代器:iter(序列)
2.迭代器的特点
只能通过next方法去一个一个按顺序获取迭代器中的元素,取出后迭代器中就不存在这个元素了
iter1 = iter('abcd')
print(iter1)
print(next(iter1))
print(next(iter1))
for x in range(5):
print(x)
print(next(iter1))
print(next(iter1))
# print(next(iter1)) # StopIteration
3.遍历迭代器
iter1 = iter(['abc', 10, 'name'])
print('=====')
for x in iter1:
print(x)
print('====')
# print(next(iter1))
next(迭代器)
迭代器.next()
iter2 = iter((1, 2, 3))
a = iter2.__next__()
print(a) # 1
list1 = list(iter2)
print(list1) # [2, 3]
网友评论