Python学习笔记-Day12

内容大纲:

一、生成器

二、列表推导式、生成器表达式

一、什么是生成器:

  生成器是自己用python代码写出的迭代器,其本质就是迭代器,包含__iter__和__next__功能

二、如何产生生成器(两种方法)

第一种方法:通过生成器函数,就是将函数种的return变为yield

def func2(x):
    x += 1
    print(111)
    yield x
    x += 1
    print(222)
    yield x
func2(2)#函数不会执行
g_obj  =func2(3)#将func2(3)赋值给g_obj,g_obj是个迭代器
#g_obj.__next__()#输出结果是111,一个next对一个一个yield,只有遇到next,函数才会执行
print(g_obj.__next__())#输出结果是1114
print(g_obj.__next__())#输出结果是2225

1、return 与 yield的区别

① 自定制的区别

② 内存级别的区别

     迭代器是需要可迭代对象进行转化,可迭代对象非常占内存

    生成器是直接转化,从本质上节省内存

def func1():
    for i in range(10):
        yield i
g=func1()
for I in range(10):
print(g.__next__())

2、send 与 next 的区别

① send 与 next 一样,也是对生成器进行取值

② send 可以给上一个yield 传值

③ 第一次取值只能用next

④ 最后一个yield永远得不到send传的值

def func1():
    print(1)
    count = yield 1
    print(count)
    print(2)
    count2 = yield 2
    print(count2)
    print(3)
    count3 = yield 3
g=func1()
g.__next__()
g.send('alex')
g.send('hello')

三、列表推导式、生成器表达式

1、列表推导式:

优点:一行代码几乎可以搞定所需要的任何列表

缺点:容易着迷,不易排错,不能超过三个循环

① 循环模式:

l=[I for I in range(1,101)]
print(l)
        
l1=['python%s期' % I for I in range(1,15)]
print(l1)
        
l2=[i*I for I in range(1,11)]
print(l2)

② 筛选模式:

l3=[I for I in range(1,31) if i%2 == 0]
print(l3)
        
l4=[I for I in range(31) if i%3 == 0]
print(l4)
    
l5=[i*I for i in range(31) if i%3 == 0]
print(l5)
        
names=[['Tom','Billy','Jefferson','Andrew','Wesley','Steven','Joe'],['Alice','Jill','Ana','Wendy','Jennifer','Sherry','Eva']]
name=[str for names1 in names for str in names1 if str.count('e') == 2]
print(name)

2、生成器表达式:

与列表推导式相同,只是将[ ]改为( )

还有字典推导式、集合推导式这里不再一一赘述

原文地址:https://www.cnblogs.com/tian-tian/p/9507647.html