python的推导式

列表推导式

基本语法

[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))
posted @ 2022-11-05 09:42  NikeAirBall  阅读(47)  评论(0)    收藏  举报