巧用Python高阶函数,秒提代码逼格

392 阅读8分钟

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

inpython中很重要的一个关键字,并不是一个方法,主要用来检查数组中是否存在元素。

举个例子:

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函数需要Pythonfunctools,因此请不要忘记导入该库。看到这段文字我相信你肯定会懵逼,不过没关系,我们还是来举个例子,来帮助大家来理解!

举个例子:

还是以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 可以对所有可迭代的对象进行排序操作。

listsort 方法返回的是对已经存在的列表进行操作,无返回值,而内建函数 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列表中搜索最小值。此方法接受一个必需参数和三个可选参数。必需的参数是可迭代的本身。(可选)您可以向此函数添加更多对象作为正在进行的参数。您也可以使用键进行排序(类似于排序方法)并指定默认值。请参阅以下示例:

  1. 传入多个参数取最小值
min(0, -2, 1, 8, 5)
=> -2
  1. 传入可迭代元素,取元素最小值
arr = [1, 2, 3, 4, 5]

min(arr)
=> 1
  1. 传入可迭代对象为空时,必须指定参数default,用来返回默认值
min([], default=0)
=> 0
  1. 传入命名参数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

结论

高阶函数很好用,如果您知道它们,可以节省很多时间。我希望您发现这些方法有用且易于使用,编码愉快,如果觉得有用请关注“轻编程”,每天一篇,轻轻松松学编程!觉得不错,记得转发点赞哟!