python全栈day12

01 生成器

什么是生成器?
  就是自己用python代码写的迭代器。本质就是迭代器。

怎么构建生成器?
  1.通过生成器函数写
  2.生成器表达式

生成器函数:
  在函数中func()表示执行函数,而当函数体内包含yield,那么函数就是一个生成器,func()就变成了生成器对象。

def func(x):
    x += 1
    return x        #函数直接返回
    print(666)      #666不会执行

def func1(x):
    x += 1
    yield x         #生成器函数不会中断,可以理解为暂停在yield
    print(666)      #在下一个__next__()执行时666将会被打印
    yield x

g = func1(5)
print(g.__next__())  #打印6
print(g.__next__())  #先打印666,再打印6

  

yieldreturn的区别

  1.return出现表示函数结束并返回,yield不会中断函数。
  2.return给函数执行者返回值,yield给__next__()返回值,一个next对于一个yield

生成器函数vs迭代器

  1.自定制区别
  2.内存级别的级别
  迭代器是需要可迭代对象进行转化,可迭代对象是非常占内存的。
  生成器直接创建,不需要转化,从本质就节约内存

send与next

send作用:
  1.send与next一样,也是对生成器取值(执行一个yield)的方法
  2.send可以给上一个yield传值

def func2():
    count = yield 6
    print(count)
    count1 = yield 7
    print(count1)
    yield 8

g = func2()
print(g.__next__())    #打印6
print(g.send('alex'))    #通过send将‘alex’传值给了count,所以输出alex,随后输出7
print(g.send('taibai'))    #通过send将‘taibai’传值给了count1,所以输出taibai,随后输出8

   

send的坑:
  1.第一次取值永远都是next不能用send。
  2.最后一个yield永远也得不到send传的值

02 列表表达式,生成器生成式

列表推导式:一行代码几乎搞定你需要的任何列表

两种模式:
  1.循环模式
  结构:[变量(加工后的变量) for 变量 in iterable]

例:求出30以内的数,并放入到一个列表中。

l1 = [i for i in range(1,31)]

 

  2.筛选模式
  结构:[变量(加工后的变量) for 变量 in iterable if 条件]

例:求出50以内能被3整除的数的平方,并放入到一个列表中。

l2 = [i**2 for i in range(1,51) if i % 3 == 0]

  

推导式及生成式优缺点:

  优点:一行解决,方便。
  缺点:容易着迷,不易拍错,不能超过三次循环,不能解决所有列表问题,不要刻意用。

生成器表达式:
  就是将列表推导式的中括号换为小括号即可。

字典表达式 and 集合表达式

详情转链接:http://www.cnblogs.com/jin-xin/articles/8423802.html

原文地址:https://www.cnblogs.com/abner28/p/9505973.html