函数进阶
一、三元表达式
条件成立时的返回值 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会判断函数的返回值的真假,如果为真则留下。