python 内置函数map,filter,sorted,reduce

Python 中的内置函数 mapfiltersortedreduce 提供了方便的数据处理方式。以下是每个函数的详细讲解,包括它们的用法和背后的原理。


1. map() 函数

作用: map() 函数会将传入的函数应用到可迭代对象(如列表、元组等)的每一个元素,并返回一个包含函数结果的迭代器。

语法:

pythonCopy codemap(function, iterable, ...)
  • function: 要应用的函数,可以是内置函数或用户自定义函数。
  • iterable: 一个或多个可迭代对象。

例子:

pythonCopy code# 将列表中的每个数字乘以2
nums = [1, 2, 3, 4]
result = map(lambda x: x * 2, nums)
print(list(result))  # 输出: [2, 4, 6, 8]

特点:

  • map() 返回的是一个迭代器,而不是列表或元组。你可以用 list()tuple() 来将其转换为需要的数据结构。
  • 如果传入多个可迭代对象,map() 会依次将它们的元素传递给函数。

示例:

pythonCopy code# 使用多个可迭代对象
nums1 = [1, 2, 3]
nums2 = [4, 5, 6]
result = map(lambda x, y: x + y, nums1, nums2)
print(list(result))  # 输出: [5, 7, 9]

2. filter() 函数

作用: filter() 函数用于过滤可迭代对象中的元素,并返回所有满足条件的元素组成的迭代器。它会根据传入的函数来判断每个元素是否保留。

语法:

pythonCopy codefilter(function, iterable)
  • function: 返回布尔值的函数。如果返回 True,元素会被保留。
  • iterable: 要过滤的可迭代对象。

例子:

pythonCopy code# 过滤出偶数
nums = [1, 2, 3, 4, 5, 6]
result = filter(lambda x: x % 2 == 0, nums)
print(list(result))  # 输出: [2, 4, 6]

特点:

  • filter() 返回的是一个迭代器。要获取结果,可以使用 list()tuple() 将其转化为列表或元组。
  • 如果传入的函数返回 True,元素会被保留;否则会被过滤掉。

3. sorted() 函数

作用: sorted() 函数对可迭代对象进行排序,并返回一个新的排序后的列表。

语法:

pythonCopy codesorted(iterable, key=None, reverse=False)
  • iterable: 需要排序的可迭代对象。
  • key: 一个函数,用来定制排序规则。默认是按照元素本身排序。
  • reverse: True 表示降序排序,False 表示升序排序。

例子:

pythonCopy code# 对列表进行排序
nums = [5, 2, 9, 1, 5, 6]
result = sorted(nums)
print(result)  # 输出: [1, 2, 5, 5, 6, 9]

指定 key 进行排序:

pythonCopy code# 对字符串按照长度排序
words = ['apple', 'banana', 'pear', 'grape']
result = sorted(words, key=len)
print(result)  # 输出: ['pear', 'apple', 'grape', 'banana']

使用 reverse=True 进行降序排序:

pythonCopy codenums = [5, 2, 9, 1, 5, 6]
result = sorted(nums, reverse=True)
print(result)  # 输出: [9, 6, 5, 5, 2, 1]

特点:

  • sorted() 不会改变原可迭代对象,它返回的是排序后的新列表。
  • 可以通过 key 参数定制排序逻辑,非常灵活。

4. reduce() 函数

作用: reduce() 函数用于对可迭代对象中的元素进行累计操作,将序列中的元素合并为一个结果。它在 Python 3 中被移到了 functools 模块中,因此需要先导入该模块。

语法:

pythonCopy codefrom functools import reduce
reduce(function, iterable[, initializer])
  • function: 二元函数,接受两个参数并返回一个值。
  • iterable: 要进行累计操作的可迭代对象。
  • initializer(可选): 初始化值,如果提供,累计操作会以此为初始值。

例子:

pythonCopy codefrom functools import reduce

# 计算列表中所有元素的乘积
nums = [1, 2, 3, 4]
result = reduce(lambda x, y: x * y, nums)
print(result)  # 输出: 24

特点:

  • reduce() 通过将前两个元素传递给函数计算出结果,再将结果与下一个元素继续操作,直到遍历完序列。
  • 可以使用 initializer 来指定初始值,这样可以控制操作的起始点。

initializer 的例子:

pythonCopy codefrom functools import reduce

nums = [1, 2, 3, 4]
# 使用初始值 10,最终的结果是 10 * 1 * 2 * 3 * 4
result = reduce(lambda x, y: x * y, nums, 10)
print(result)  # 输出: 240

总结:

  • map(): 将函数应用于可迭代对象的每个元素,返回结果迭代器。
  • filter(): 过滤出满足条件的元素,返回结果迭代器。
  • sorted(): 对可迭代对象进行排序,返回排序后的新列表。
  • reduce(): 对可迭代对象进行累计操作,返回最终结果。

这些函数都是函数式编程的典型例子,允许我们以简洁的方式处理数据。不过,过度使用可能会降低代码的可读性,建议在适当场景下使用。

使用 lambda 函数时虽然方便,但在某些场景下,我们可能更希望使用更复杂或可重用的自定义函数。这里就以 sorted() 函数对字典进行排序为例,使用自定义规则和具体的 function 函数来代替 lambda

示例:对字典进行自定义排序

假设我们有一个包含字典元素的列表,每个字典包含用户的姓名和年龄。我们希望根据用户的年龄对列表进行排序。

字典列表:

pythonCopy codepeople = [
    {"name": "Alice", "age": 30},
    {"name": "Bob", "age": 25},
    {"name": "Charlie", "age": 35}
]

自定义函数来进行排序:

首先,我们需要定义一个函数,它将字典中的 age 字段作为排序依据。

pythonCopy code# 自定义函数:返回字典中的 age 值
def get_age(person):
    return person["age"]

# 使用 sorted 和自定义函数进行排序
sorted_people = sorted(people, key=get_age)

print(sorted_people)

输出

pythonCopy code[
    {'name': 'Bob', 'age': 25},
    {'name': 'Alice', 'age': 30},
    {'name': 'Charlie', 'age': 35}
]

这里的 get_age() 函数作为 sorted()key 参数使用,告诉 Python 在排序时根据每个字典的 age 值来进行排序。

更复杂的排序规则:

如果我们想要先按年龄排序,然后在年龄相同的情况下按姓名进行字母排序,则可以定义一个更复杂的函数:

pythonCopy codedef sort_by_age_and_name(person):
    return (person["age"], person["name"])

sorted_people = sorted(people, key=sort_by_age_and_name)

print(sorted_people)

输出

pythonCopy code[
    {'name': 'Bob', 'age': 25},
    {'name': 'Alice', 'age': 30},
    {'name': 'Charlie', 'age': 35}
]

说明:这里的 key 返回了一个包含两个元素的元组 (age, name),Python 会先根据 age 排序,如果两个元素的 age 相同,再根据 name 进行排序。

总结:

  • 在排序时,sorted() 函数的 key 参数允许使用自定义函数来定义排序规则。
  • 自定义函数可以灵活处理复杂排序逻辑,如根据多个字段排序。
  • 这种方式比 lambda 更适合处理复杂情况,特别是当规则难以用简短的匿名函数表达时。

这个例子展示了如何通过具体的函数来替代 lambda,提升代码的可读性和可扩展性。

下面详细讲解并提供具体例子,展示如何在 filtermapreduce 中使用自定义的函数来代替 lambda,并且详细讲解它们的用途和工作方式。

1. filter() 使用自定义函数

filter() 函数用于筛选序列中符合特定条件的元素。它需要两个参数:一个函数(用来判断每个元素是否符合条件)和一个可迭代对象(如列表)。如果函数返回 True,该元素会被保留。

示例:筛选年龄大于30的用户

我们使用自定义函数筛选出年龄大于30岁的人。

pythonCopy codepeople = [
    {"name": "Alice", "age": 30},
    {"name": "Bob", "age": 25},
    {"name": "Charlie", "age": 35},
    {"name": "David", "age": 40}
]

# 自定义函数,判断是否年龄大于30
def is_over_30(person):
    return person["age"] > 30

# 使用 filter 筛选
over_30_people = filter(is_over_30, people)

# 转换为列表
over_30_people_list = list(over_30_people)
print(over_30_people_list)

输出

pythonCopy code[
    {'name': 'Charlie', 'age': 35},
    {'name': 'David', 'age': 40}
]

解释is_over_30() 函数返回 TrueFalsefilter 函数保留返回值为 True 的元素。


2. map() 使用自定义函数

map() 函数用于将一个函数应用到序列的每个元素上,并返回应用结果的新序列。

示例:将年龄转换为字符串表示

假设我们想要将 people 列表中的年龄转换为字符串表示。

pythonCopy code# 自定义函数,将年龄转换为字符串
def age_to_string(person):
    person["age"] = str(person["age"]) + " years old"
    return person

# 使用 map 应用函数
people_with_age_string = map(age_to_string, people)

# 转换为列表
people_with_age_string_list = list(people_with_age_string)
print(people_with_age_string_list)

输出

pythonCopy code[
    {'name': 'Alice', 'age': '30 years old'},
    {'name': 'Bob', 'age': '25 years old'},
    {'name': 'Charlie', 'age': '35 years old'},
    {'name': 'David', 'age': '40 years old'}
]

解释age_to_string() 函数将每个字典的 age 字段从整数转换为字符串,并附加了 " years old"map() 函数应用此操作到所有元素。


3. reduce() 使用自定义函数

reduce() 函数用于累积处理序列中的元素。它需要两个参数:一个二元函数和一个可迭代对象。reduce() 会连续应用该函数到序列的元素上,直到最后只剩一个结果。

reducefunctools 模块中,使用前需要导入。

示例:计算所有用户的总年龄

我们使用 reduce() 来计算所有用户年龄的总和。

pythonCopy codefrom functools import reduce

# 自定义函数,累加年龄
def sum_ages(total, person):
    return total + person["age"]

# 使用 reduce 计算总年龄
total_age = reduce(sum_ages, people, 0)

print(total_age)

输出

pythonCopy code130

解释sum_ages() 函数将每个人的 age 与累加的总和相加,reduce() 则反复应用此函数,最终计算出所有人的年龄总和。


总结

  1. filter():用于筛选符合条件的元素。自定义函数返回 TrueFalse
    • 示例:筛选出年龄大于 30 的用户。
  2. map():将函数应用到序列的每个元素。自定义函数返回对元素的变换结果。
    • 示例:将年龄转换为字符串格式。
  3. reduce():用于累积序列中的元素,生成单一的结果。自定义函数接受两个参数,连续应用函数。
    • 示例:计算所有用户的总年龄。

在这些例子中,自定义的函数替代了 lambda,使代码更具可读性,尤其在逻辑复杂时,自定义函数更容易理解与扩展。

0 0 投票数
Article Rating
订阅评论
提醒
guest
0 评论
最旧
最新 最多投票
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x