列表推导式
基本语法
[x for i in xxx]
实例1
# 生成一个["data0","data1",..."data99"]的列表
list1=["data{}".format(i) for i in range(100)]
print(list1)
实例2
# 生成一个["data1","data3",..."data99"]的列表
# 推导式结合if 进行过滤的语法:[x for i in xxx if 条件]
list2=[f"data{i}" for i in range(100) if i % 2 == 1]
print(list2)
实例3
# 生成一个["data0","musen1","data2","musen3",..."data98","musen99"]的列表
# 推导式结合三目运算符的语法:[v1 if 条件 else v2 for i in xxx]
list3 = [f"data{i}" if i % 2 == 0 else f"musen{i}" for i in range(100)]
print(list3)
字典推导式
基本语法
{key,value for i in xxx}
实例1
# 把一个列表转换为一个元素下标为键,值为元素值的字典格式的数据 list1=["a","b","c","d"]
list1=["a","b","c","d"]
dict1 = {key: value for key, value in enumerate(list1)}
print(dict1)
实例2
# 把下面的字符串转换成字典格式的数据
cookie="BIDUPSID=D072753da;PSTM=15459GF; BASKDS=DSD4545DS;SDFGFSDS=545MFDK343"
dict2 = {i.split("=")[0].strip(): i.split("=")[1] for i in cookie.split(";")}
print(dict2)
可迭代对象
能够通过for遍历的都可以称为可迭代对象
常见的可迭代对象:
1、所有序列类型:例如“list”、“str”,“tuple”,“range”
2、非序列类型:例如“dict”,“set”,“文件对象f=open()”
3、实现了“__iter__()”方法的任意对象(可迭代协议)
4、实现了序列语义的“__getitem__”方法的任意对象
迭代器
实现了迭代器协议的对象称之为迭代器
1、迭代器协议:由“__iter__”方法和“__next__”方法共同构成
2、所有的可迭代器对象都可以使用内置函数iter转换为迭代器(本质上是调用了可迭代对象的__iter__的方法)
3、迭代器可以使用内置函数next进行迭代操作(每次迭代一个数据),当数据迭代完之后,会自动关闭迭代器。
当迭代器关闭之后再进行迭代,则抛出异常StopIteration
注意点:迭代器中的数据只能迭代一次(迭代完之后,迭代器就关闭了)
生成器表达式
基本语法
# 注意:python没有元祖推导式的概念,叫做生成器表达式
# 生成器是迭代器的子类(继承迭代器),拥有迭代器的所有特征
方式一:生成器表达式
g=(i for i in range(3))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
方式二:生成器函数
只要函数中使用了关键字yield,那这个函数就不是一个普通的函数,而是一个生成器的函数
生成器函数:调用的时候不会直接执行里面的代码,而且直接返回一个生成器的对象
生成器和迭代器的区别
生成器比迭代器多了三个方法
1、close:主动关闭生成器
2、send:往生成器内部传递参数
1、send方法和内置函数next一样,可以用来生成数据
2、send方法在生成数据时必须要传递一个参数,传递的参数会被上一次暂停处的yield后面的变量接受
3、send必须在生成器使用了一次next之后才能调用
3、throw:在生成器内部抛出一个异常(上一次yield暂停的位置抛出异常)
实例1
# close方法
def func():
print("-----开始-----")
s1 = yield [1, 2, 34, 5]
print(s1)
s2 = yield 445
print(s2)
s3 = yield "宁波"
print(s3)
print("-----结束-----")
g = func()
print(next(g))
print(g.close())
print(next(g))
![img]()
实例2
# send方法
def func():
print("-----开始-----")
s1 = yield [1, 2, 34, 5]
print(s1)
s2 = yield 445
print(s2)
s3 = yield "宁波"
print(s3)
print("-----结束-----")
g = func()
print(next(g))
print(g.send("你好"))
print(g.send("爸爸"))
![img]()
实例3
# 综合运用
from faker import Faker
fk = Faker(locale='zh_CN')
def demo():
n = yield
while True:
if n == 1:
n = yield fk.phone_number()
elif n == 2:
n = yield fk.name()
elif n == 3:
n = yield fk.email()
else:
n = yield {"name": fk.name(), "mobile": fk.phone_number(), "email": fk.email()}
g = demo()
next(g)
print(g.send(1))
print(g.send(2))
print(g.send(3))
print(g.send(4))