欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python生成器(generator)与迭代器(iterator)

程序员文章站 2022-07-01 17:10:29
...

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对象