进阶 5:高阶函数

匿名函数lambda

在 Python 中,匿名函数指的是没有名字的函数,通常是使用 lambda 关键字创建的。匿名函数可以用于定义简单的、临时的单行函数。这种类型的函数常常用于需要一个简单函数而不想正式定义一个函数的场合,如在排序、过滤等操作中。
匿名函数的语法是:

lambda [形参1], [形参2], ... : [单行表达式] 或 [函数调用]
  • lambda 是关键字,用来表示创建匿名函数。
  • 参数1, 参数2, ... 是函数的参数,个数可以是任意个。
  • 表达式 是一个简单的表达式,它的计算结果就是该函数的返回值。

例如,以下是一个简单的匿名函数,用于计算两个数的和:

add = lambda x, y: x + y
print(add(2, 3))  # 输出: 5

lambda 函数通常是在这种一次性使用的情况下定义的,比如传递给其他函数作为参数:

numbers = [5, 2, 9, 1]
sorted_numbers = sorted(numbers, key=lambda x: -x)
print(sorted_numbers)  # 输出: [9, 5, 2, 1]

lambda定义和普通函数的区别:

lambda定义和普通函数的区别:
	1. lambda 没有函数名
	2. lambda 参数列表外没有括号
	3. lambda 函数体中,只能实现简单的表达式计算或函数调用
	4. lambda 函数体中,不能使用return,if,while,for-in 这些都不行
	5. lambda 函数体中,可以使用if 实现的三目运算符.

lambda 定义时的注意事项

1. lambda 默认返回表达计算结果,不需要return ,如果加了reutrn 反而报错
进阶 5:高阶函数

2. 不能使用循环

进阶 5:高阶函数
3. 不能使用if的正常格式
进阶 5:高阶函数
4. 但是可以使用 if实现的三目运算符
进阶 5:高阶函数

高阶函数

map 函数

map 函数是 Python 内置的高阶函数,用于将一个指定的函数应用于可迭代对象(如列表、元组等)的每个元素,并返回包含结果的新迭代器。下面是关于 map 函数的一些关键点和示例:
语法

map(function, iterable, ...)

function: 要应用于每个元素的函数。
iterable: 一个或多个可迭代对象。

map 映射原理

进阶 5:高阶函数

返回值

map 函数返回一个迭代器,您可以使用 list()tuple() 等函数将其转换为列表或元组。

# 示例函数:计算平方
# 这个函数是为了给 map 的参数一一进行传参
# 因为map函数需要使用这个函数来计算每一个元素的映射值,所以该函数必须有且只有一个参数
def square(x):
    return x * x

# 一个列表
numbers = [1, 2, 3, 4, 5]

# 使用 map 应用 square 函数
squared_numbers = map(square, numbers)

# 将 map 对象转换为列表
squared_numbers_list = list(squared_numbers)

print(squared_numbers_list)  # 输出: [1, 4, 9, 16, 25]

使用 lambda 函数
可以使用 lambda 函数作为 map 的第一个参数:

numbers = [1, 2, 3, 4, 5]
squared_numbers = map(lambda x: x * x, numbers)
print(list(squared_numbers))  # 输出: [1, 4, 9, 16, 25]

同时遍历多个可迭代对象

map 函数也可以接受多个可迭代对象,函数需要接受相应数量的参数。例如,两个列表相加:

numbers1 = [1, 2, 3]
numbers2 = [4, 5, 6]

summed_numbers = map(lambda x, y: x + y, numbers1, numbers2)
print(list(summed_numbers))  # 输出: [5, 7, 9]

自制 map 函数(map 实现原理)

万物皆对象思想

函数的引用

对象就会有内存地址,就会有一个引用,通过这个引用就可以找到对象并使用它

假如我们想要讲一个函数引用赋值给另外一个函数

不可以加括号,括号会直接返回结果,而不是引用

进阶 5:高阶函数

下面我们来引用一下

进阶 5:高阶函数

新定义的 func引用show后调用(func())

进阶 5:高阶函数

函数的调用

进阶 5:高阶函数

调用多个函数

进阶 5:高阶函数
# map实现原理
my_list = [1, 2, 3, 4, 5]

# 这里func不加括号就是引用
def my_map(func, c_list):
    # 定义一个新空列表 ,保存映射结果
    new_list = []
    # 遍历源列表 中的数据
    for i in c_list:
        # 调用函数计算映射值 ,并保到新列表中
        new_list.append(func(i))

    return new_list

result_list = my_map(lambda n: n ** 4, my_list)
for i in result_list:
    print(i)
进阶 5:高阶函数

最后用我们学习的 lambda 和 map 函数直接简化上述函数,这样可以省去定义 my_func()和 my_map(),代码简洁了很多

进阶 5:高阶函数

reduce 函数

reduce 函数用于对一个序列进行累计计算。reduce 函数位于 functools 模块中,因此在使用前需要先导入该模块。

reduce 函数的基本用法是将一个二元函数(接受两个参数的函数)应用于序列的前两个元素,计算出一个中间结果后,再将该结果与下一个元素进行相同操作,依次累计,直到遍历完整个序列并返回最终的结果。

语法格式

from functools import reduce
reduce(function, iterable, initializer=None)
  • function:一个二元函数,用于定义如何累计序列中的元素。
  • iterable:需要进行累计的序列(如列表、元组等)。
  • initializer:可选,指定一个初始值,将作为第一个参数与序列中的第一个元素进行操作。

适用场景

reduce 函数在需要对列表或其他可迭代对象进行累计操作时非常有用,比如求和、求积、求最大公约数等。但需要注意的是,reduce 函数的可读性不如 for 循环和 sum 等内置函数,因此在简单的累计操作中建议使用更易读的方式。

示例 1:求列表元素的和

from functools import reduce

# 定义一个累加函数
def add(x, y):
    return x + y

# 使用 reduce 累加列表中的所有元素
numbers = [1, 2, 3, 4, 5]
result = reduce(add, numbers)
print(result)  # 输出: 15
进阶 5:高阶函数

或者使用 lambda 表达式来简化代码:

from functools import reduce

numbers = [1, 2, 3, 4, 5]

result = reduce(lambda x, y: x + y, numbers)
print(result)  # 输出: 15
进阶 5:高阶函数

示例 2:使用初始值参与计算

当设置了 initializer 时,reduce 会将初始值作为第一个参数进行计算。例如在累加操作中:

from functools import reduce
numbers = [1, 2, 3, 4, 5]

result = reduce(lambda x, y: x + y, numbers, 10)
print(result)  # 输出: 25 (10 + 1 + 2 + 3 + 4 + 5)

示例 3:使用列表推导式求阶乘

import functools

my_list = [i for i in range(1,6)]

result = functools.reduce(lambda s1,s2: s1 * s2, my_list)
print(result) # 输出:120(1*2*3*4*5)

filter 函数

Python 中的 filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回一个由符合条件元素组成的迭代器。

filter() 函数的语法如下:

filter(function, iterable)
  • function: 用于判断每个元素的函数。它应该接受一个参数输入,并返回布尔值 True 或 False。如果返回 True,元素将保留在过滤结果中。
  • iterable: 一个序列(如列表、元组、集合等)或任何可迭代的对象。

filter() 函数返回一个迭代器对象,如果希望得到列表,可以使用 list() 函数将其转为列表。

示例 1:过滤列表中的偶数

# 定义判断函数
def is_even(n):
    return n % 2 == 0

# 要过滤的列表
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 使用 filter 函数过滤出偶数
even_numbers = filter(is_even, numbers)

# 将结果转换为列表并打印
even_numbers_list = list(even_numbers)
print(even_numbers_list)
进阶 5:高阶函数

在这个示例中,is_even 函数用于检查数字是否为偶数。filter() 函数应用该检查条件过滤出列表中所有偶数。输出的迭代器对象随后被转换为列表形式,并打印出来。

示例 2:过滤出所有的数字字符串

my_list = ['123','234','abc','@#$','  ','abc234','132abc']

# 过滤出所有的数字字符串
num_list = filter(lambda s: s.isdigit(), my_list)
print(list(num_list))
进阶 5:高阶函数

函数 sort 按照某个元素排序

'''
函数sort
'''

my_list = [{'id': 1,'name': 'tom','age':12},{'id': 3,'name': 'rose','age':32},{'id': 2,'name': 'Jack','age':22}]

# 默认sort方法是不能对字典进行比较排序的 ,TypeError: '<' not supported between instances of 'dict' and 'dict'

# 按id的升序排序
my_list.sort(key=lambda d: d['id'])
# 按年龄降序排序
my_list.sort(key=lambda d: d['age'],reverse=True)

print(my_list)
进阶 5:高阶函数

发布者:LJH,转发请注明出处:https://www.ljh.cool/41787.html

(0)
上一篇 2024年11月8日 下午4:27
下一篇 2024年11月12日 上午10:30

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注