python中使用函数作为参数
在python中,我们可以用一个变量来存放函数。示例:
a = len
length = a([1,2,3,4,5])
print(length)
在上面我将len()
函数赋值给了变量a
。那么我们以后我们使用len()
函数的的时候就完全可以使用a
这个变量来代替了。
既然我们可以用一个变量来存放函数,那么函数一可以当作一个函数的参数使用。
示例代码:
def add(x,y,f):
return f(x)+f(y)
result = add(1,-2,abs)
print(result)
在上面的函数中,拥有3个变量,x,y
表示传入的值,f
表示传入的函数
我们在调用此函数的时候就传入了1,-2
两个值,然后将abs
函数传入了进去,(abs()
就是获取值的绝对值)
这样,我们就实现了将函数作为参数传入参数中去。
再例如,我们需要求
这个表达式的值,那么我们可以这样做:
import math
def add(x,y,f):
return f(x)+f(y)
result = add(1,-2,abs)
result1 = add(9,16,math.sqrt)
print(result,result1)
这样,我们就可以求出上面表达式的值了。
python中的map()函数
map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f
依次作用在list
的每个元素上,得到一个新的 list
并返回。
例如,将一个列表中的所有值都变为原来的平方
def func(x):
return x*x
new_list = map(func,[1,2,3,4,5,6,7,8,9])
for list in new_list:
print(list)
需求:假设用户输入的英文名字不规范,没有按照首字母大写,后续字母小写的规则,请利用map()函数,把一个list(包含若干不规范的英文名字)变成一个包含规范英文名字的list:
输入:['adam', 'LISA', 'barT']
输出:['Adam', 'Lisa', 'Bart']
代码:
def format_name(s):
return s[0].upper() + s[1:].lower()
new_list = map(format_name,['adam', 'LISA', 'barT'])
for list in new_list:
print(list)
python中的reduce()函数
reduce()函数也是Python内置的一个高阶函数。reduce()函数接收的参数和 map()类似,一个函数 f,一个list,但行为和 map()不同,reduce()传入的函数 f 必须接收两个参数
,reduce()对list的每个元素反复调用函数f,并返回最终结果值。
在python3中,reduce()函数已经从全局函数中移除了,放在fucntools
,所以我们首先得导入从fucntools
中导入reduce()函数
from functools import reduce
def add1(x,y):
return x+y
sum = reduce(add1,[1,3,5,7,9])
print(sum)
执行上面的代码的时候,reduce()函数会做一下计算:
- 先计算头两个元素:f(1, 3),结果为4;
- 再把结果和第3个元素计算:f(4, 5),结果为9;
- 再把结果和第4个元素计算:f(9, 7),结果为16;
- 再把结果和第5个元素计算:f(16, 9),结果为25;
- 由于没有更多的元素了,计算结束,返回结果25。
上述计算实际上是对 list 的所有元素求和。虽然Python内置了求和函数sum(),但是,利用reduce()求和也很简单。
reduce()还可以接收第3个可选参数,作为计算的初始值
。如果把初始值设为100
,计算:
sum = reduce(add1,[1,3,5,7,9],100)
那么结果将会变成125,因为第一轮计算是:计算初始值和第一个元素:f(100, 1),结果为101。
Python内置了求和函数sum(),但没有求积的函数,我么来尝试一下用reduce()函数求积:
例如:
输入:[2, 4, 5, 7, 12]
输出:2*4*5*7*12的结果
代码:
def prod(x,y):
return x*y
sum = reduce(prod,[2,4,5,7,12])
print(sum)
这样就能达到我们想要的效果了。
python中filter()函数
filter()函数是 Python 内置的另一个有用的高阶函数,filter()函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新list。
例如,要从一个list [1, 4, 6, 7, 9, 12, 17]中删除偶数,保留奇数,首先,要编写一个判断奇数的函数:是奇数返回True,否则返回False
def is_odd(x):
return x%2 == 1
然后使用filter()过滤偶数:
new_list2 = filter(is_odd,[1,2,3,4,5,6,7,8,9])
for list in new_list2:
print(list)
这样就能将偶数过滤掉了。
利用filter(),可以完成很多有用的功能,例如,删除 None 或者空字符串:
def is_not_empty(s):
return s and len(s.strip()) > 0
new_list4 = filter(is_not_empty, ['test', None, '', 'str', ' ', 'END'])
for list in new_list4:
print(list)
需求:请利用filter()过滤出1~100中平方根是整数的数,即结果应该是:
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
def is_sqr(x):
r = int(math.sqrt(x))
return r*r == x
test_list = []
for i in range(1,101):
test_list.append(i)
new_list3 = filter(is_sqr,test_list)
for list in new_list3:
print(list)
python中返回函数
Python的函数不但可以返回int、str、list、dict等数据类型,还可以返回函数!
示例:
def f():
print('我是外层函数')
def g():
print('我是内层函数,被返回的函数')
return g
f()
print('*'*10)
test = f()
print('*'*10)
test()
然后我们可以查看运行结果
可以看到,当我们执行函数f
的时候,并不会执行里面的函数。当我们用一个变量test
接收f函数
的返回值时,然后再调用test()
才执行了g函数
里面的代码
需求:请编写一个函数calc_prod(lst),它接收一个list,返回一个函数,返回函数可以计算参数的乘积。
from functools import reduce
def calc_prod(lst):
def lazy_prod():
def f(x, y):
return x * y
return reduce(f, lst, 2)
return lazy_prod
f = calc_prod([1, 2, 3, 4])
result = f()
print(result)
这样就实现了我们的需求了。
python闭包
闭包本身是一个晦涩难懂的概念,在这里我们以简单粗暴地理解为闭包就是一个定义在函数内部的函数
,闭包使得变量即使脱离了该函数的作用域范围也依然能被访问到。
例如:
def func(x):
def func1(y):
return x + y
return func1
test = func(4)
print(test)
tes1 = test(5)
print(tes1)
在上面的func函数中拥有x变量,但是在func1函数中并没有x变量,但是因为python中函数支持闭包操作,也就是在函数中定义一个函数可以访问函数范围之外的变量。
python中lambda表达式
简单来说,编程中提到的 lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数。其一般有如下几种使用方式:
f= lambda x: x*x
print(f(3))
上面的代码相当于
def test(x):
return x*x
print(test(3))