关于Python的生成器(generator)与推导式

目录

1.生成器的三种创建办法:

    1.通过生成器函数

    2.通过生成器表达式创建生成器

    3.通过数据转换

2.生成器函数定义:

3.生成器的优点:

4.使用方式:

1. __next__()

2.send(值)   给上一个yield位置传一个值  #send其实有next方法和传值方法

注意点:send在使用时,如果没有先使用 __next__方法,则send()方法中的参数必为None 

5.各种推导式和生成式表达式

1.列表推导式 [结果 for 变量 in 可迭代对象 if 筛选]

2.字典推导式 {键 : 值 for 变量 in 可迭代对象 if 筛选}   结果是 

3.集合推导式 {结果 for 变量 in 可迭代对象 if 筛选}


 

 

1.生成器的三种创建办法:

    1.通过生成器函数  关键字 yield

def func():
    print(1)
    yield 1
    print(2)
    yield 2

l = func()
print(l.__next__())
print(l.__next__())
# print(l.__next__())   #报错,StopIteration

    2.通过生成器表达式创建生成器

生成器表达式:

结果 for  变量 in 可迭代对象 if 筛选)  #重点是小括号

get1 = ( i for i in range(10) if i%2 == 0)
print(get1)

#结果:<generator object <genexpr> at 0x0000017DB9320938>

    3.通过数据转换

2.生成器函数定义:

函数中包含了yield的就是生成器函数

注意:生成器函数被执行,获取到的是生成器,而不是函数的执行

yield from

def func():
    li = [1,2,3,4]
    yield from li

f = func()
for i in f:
    print(i, end=",")

#结果:1,2,3,4

3.生成器的优点:

li = []
def func():
    for i in range(1000):
        li.append(i)

print(li)

#比较浪费空间,一次性取完

def func():
    for i in range(1000):
        yield i

f = func()
for i in range(10):
    print(f.__next__())

#需要多少取多少

4.使用方式:

1. __next__()

get1 = ( i for i in range(10) if i%2 == 0)  #生成器就是一个自己写的迭代器
#方式一:
for i in get1:
    print(i,end=" ")
#方式二:
for i in range(5):
    print(get1.__next__(),end=" ")


#结果:0 2 4 6 8 

2.send(值)   给上一个yield位置传一个值  #send其实有next方法和传值方法

def func():
    for i in range(10):
        print(i)
        l = yield "你好"
        print(l)

f = func()
print(f.__next__())    #第一次执行,会执行完yield,暂留在那里
print(f.send("我不好"))    #使用send会将参数赋值给上一次暂留位置,也就是程序中的l ,然后继续执行,知道下一个yield暂停

#结果:
# 0
# 你好
# 我不好
# 1
# 你好

注意点:send在使用时,如果没有先使用 __next__方法,则send()方法中的参数必为None 

2.send(值)

5.推导式

1.列表推导式 [结果 for 变量 in 可迭代对象 if 筛选]

li = [i for i in range(10) if i%2 == 0]
print(li)

#结果:[0, 2, 4, 6, 8]

2.字典推导式 {键 : 值 for 变量 in 可迭代对象 if 筛选}   结果是 

li_1 = [1,2,3,4]
li_2 = [1,2,3,4]
dic = {li_1[i]:li_2[i]for i in range(len(li_1))}
print(dic)

#结果:{1: 1, 2: 2, 3: 3, 4: 4}

3.集合推导式 {结果 for 变量 in 可迭代对象 if 筛选}

set1 = { i for i in range(10) if i%2 == 0}
print(set1)

#结果:{0, 2, 4, 6, 8}

猜你喜欢

转载自blog.csdn.net/weixin_42598585/article/details/86092747