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))

 

posted @ 2019-01-03 21:26  addit  Views(177)  Comments(0)    收藏  举报