Q:匿名函数
A:
what
在C#叫lambda表达式
how
#定义匿名函数需要一个关键字lambda
lambda 变量名1,变量名2: 变量表达式(且只能是表达式)
#调用
f = lambda 变量名1,变量名2: 变量表达式
f(a,b)
how much
三元表达式
x,y比大小,输出较大的
#其它语言: x > y ? x : y
python表达式
x if x > y else y
Q:map函数
A:
what
把集合里的所有元素,映射到新的集合里
why
更加精简和优美
where
和lambda表达式一起使用
how
一般应用
#等同于运行了一次for循环
定义列表1
定义函数1
a = map(函数1, 列表1)
#输出新的列表
print(list(a))
见举例1
map和lambda表达式一起使用
定义列表1
a = map(lambda表达式, 列表1)
#输出新的列表
print(list(a))
见举例2
map传入多个参数
#map传入的列表数和lambda表达式的参数数量要一致
#两个列表如果个数如果不同,会以少的为主计算
定义列表1
定义列表2
a = map(lambda表达式, 列表1, 列表2)
#输出新的列表
print(list(a))
见举例3
how much
举例1:一般应用
list_x = [1, 2, 3, 4, 5, 6, 7, 8]
def square(x):
return x * x
#常规方法
for x in list_x
square(x)
#使用map函数
r = map(square, list_x)
print(list(r))
输出
[1, 4, 9, 16, 25, 36, 49, 64]
举例2:map和lambda表达式一起使用
list_x = [1, 2, 3, 4, 5, 6, 7, 8]
r = map(lambda x: x * x, list_x)
print(list(r))
输出
[1, 4, 9, 16, 25, 36, 49, 64]
举例3:map传入两个参数
list_x = [1, 2, 3, 4, 5, 6, 7, 8]
list_y = [1, 2, 3, 4, 5, 6, 7, 8]
r = map(lambda x, y: x * x + y, list_x, list_y)
print(list(r))
输出
[2, 6, 12, 20, 30, 42, 56, 72]
Q:reduce
A:
what
做连续运算连续调用lambda表达式
how
#首先导入functools
from functools import reduce
定义列表1
#reduce导入的lambda表达式一定要有两个参数,之传入一个列表
reduce(lambda x, y:变量表达式, 列表1, 可以设置一个初始值)
得到的结果不是一个列表,是一个连续运算
how much
举例1:一般应用
from functools import reduce
list_x = [1, 2, 3, 4, 5, 6, 7, 8]
#实际上是一个求和公式
r = reduce(lambda x, y: x + y, list_x)
print(r)
输出
36
举例2:初始值与字符串
from functools import reduce
list_x = ['1', '2', '3', '4', '5', '6', '7', '8']
#实际上是一个求和公式
r = reduce(lambda x, y: x + y, list_x, 'aaa')
print(r)
输出
‘aaa12345678’
Q:filter函数
A:
what
过滤作用
how
定义列表1
#要求lambda表达式的结果一定是一个真和假的值
a = filter(lambda表达式, 列表1)
#输出新的列表
print(list(a))
how much
举例:一般应用
list_x = [1, 0, 1, 0, 0, 1]
r = filter(lambda x: True if x==1 else False, list_x)
print(list(r))
输出
[1, 1, 1]
命令式编程和函数式编程
命令式编程:def if else for
函数式编程:map reduce filter lambda(算子)
Q:装饰器
A:
how
#装饰器的定义
def decorator(func):
def wrapper():
func()
return wrapper
#调用
f = decorator(需要导入的函数)
见举例1
#装饰器的使用方法@
def decorator(func):
def wrapper():
func()
return wrapper
#调用
@decorator
定义需要导入的函数def。。。
实例化导入的函数
见举例2
'''
装饰器,函数带可变参数(完整形式)
装饰器的使用方法@
args/kw可以改别的名字
在函数里的**kw可以用字典形式,导入多个参数
'''
def decorator(func):
def wrapper(*args, **kw):
func(*args, **kw)
return wrapper
#调用
@decorator
def f1(参数)
print(参数运算)
实例化导入的函数
见举例3
how much
对修改是封闭的,对扩展是开放的
定义可以复杂,但调用不能复杂
举例1:装饰器的定义
不用装饰器的情况
import time
def f1():
print(time.time())
print('123')
f1()
或者
import time
def f1():
print('123')
def f2(func):
print(time.time())
func()
f2(f1)
使用装饰器的方法
import time
def decorator(func):
def wrapper():
print(time.time())
func()
return wrapper
def f1():
print('123')
f = decorator(f1)
f()
举例2:装饰器的使用方法
import time
def decorator(func):
def wrapper():
print(time.time())
func()
return wrapper
@decorator
def f1():
print('123')
f1()
举例3:装饰器的可变参数
import time
def decorator(func):
def wrapper(*args, **kw):
print(time.time())
func(*args, **kw)
return wrapper
@decorator
def f1(a):
print(a)
f1('123')