Python生成器(generator)与迭代器(iterator)
Python生成器(generator)与迭代器(iterator)
一、列表生成式和生成器
1.列表生成式
list comprehension:
系统内置的用于创建list的方式
range(start,end,step)缺点:生成的列表一般情况下都是等差数列
代码演示:
# 生成列表 l = [1,2,3,4] l = list(range(1,6)) l = [] for i in range(1,6): l.append(i) # 列表生成式/列表推导式 l = [i for i in range(1, 6)] # [1, 2, 3, 4, 5] l = [i*i for i in range(1, 6)] # [1, 4, 9, 16, 25] l = [i for i in range(1,6) if i%2] # [1, 3, 5] l = [i for i in range(1,6) if i%2 and i > 2] # [3, 5] l = [i for i in range(1,6) if i%2 if i<5] # [1, 3] l = [i+j for i in '123' for j in 'abc'] # ['1a', '1b', '1c', '2a', '2b', '2c', '3a', '3b', '3c'] print(l) l1 = [1,2,3,4,5] l2 = [i*10 for i in l1] # [10, 20, 30, 40, 50] print(l2) # 字典生成式 d = {i:i+1 for i in range(5)} print(d) # 集合生成式 s = {i*i for i in range(5)} print(s) # {0, 1, 4, 9, 16}
2.生成器
generator:顾名思义,生成器就是不断生出新的数据供使用,优点就是使用就生成,不使用不生成也不占内存,一般用于超多或者无穷多的数
next():配合generator一起使用,实现迭代功能
yield:
1.写在函数中,会让函数变成生成器函数
2.每次使用next调用,会在yield暂停
3.类似return,可以返回值,但是不会结束函数。
代码演示:#生成器 #方式一:(),将列表生成式中的[]改成() #列表生成式的类型是list,生成器的类型是generator【当做一种新的数据类型】 r1 = (x ** 2 for x in range(1,6)) print(r1) #(1,4,9,16,25) print(type(r1)) """ for i in r1: print(i) """ #生成器区别于列表生成式:可以使用next遍历,每调用一次则获取一个元素 #next() print(next(r1)) print(next(r1)) print(next(r1)) print(next(r1)) print(next(r1)) #注意:当生成器中的元素全部获取完成之后,接着调用next函数的,则会出现StopIteration #print(next(r1)) #StopIteration异常 #方式二:yield---->让步 #(x for x in range(1,6))----->1,2,3,4,5 def test(n): for i in range(1, n + 1): #执行到yield的时候,则函数会停止,将yiled后面的变量返回,若无则返回空值 yield i ** 2 #yield后面的代码的执行时机:当调用next函数的时候,但next函数调用后再次碰到yield就停止 print(i) t = test(5) print(t) #<generator object test at 0x0000019CC432A1A8> print(next(t)) print(next(t)) print(next(t)) print(next(t)) print(next(t))
二、迭代器
1.可迭代对象
可迭代对象【实体】:可以直接作用于for循环的实体【Iterable】
可以直接作用于for循环的数据类型:
a.list,tuple,dict,set,string
b.generator【() 和yield】
isinstance:判断一个实体是否是可迭代的对象
代码演示:
#一、可迭代对象 #1.导入 from collections import Iterable #2.使用isinstance(数据,Iterable) print(isinstance([],Iterable)) print(isinstance((),Iterable)) print(isinstance({},Iterable)) print(isinstance((x for x in range(10)),Iterable)) print(isinstance("hello",Iterable)) print(isinstance(10,Iterable)) #False print(isinstance(True,Iterable)) #False print("****88")
2.迭代器
不但可以作用于for循环,还可以被next函数遍历【不断调用并返回一个元素,直到最后一个元素被遍历完成,则出现StopIteration】
目前为止,只有生成器才是迭代器【Iterator】
结论:迭代器肯定是可迭代对象,但是,可迭代对象不一定是迭代器
isinstance:判断一个实体是否是迭代器
代码演示:
#二、迭代器 from collections import Iterator from collections import Iterable # isinstance():示例/对象 判断某个对象是否属于某多个类 print(isinstance(10, int)) # True print(isinstance(10, (int,float,str))) # True print(isinstance([], Iterable)) # True print(isinstance((), Iterable)) # True print(isinstance({1}, Iterable)) # True print(isinstance('ab', Iterable)) # True print(isinstance([],Iterator)) #False print(isinstance((),Iterator)) print(isinstance({},Iterator)) print(isinstance("hello",Iterator)) print(isinstance((x for x in range(10)),Iterator)) #True print("****88")
3.可迭代对象和迭代器之间的转换
可以将可迭代对象转换为迭代器:iter()
代码演示:
#三、虽然list、tuple、dict、set、string都不是迭代器 #iter():将list、tuple、dict、set、string的 Iterable转换为Iterator print(isinstance(iter([]),Iterator)) print(isinstance(iter(()),Iterator)) print(isinstance(iter({}),Iterator)) print(isinstance(iter("hello"),Iterator))
总结:
a.凡是可以作用于for循环的对象都是Iterable类型
b.凡是可以作用于next函数的对象都是Iterator类型
c.list/tuple/dict/set/string都不是Iterator,可以通过iter()获得一个Iterator对象
下一篇: leetcode 125.验证回文串