Python以简单易学,语法简洁易懂,编码优美规范的特点,受到很多程序员和普通人的喜爱,相信和我一样,有很多人在学过Python之后就对其爱不释手了吧,今天给大家分享几个常用的高阶函数,瞬间提升代码逼格,成为一个有深度、有内涵的Python程序员!
all( )
all()方法用于判断给定的可迭代参数iterable中的所有元素是否都为 True,如果是返回True,否则返回False
举个例子:
已知有如下所示arr这样一个列表数据:
arr = [1, 2, 3, 4, 5]
>> 判断arr列表中的数据是否都大于0
all(i > 0 for i in arr)
=> True
明显一眼就可以看出1-5这几个数据明显都是大于0的,所以自然返回True!
>> 判断arr列表中的数据是否都小于4
all( i < 4 for i in arr)
=> False
明显的5大于4,有一个不符合条件,所以返回False!
filter()
filter方法返回满足条件的列表中所有元素的新列表。此方法接受一个函数和一个可迭代的参数。但是,filter方法返回一个过滤器对象而不是一个列表。因此,我们必须将过滤器对象转换为列表。
举个例子:
还是以开始的arr列表为例:
arr = [1, 2, 3, 4, 5]
>> 返回arr列表中所有大于2的数据,组成新的列表
def filter_function(x):
return x > 2
我们定义一个这样的函数,返回arr列表中所有大于2的数!
>> 利用filter方法返回,注意第一个参数为函数,第二个为可迭代的参数!
list(filter(filter_function, arr))
=> [3, 4, 5]
这里注意,我们在filter方法的最外层加了一个list方法,这是因为在python3中,filter方法返回的是一个过滤器对象,必须将这个对象转换为列表,最开始的时候我们已经讲到了!
使用匿名函数lambda一行写完所有,更简洁,更有逼格:
list(filter(lambda x: x > 2, arr))
=> [3, 4, 5]
这里大家可以先了解一下lambda这个匿名函数的用法,准确的来说它更像是一个表达式,只能封装有限的逻辑进去!
>> 还有没有更好的办法呢?
前面的过滤器已经可以很好的工作,但是由于filter必须将函数作为参数传递,因此可能会有些混乱。Python提供了一个很棒的功能,称为列表理解功能,该功能在过滤时被更广泛地使用。
arr = [1, 2, 3, 4 5]
[x for x in arr if x > 2]
=> [3, 4, 5]
**用法:**最外层用直接用[]第一个x为返回值是便利列表的结果,第二个写循环遍历,第三个x > 2就是条件了!是不是更加一目了然!但是这只适用简单的条件判断,如果有更加复杂的业务逻辑,可能filter更适合一些!
next()
next方法返回满足条件的列表的第一个元素。这类似于其他语言中的find方法。Next接受iterable作为参数。请参阅以下示例:
举个例子
- 还是以
arr为例,找出arr中大于2的第1个数
arr = [1, 2, 3, 4, 5]
next(x for x in arr if x > 2)
=> 3
**注意:**如果Python在列表中找不到该元素,则将引发StopIteration异常,如果处理不正确,则可能导致程序崩溃。因此,next方法允许设置默认值,直接传到第二个参数即可。
arr = [1, 2, 3, 4, 5]
next(x for x in arr if x > 5)
=> StopIteration
# 注意这里的写法与上边的不同
next((x for x in arr if x > 5), None)
=> None
*提示:*不要忘记将迭代器放在括号中。否则会导致语法错误。
in
in是python中很重要的一个关键字,并不是一个方法,主要用来检查数组中是否存在元素。
举个例子:
arr = [1, 2, 3, 4, 5]
1 in arr
=> True
6 in arr
=> False
循环遍历
为了对数组的每个元素执行操作,Python提供了for循环。请参阅以下示例:
arr = [1, 2, 3, 4, 5]
for x in arr:
print(f'Hello, I am {x}')
=> Hello, I am 1
Hello, I am 2
Hello, I am 3
Hello, I am 4
Hello, I am 5
重要的是要注意,更改x的值不会更改原始列表。
arr = [1, 2, 3, 4, 5]
for x in arr:
x = x * 2
print(arr)
=> [1, 2, 3, 4, 5]
有一种方法可以返回更新的列表。但是,与for循环相比,map(我们将在下面讨论)是一个更好的选择。for循环应该主要用于对列表中的每个项目进行外部操作。
map()
map方法返回一个新列表,其中所有元素均由函数转换。此方法接受两个参数:函数和可迭代。与filter类似,map方法返回一个map对象,因此我们必须将该map对象转换为一个列表。请参阅以下示例:
arr = [1, 2, 3, 4, 5]
def square(x):
return x * x
# list将map对象转换为列表,map第一个参数为函数,第二个为可迭代元素
list(map(square, arr))
=> [1, 4, 9, 16, 25]
# Alternatively...
list(map(lambda x: x * x, arr))
但是,就像前边学过的filter方法一样,还可以使用列表理解来解决此问题。请参阅以下示例:
arr = [1, 2, 3, 4, 5]
[x * x for x in arr]
=> [1, 4, 9, 16, 25]
同样,列表理解是首选方法,显得更加“ Python”。
reduce()
reduce方法将会对参数序列中元素进行累积。接受两个必需参数和一个可选参数。第一个必需的参数,是一个函数,并且整函数必须有两个参数。第二个参数是列表元素。第三个是可选的开始参数。此外,reduce函数需要Python库functools,因此请不要忘记导入该库。看到这段文字我相信你肯定会懵逼,不过没关系,我们还是来举个例子,来帮助大家来理解!
举个例子:
还是以arr为例,计算出所有数据相乘的结果!
import functools
def square_reducer(x, y):
return x * y
arr = [1, 2, 3, 4, 5]
# 计算1*2*3*4*5的结果
functools.reduce(square_reducer, arr)
=> 120
# 加入第三个可选参数,开始计算的数
# 计算顺序是2*1*2*3*4*5,后边设置的第三个参数2就是从2开始计算
functools.reduce(square_reducer, arr, 2)
=> 240
第一个reduce函数是最简单的。首先,我们转到第一个元素并将其放入累加器(x)。然后,将累加器乘以第二个元素。所以1 * 2 =2。我们的累加器值为2。接下来,我们将累加器值乘以第三个元素(2 * 3)。因此,我们得到的值为6。我们一直进行下去,直到完成遍历整个数组为止。最后,这是正在发生的事情:
1 * 2 * 3 * 4 * 5
=> 120
传入第三个可选参数,功能与第一个功能相同,但是它从将累加器设置为2开始。
2 * 1 * 2 * 3 * 4 * 5
=> 240
再用我们学过的匿名函数lambda来实现一遍,复习一下!
functools.reduce(lambda x, y: x * y, arr)
=> 120
functools.reduce(lambda x, y: x * y, arr, 2)
=> 240
这里使用了lambda函数,因此我们不必单独声明reducer方法,其结果功能都是一样的,只是这样更加简洁美观。
sort()
sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。
list 的 sort 方法返回的是对已经存在的列表进行操作,无返回值,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。sorted方法接受一个必需的参数和两个可选的参数(反向和键)。第一个参数是列表。reverse可选参数将对排序后的列表进行反转,而key可选参数是将列表进行排序的函数。请参阅以下示例:
arr = [2, 1, 5, 3, 4]
sorted(arr)
=> [1, 2, 3, 4, 5]
sorted(arr, reverse=True)
=> [5, 4, 3, 2, 1]
students = [
{'name': 'Jimmy', 'age': 15},
{'name': 'Hector', 'age': 18},
{'name': 'Paige', 'age': 16}
]
sorted(students, key=lambda x: x['age'])
=> [{'name': 'Jimmy', 'age': 15}, {'name': 'Paige', 'age': 16}, {'name': 'Hector', 'age': 18}]
min()
min方法在Python列表中搜索最小值。此方法接受一个必需参数和三个可选参数。必需的参数是可迭代的本身。(可选)您可以向此函数添加更多对象作为正在进行的参数。您也可以使用键进行排序(类似于排序方法)并指定默认值。请参阅以下示例:
- 传入多个参数取最小值
min(0, -2, 1, 8, 5)
=> -2
- 传入可迭代元素,取元素最小值
arr = [1, 2, 3, 4, 5]
min(arr)
=> 1
- 传入可迭代对象为空时,必须指定参数default,用来返回默认值
min([], default=0)
=> 0
- 传入命名参数key,其为一个函数,用来指定取最小值的方法(灵活运用,根据字典的键值)
students = [
{'name': 'Jimmy', 'age': 15},
{'name': 'Hector', 'age': 18},
{'name': 'Paige', 'age': 16}
]
min(students, key=lambda x: x['age'])
=> {'name': 'Jimmy', 'age': 15}
max()
max方法与min函数相同;但是,它找到一个可迭代的最大值。请参阅以下示例:
arr = [1, 2, 3, 4, 5]
max(arr)
=> 5
max(0, -2, 1, 8, 5)
=> 8
students = [
{'name': 'Jimmy', 'age': 15},
{'name': 'Hector', 'age': 18},
{'name': 'Paige', 'age': 16}
]
max(students, key=lambda x: x['age'])
=> {'name': 'Hector', 'age': 18}
max([], default=100)
=> 100
结论
高阶函数很好用,如果您知道它们,可以节省很多时间。我希望您发现这些方法有用且易于使用,编码愉快,如果觉得有用请关注“轻编程”,每天一篇,轻轻松松学编程!觉得不错,记得转发点赞哟!