把函数作为参数传⼊,这样的函数称为⾼阶函数,⾼阶函数是函数式编程的体现。函数式编程就是指这种⾼度抽象的编程范式。
1.1 体验⾼阶函数
1.1.1 abs()
abs函数可以完成对数字求绝对值计算,返回一个数的绝对值,参数可以是整数,浮点数,或者是实现了__abs__方法的对象。
示例代码1:
print(abs(-1))
print(abs(-10))
print(abs(5))
print(abs(-3.4))
运行结果:
示例代码2: 【实现了__abs__方法的对象】
class ABSDeco(object):
def __init__(self, value):
self.value = value
def __abs__(self):
value = float(self.value)
if value < 0:
return -1 * value
test = ABSDeco("-3.14125")
print(abs(test))
运行结果:
示例代码3: 【修改__abs__方法中return的值】
class ABSDeco2(object):
def __init__(self, value):
self.value = value
def __abs__(self):
value = float(self.value)
if value < 0:
return -2 * value
test = ABSDeco2("-3.14125")
print(abs(test))
运行结果:
注意:test对象实现了__abs__方法,当test作为abs的参数时,abs函数会调用test的__abs__方法,将方法的返回值做为abs函数的返回值。
1.1.2 round()
函数可以完成对数字的四舍五⼊计算。
语法结构:
round(number,num_digits)
参数:
- number:需要四舍五入的数
- digits:需要小数点后保留的位数
返回值:
- 指定的位数大于 0,返回四舍五入到指定的小数位;
- 指定的位数等于 0,返回四舍五入到最接近的整数,保留整数部分;
- 指定的位数小于 0,对整数部分进行四舍五入,返回的结果是浮点数。
示例代码1:
round(1.2) # 1
round(1.9) # 2
示例代码2:
s = 1.2356789
# 指定的位数大于 0,返回四舍五入到指定的小数位
ret1 = round(s, 3) # 保留3位小数
print(ret1)
# 指定的位数等于 0,返回四舍五入到最接近的整数,保留整数部分
ret2 = round(s, 0)
print(ret2)
ret3 = round(s) # 默认返回四舍五入后的整数
print(ret3)
# 指定的位数小于 0,对整数部分进行四舍五入,返回的结果是浮点数
ret4 = round(-s, 3)
print(ret4)
ret5 = round(-s) # 默认返回四舍五入后的整数
print(ret5)
运行结果:
def add_num(a, b):
return abs(a) + abs(b)
result = add_num(-1, 2)
print(result) # 3
def sum_num(a, b, f):
return f(a) + f(b)
result = sum_num(-1, 2, abs)
print(result) # 3
1.2 内置⾼阶函数
1.2.1 map()
map(func, lst),将传⼊的函数变量func作⽤到lst变量的每个元素中,并将结果组成新的列表(Python2)/ 迭代器(Python3)返回。
需求:计算 list1 序列中各个数字的2次⽅。
示例代码1:
list1 = [1, 2, 3, 4, 5]
def func(x):
return x ** 2
result = map(func, list1)
print(result) # <map object at 0x000001EE85441788>
print(list(result)) # [1, 4, 9, 16, 25]
运行结果:
更多map()函数使用方法,详见博文:python中map()函数使用方法_IT之一小佬的博客-CSDN博客_map函数的用法python
1.2.2 reduce()
reduce(func,lst),其中func必须有两个参数。每次func计算的结果继续和序列的下⼀个元素做累积计算。
注意:reduce()传⼊的参数func必须接收2个参数。
需求:计算 list1 序列中各个数字的累加和。
import functools
list1 = [1, 2, 3, 4, 5]
# 方法一
def func(a, b):
return a + b
result = functools.reduce(func, list1)
print(result) # 15
# 方法二
result2 = functools.reduce(lambda x, y: x + y, list1)
print(result2)
运行结果:
示例代码2:
import functools
list1 = [1, 2, 3, 4, 5]
# 方法一
def func(a, b):
return a * b
result = functools.reduce(func, list1)
print(result) # 15
# 方法二
result2 = functools.reduce(lambda x, y: x * y, list1)
print(result2)
运行结果:
示例代码3:
import functools
list1 = [1, 2, 3, 4, 5]
list2 = [1, 1, 1, 1, 1]
list3 = [0, 0, 0, 0, 0]
list4 = [0, 0, 0, 0, 1]
result1 = functools.reduce(lambda x, y: x & y, list1)
result2 = functools.reduce(lambda x, y: x & y, list2)
result3 = functools.reduce(lambda x, y: x | y, list3)
result4 = functools.reduce(lambda x, y: x | y, list4)
print(result1)
print(result2)
print(result3)
print(result4)
运行结果:
更多reduce()函数使用方法,详见博文:
python中reduce()函数用法详解_IT之一小佬的博客-CSDN博客
1.2.3 filter()
python内置函数filter的语法是filter(function, iterable),它使用function对iterable中的数据进行过滤,只保留那些返回True的元素。
filter(func, lst)函数⽤于过滤序列, 过滤掉不符合条件的元素, 返回⼀个 filter 对象。如果要转换为列表, 可以使⽤ list() 来转换。
filter(function, iterable)相当于一个生成器表达式,当function参数不为None时,等价于(item for item in iterable if function(item)),当function为None时,等价于(item for item in iterable if item)。
语法结构:
filter(function, iterable)
参数解释:
- function 必须是函数
- iterable iterable 可以是一个序列,一个支持迭代的容器,或一个迭代器
示例代码1: 【自定义函数func】
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def func(x):
return x % 2 == 0
result = filter(func, list1)
print(result) # <filter object at 0x0000028CAF658788>
print(list(result)) # [2, 4, 6, 8, 10]
运行结果:
示例代码2: 【func函数为None】
lst = [1, False, 2, 0, True]
for i in filter(None, lst):
print(i)
运行结果:
示例代码3: 【func为lambda函数】
lst = [1, 2, 3, 4, 5]
for i in filter(lambda x: x % 2 == 1, lst):
print(i)
运行结果:
示例代码4: 【自定义条件判断函数】
lst = ['', 'abc', [], [1, 2, 3], {}, {'name': 'zhangsan'}]
def len_fun(tmp):
if len(tmp) != 0:
return tmp
result = filter(None, lst)
print(result)
for i in result:
print(i, end=' ')
print()
result2 = filter(len_fun, lst)
print(result2)
for i in result2:
print(i, end=' ')
运行结果: