壹拾肆
函数进阶
一、三元表达式
 条件成立时的返回值 if 条件 else 条件不成立时的返回值。
x = 1
if x == 1:
    print(1)
else:
    print(0)
print(1) if x == 1 else print(0)
1
1
 三元表达式只支持双分支结构。
二、列表推到式
lt = []
for i in range(10):
    lt.append(i**2)
print(lt)
lt = [i ** 2 for i in range(10)]
print(lt)
 列表推到式可直接实现幂运算。
dic = {'a': 1, 'b': 2}
lt = [(k, v) for (k, v) in dic.items()]
print(lt)
[('a', 1), ('b', 2)]
 列表推到式可将字典转换成列表或者元组。
三、字典生成式
3.1 字典生成
dic = {'a': 1, 'b': 2}
new_dic = {k * 2: v ** 2 for k, v in dic.items()}
print(new_dic)
{'aa': 1, 'bb': 4}
 字典生成式生成字典,还可以对k、v进行算术运算。
3.2 zip()方法
 zip(拉链函数)是压缩方法,是python内置方法的一种,()里应填入可迭代的对象。
z = zip(['a', 'b', 'c', 'd'], [1, 2, 3, 4]) 
dic = {k: v ** 2 for k, v in zip(['a', 'b', 'c', 'd'], [1, 2, 3, 4])} 
print(dic)
{'a': 1, 'b': 4, 'c': 9, 'd': 16}
 zip方法可以将列表里包的元组转化为字典。
四、生成器
 生成器:自定义迭代器
4.1.1 yield关键字
def func():
    yield 456  
     print(789)
    yield 101112
    print(131415)
 f = func()  
 print(f) 
 f_iter = f.__iter__()
 print(f_iter.__next__())
 print(f_iter.__next__())
 print(f_iter.__next__())
 yield的三个特性:
- yield可以把函数变成生成器(自定制的迭代器对象,具有__iter__和__next__方法。
- yield可以停止函数,再下一次next再次运行yield下面的代码
- 有n个yield生成器就有n个元素,就可以next n次, 第n+1次next会报错。
4.1.2 yield和return
 return的特性:
 1.返回值
 2. 终止函数
4.2 协同程序
 协同程序(协程)一般来说是指这样的函数:
- 彼此间有不同的局部变量、指令指针,但仍共享全局变量;
- 可以方便地挂起、恢复,并且有多个入口点和出口点;
- 多个协同程序间表现为协作运行,如A的运行过程中需要B的结果才能继续执行。
4.2.1 send(value)
 send是除next外另一个恢复生成器的方法。
4.2.2 close()
 这个方法用于关闭生成器。对关闭的生成器后再次调用next或send将抛出StopIteration异常。
4.2.3 throw(type,value=None,traceback=None)
 中断Generator是一个非常灵活的技巧,可以通过throw抛出一个GeneratorExit异常来终止Generator。Close()方法作用是一样的。
4.3 总结
 yield:
- 
提供一种自定义迭代器的方式 
- 
yield可以暂停住函数,并提供当前的返回值  yield和return: 
- 
相同点:两者都是在函数内部使用,都可以返回值,并且返回值没有类型和个数的限制 
- 
不同点:return只能返回一次之;yield可以返回多次值 
4.4 生成表达式
 把列表推导式的[]换成()就是生成器表达式,优点:省内存,一次只产生一个值在内存中。
五、匿名函数
 匿名函数就是没有名字的函数,需要使用lambda,使用lambda+参数:《代码块》的格式。
 匿名函数一般不单独使用,和 filter()/map()/sorted()/列表的sort()内置方法联用。
 如果我们想从上述字典中取出max的值,我们可以使用max()方法,但是max()默认比较的是字典的key。所以需要首先将可迭代对象变成迭代器对象,然后res=next(迭代器对象),将res当做参数传给key指定的函数,然后将该函数的返回值当做判断依据。
 如果我们想对上述字典中的k,按照v从大到小排序,可以使用sorted()方法。首先将可迭代对象变成迭代器对象,然后res=next(迭代器对象),将res当做参数传给第一个参数指定的函数,然后将该函数的返回值当做判断依据。
 如果我们想对一个列表中的某个k做处理,可以使用map()方法。首先将可迭代对象变成迭代器对象然后res=next(迭代器对象),将res当做参数传给第一个参数指定的函数,然后将该函数的返回值作为map()方法的结果之一。
 如果我们想筛选除含有某个关键字的k,我们可以使用filter()方法。首先将可迭代对象变成迭代器对象,然后res=next(迭代器对象),将res当做参数传给第一个参数指定的函数,然后filter会判断函数的返回值的真假,如果为真则留下。
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号