Eleventh 生成器/列表推导式/生成器表达式/

补充:函数里面的容器类形参不会随着函数调用的停止而消失

1、生成器:生成器本质就是迭代器,生成器是自己用python代码写的迭代器

    1)将函数变成生成器:

        

# 模板
def func():
    print(111)
    print(222)
    yield 666
    yield 'abcd'
func()    # 结果:111 222
ret = func()
print(ret)    # 结果:111 222 666
# 一个next 对应一个yield
print(next(ret))
print(next(ret))    # 结果:111 222 666 abcd

    2)yield 和return 的共同点和区别:

        1、return 终止函数,yield 不会终止生成器函数

        2、都会返回一个值,return 给函数的执行者返回值,yield 是给next()返回值

    3)send next :不仅能对yield取值,而且可以给上一个yield发送一个值

        1、第一次取值不能用send传参,最后一个yield永远也得不到send传的值

    4)yield from:将一个可迭代对象变成一个迭代器返回

def func():
    l1 = [1,2,3]
    yield from l1
for i in func():
    print(i)    # 结果:1 2 3

def func():
    l1 = [1,2,3]
    yield l1
for i in func():
    print(i)    # 结果:[1,2,3]

 

2、列表推导式:用一行代码构建简单,较复杂的列表

# 1、循环模式/将1~100输入到一个列表中
print([i for i in range(1, 101)])
# 2、筛选模式/筛选能整除3的数
print([i for i in range(1, 31) if i % 3 == 0])
# 三元模式/将1~20内能整除3的数换成*,其它的不变
print(['*' if i % 3 == 0 else i for i in range(1, 20)])

# 将names里面双'e'的名字打印出来
names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
         ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]

print([j for i in names for j in i if j.count('e') >= 2]))

    1、优点:一行代码。缺点:不能用debug模式且只能构建一些相对容易的列表

3、生成器表达式/与列表推导式唯一不一样就是 [] 换成 (),且next打印

    1)字典推导式

# 模板
mcase = {'a':10,'b':34}
print({k:v for k,v in mcase.items()})

4、匿名函数:一行函数

# 模板
func2 = lambda x,y: x+y
print(func2(1,2))

列表推导式技术薄弱,有需求可以深挖

posted @ 2019-01-03 15:03  pythonernoob  阅读(149)  评论(0)    收藏  举报