def hello(name):
print ('hello',name)
def word(name):
print ('Word',name)
1 变量可以指向函数
h = hello
print(h)# 函数本身
h('张三')# 函数调用
输出结果:
<function hello at 0x0000000002093E18>
hello 张三
2 函数名也是变量,函数名只是指向了一个具有特定功能的函数
hello = word('李四')
观察运行结果,就不在是输出hello 李四,而是输出word 李四
3 传入函数
变量可以指向函数,函数的参数可以接受变量,so,一个函数就可以接受另一个函数作为参数使用
def hello(value):
return value
def helloword(x,y,func):
print func(x)+func(y)
helloword('张三','李四',hello)
结果::张三 李四
高阶函数:就是把函数当做参数传递
4 map和reduce
map:接受两个参数,一个是函数,另一个是Iterable,map将传入的函数一次作用到序列的每一个元素,并把结果做为新的Iterator返回,这个函数只能接受一个参数
def func(x):
return x+x
result = map(func,[x for x in range(1,10)])
print(list(result))
结果:[2, 4, 6, 8, 10, 12, 14, 16, 18]
reduce:同map一样,接受两个参数,一个参数是函数,另一个参数是Iterable,不同的是,reduce把一个函数作用在一个序列上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算
from functools import reduce
def add(x,y):
return x+y
L = reduce(add,[x for x in range(1,10)])
print(L)
5 filter
和map类似,接受一个函数和一个序列,将函数一次作用于每一个元素,不同的是,根据返回值是True还是False决定是否保留元素
def is_2(num):
return num%2==0
l = filter(is_2,[x for x in range(1,10)])
print(list(l))
结果:[2, 4, 6, 8]
6 sorted排序
sorted:可以对list集合进行排序,它也是一个高阶函数,可以通过接受一个key函数实现自定义排序
def list_sorted():
print(sorted([36,24,19,20,35]))
结果:[19, 20, 24, 35, 36]
def func(x):
return x*10-2
print(list(sorted([36,-24,19,20,35],key=func)))
结果:[-24, 19, 20, 35, 36]
如果想进行反向排序:需要第三个参数reverse=False/True
7 返回函数,将函数当做返回值
def lazy_add(*args):
def add(args):
result = 0
for a in args:
result = result + a
return result
return add
r = lazy_add(1,2,3,4,5,6,7,8,9)
print(r)
#结果:<function lazy_add.<locals>.add at 0x00000000027CF9D8>
print(r())
结果:45
8 闭包
内部函数使用局部变量
def add():
funcs=[]
for i in range(1,5):
def func():
return i
funcs.append(func)
return funcs
for func in add():
print(func())
结果:
4
4
4
4
为什么结果全是4喃??
在这里我自己模仿java的内存,在真正使用函数的时候,i所指向的内存中存储的值是4
注意:返回函数不要引用任何循环变量,或者后继会发生变化的变量
一定要引用循环变量,我觉得这个完全没有必要,都需要引用循环变量了,干嘛还这么麻烦的写闭包
def count():
def f(j):
def g():
return j*j
return g
fs = []
for i in range(1, 4):
fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f()
return fs
9 匿名函数
关键字:lambda
例子:
list(map(lambda x:x*x,[x for x in range(1,10)]))
例子:
f = lambda x,y:x+y
print(f(1,2))
解释:lambda:关键字,冒号前边的是参数,后边的是表达式
10 装饰器
对某个函数进行增强,比如说,在执行函数的前后进行日志打印
def log(func):
def wrapper(*args,**kw):
print('开始登录')
loggin = func(*args,**kw)
print('登录结束')
return loggin
return wrapper
@log
def loggin():
print('登录过程进行中')
loggin()
以上的日志是死日志,如果想要自定义日志文本,就需要参数
def log(text):
def decorator(func):
def wrapper(*args, **kw):
print('%s %s():' % (text, func.__name__))
return func(*args, **kw)
return wrapper
return decorator
@log('loggin')
def loggin():
print('登录过程进行中')
loggin()