Day 11 生成器,列表推导式,lambda
01,昨日内容回顾
02,作业讲解
def extendList(val, list=[]): list.append(val) return list list1 = extendList(10) #[10] list2 = extendList(123, []) # [123,] list3 = extendList('a') # [10,'a'] print('list1=%s' % list1) # [10,'a'] print('list2=%s' % list2) # [123] print('list3=%s' % list3) # [10,'a']
03,生成器
#1,本质就是迭代器,生成器自己用python代码写的 ##将一个函数变成生成器函数 def fun(): print(111) yield 666 print(fun()) ------返回生成器对象 print(next(ret)) -------111,666 一个next()对应一个yield
#2,yield 与 return的区别 # return 终止函数,yield不会终止生成器函数 # 都会返回一个值,return给函数的执行者返回值,yield是给next()返回值 #生成器函数 def cloth2(): for i in range(1001): yield '你好%s' % i gen = cloth2() for i in range(50): print(next(gen))
#3,send,next send不仅能对应yield的取值,而且可以给上一个yield发送 # 第一次send不能传参数,会报错,除非send(None) # 最后一个yield永远也得不到send传的值 def fun(): count = yield 666 print(count) yield 222 gen = fun() print(gen.send(None)) print(gen.send(333)) ------- 666,333,222
#4.yield from 将可迭代对象变成一个迭代器返回 def func(): lst = [1,2,3,4,5] yield from lst gen = func() for i in gen: print(i)
04,列表推导式,生成器表达式
1,列表推导式:用一行代码构建简单,较复杂的列表 优点:一行搞定,节省行代码 缺点:1.不能用dubug模式 2.任何列表都可以通过常规构建去构建,复杂的无法构建 #1,循环模式 【变量(加工后) for 变量 in itearable】 #2,筛选模式【变量(加工后的变量) for 变量 in iterable if 条件】 #3,三元模式 ①print(['*' if i % 3 == 0 else i for i in range(1,21)]) ②names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'], ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']] print([name for lst in names for name in lst if name.count('e') >= 2])
2.生成器表达式:
与列表推导式几乎一模一样 就是[ ]换成() gen = (i for i in range(1,101)) for i in gen: print(i)
3.字典推导式,结合推导式
mcase = {'a': 10, 'b': 34, 'c': 20, 'd': 15}
print({v:k for k,v in mcase.items()})
05,匿名函数lambda
针对只有返回值的这样的函数
fun = lambda x,y,z:x*y*z print(fun(1,2,3))

浙公网安备 33010602011771号