高阶函数
高阶函数是在Python中一个非常有用的功能函数,所谓高阶函数就是一个函数可以用来接收另一个函数作为参数,这样的函数叫做高阶函数。
map()
map()是 Python 内置的高阶函数,它接收一个函数function 和一个 list,并通过把函数 function 依次作用在 list 的每个元素上,得到一个新的 list 并返回。
这个例子中,假设用户输入的英文名字不规范,没有按照首字母大写,后续字母小写的规则,可以利用map()函数把一个list(包含若干不规范的英文名字)变成一个包含规范英文名字的list。
def format_name(s):
return s.capitalize()
result = map(format_name, ['adam', 'LISA', 'barT'])
print(list(result))
# 输出内容:
# ['Adam', 'Lisa', 'Bart']
reduce()
reduce()函数也接收一个函数function, 和一个list。但reduce()传入的函数必须接收两个参数,reduce()对list的每个元素反复调用函数function, 并返回最终结果值。
from functools import reduce
def f(x, y):
return x + y
result = reduce(f, [1, 3, 5, 7, 9])
print(result)
# 输出内容:
# 25
reduce()函数使用起来比较特殊,为了更好的理解上面这个例子,来详细拆解下,当调用reduce(f,[1,3,5,7,9])时,reduce函数将做如下计算:
由于f这个函数的功能是计算两个元素的值,所以先计算头两个元素:f(1,3),结果为4;
再把结果和第3个元素计算:f(4,5),结果为9;
再把结果和第4个元素计算:f(9,7),结果为16;
再把结果和第5个元素计算:f(16,9),结果为25;
由于没有更多的元素了,计算结束,返回结果25。
**reduce()**还可以接收第3个可选参数,作为计算的初始值。如果把初始值设为100,如计算:
reduce(f, [1, 3, 5, 7, 9], 100)
结果将变为125,因为第一轮计算是:计算初始值和第一个元素:f(100, 1),结果为101。
装饰器函数
装饰器(Decorators)是 Python 的一个重要部分。简单地说:他们是修改其他函数的功能的函数。他们有助于让我们的代码更简短。
一切皆对象
def hi(name="yasoob"):
return "hi " + name
print(hi())
# output: 'hi yasoob'
# 我们甚至可以将一个函数赋值给一个变量,比如
greet = hi
# 我们这里没有在使用小括号,因为我们并不是在调用hi函数
# 而是在将它放在greet变量里头。我们尝试运行下这个
print(greet())
# output: 'hi yasoob'
# 如果我们删掉旧的hi函数,看看会发生什么!
del hi
print(hi())
#outputs: NameError
print(greet())
#outputs: 'hi yasoob'
在函数中定义函数
可以在一个函数中定义另一个函数:
def hi(name="yasoob"):
print("now you are inside the hi() function")
def greet():
return "now you are in the greet() function"
def welcome():
return "now you are in the welcome() function"
print(greet())
print(welcome())
print("now you are back in the hi() function")
hi()
#output:now you are inside the hi() function
# now you are in the greet() function
# now you are in the welcome() function
# now you are back in the hi() function
# 上面展示了无论何时你调用hi(), greet()和welcome()将会同时被调用。
# 然后greet()和welcome()函数在hi()函数之外是不能访问的,比如:
greet()
#outputs: NameError: name 'greet' is not defined
## 从函数中返回函数
其实并不需要在一个函数里去执行另一个函数,我们也可以将其作为输出返回出来:
def hi(name="yasoob"):
def greet():
return "now you are in the greet() function"
def welcome():
return "now you are in the welcome() function"
if name == "yasoob":
return greet
else:
return welcome
a = hi()
print(a)
#outputs: <function greet at 0x7f2143c01500>
#上面清晰地展示了`a`现在指向到hi()函数中的greet()函数
#现在试试这个
print(a())
#outputs: now you are in the greet() function
当你把一对小括号放在后面,这个函数就会执行;然而如果你不放括号在它后面,那它可以被到处传递,并且可以赋值给别的变量而不去执行它。
还可以将函数作为参数传给另一个函数。