Python基础篇(07):高阶函数lambda、zip、map、filter、reduce和函数注解

一、匿名函数 lambda 表达式

1、格式

lambda 参数: 表达式

  • 冒号前是参数,可以有多个,用逗号隔开
  • 冒号右边的为表达式
  • 返回值是一个函数对象

2、举例:一个最简单的lambda函数

python 复制代码
add = lambda x, y: x + y
print(type(add))  # <class 'function'>
print(add(3, 5))  # 8

3、与sorted()函数结合使用

1. 首先介绍下sort()sorted()的区别

  1. sort() 是 list 的方法,只有 list 能用,而sorted() 是内置函数,可以对所有可迭代的对象进行排序操作
  2. list 的 sort() 是原地排序,会改变原来列表的顺序,无返回值;而内置函数 sorted()不会改变原来列表的顺序,返回一个新的 list

2. sorted()函数的用法

python 复制代码
语法:sorted(iterable, key=None, reverse=False)
python 复制代码
参数:
iterable -- 可迭代对象。例如:列表或字典
key      -- 对可迭代对象中给定元素的每一项进行排序。
           只有一个参数,具体的函数参数取自于可迭代对象
reverse  -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。

3. sort()和sorted()的使用示例

python 复制代码
# sort() 的使用示例
lst = [3, 1, 4, 1, 5, 9, 2, 6, 5]
lst.sort()
print(lst)  # 输出:[1, 1, 2, 3, 4, 5, 5, 6, 9]

# sorted() 的使用示例
lst = [3, 1, 4, 1, 5, 9, 2, 6, 5]
new_lst = sorted(lst)
print(new_lst)  # 输出:[1, 1, 2, 3, 4, 5, 5, 6, 9]
print(lst)  # 输出:[3, 1, 4, 1, 5, 9, 2, 6, 5]

4. lambda 函数结合 sorted() 方法排序的经典例子

python 复制代码
list1 = [5, -3, 1, 8, -4]
list2 = sorted(list1, key=lambda x: abs(x))  # 对 list1 中的每个元素取绝对值进行排序
print(list2)  # 输出:[1, -3, -4, 5, 8]

二、zip 函数

1、举例:一个最简单的zip函数

python 复制代码
l1 = [1, 2, 3]
l2 = ['x', 'y']
print(zip(l1, l2))  # <zip object at 0x00000000023FED00>
print(list(zip(l1, l2)))  # [(1, 'x'), (2, 'y')]
print(dict(zip(l1, l2)))  # {1: 'x', 2: 'y'}
  • python 3中 zip 方法合并列表后生成的是 zip 对象
  • 使用 list 方法可以将其变成元组对列表(元组对的数量以合并列表的最短长度为准)
  • 使用 dict 方法可以将其变成字典(长度以合并列表的最短长度为准)

2、实际上 zip 方法支持所有可迭代对象(字符串、列表、元祖、字典),而不仅仅是列表。利用这个特性,可以很容易创建各种字典。

python 复制代码
ls1 = [1, 2, 3]
str1 = "abc"
print(dict(zip(ls1, str1)))  # 输出:{1: 'a', 2: 'b', 3: 'c'}


name = ["John", "Jim", "Lucy"]
year = [1983, 1985, 1995]
for name, year in zip(name, year):
    print("%s - %s" % (name, year))
"""
输出:
John - 1983
Jim - 1985
Lucy - 1995
"""

三、map 函数

1、说明

map 函数会根据传入的函数对指定序列做映射

2、语法

复制代码
map(function, iterable, ...)

|------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 参数 | 描述 |
| function | 需要传入的函数,可以是内置函数,也可以是自定义函数,或者匿名函数 |
| iterable | 可迭代对象,如 列表字符串元祖字典 等等 |

3、返回值

返回的是一个 map 对象,注意不是列表不能直接输出,可以通过 for 循环 或者 list() 来显示。

4、举例:通过 map 函数实现求传入的 list 的每个元素的绝对值

python 复制代码
l1 = [1, -2, -3]
map_abs = map(abs, l1)
print(list(map_abs))   # [1, 2, 3]
for val in map_abs:
    print(val)         # 映射完没内容输出

四、filter 函数

1、说明

filter 函数会根据传入的函数对指定序列做过滤

2、语法

复制代码
filter(function, iterable)

|------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 参数 | 描述 |
| function | 需要传入的函数,可以是内置函数,也可以是自定义函数,或者匿名函数 |
| iterable | 可迭代对象,如 列表字符串元祖字典 等等 |

3、返回值

返回的是一个 filter 对象,注意不是列表不能直接输出,可以通过 for 循环 或者 list() 来显示

4、举例:通过 filter 函数上实现求传入的 list 的偶数元素的功能

python 复制代码
def is_even(num):
    return num % 2 == 0


filter_even = filter(is_even, [2, 5, 6])
for val in filter_even:
    print(val)  # 2 6

五、reduce 函数

1、说明

  1. reduce() 函数是对传入的 参数 序列中的每一个元素进行累积操作
  2. Python3 中,reduce 函数使用之前需要使用 from functools import reduce 语句导入包

2、语法

复制代码
reduce(function, iterable[, initializer])

|---------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 参数 | 描述 |
| function | 需要传入的函数,可以是内置函数,也可以是自定义函数,或者匿名函数 |
| iterable | 可迭代对象,如 列表字符串元祖字典 等等 |
| initializer | 可选参数,初始参数。 |

3、返回值

对 iterable 里的每个元素做累积处理,处理完毕后返回。

4、举例:使用reduce 函数求所有元素的乘积

python 复制代码
from functools import reduce

reduce_res = reduce(lambda x, y: x * y, [1, 2, 3, 4])
print(reduce_res)  # 24

六、Python函数注解

1、说明

函数注解是Python 3.5 引入的,目的是提供一个标准方法来注释函数的参数和返回值

2、语法

复制代码
def func(param1:param1 note, param2:param2 note=default val)->return val note:
    pass

|---------------|----------|
| 参数 | 描述 |
| param1 | 形参1。 |
| param1 note | 形参1 的注解。 |
| param2 | 形参2。 |
| param2 note | 形参2 的注解。 |
| default val | 形参2的默认值。 |
| val note | 返回值的注解。 |

3、获取函数注解信息语法

复制代码
print(func_name.__annotations__)

|-------------|--------------|--------------------------|
| 参数 | 描述 | 说明 |
| func_name | 需要获取注解信息的函数。 | 可以获取函数名为 func_name 的注解信息 |

4、举例:通过圆半径计算圆周长

python 复制代码
# 通过圆半径计算圆周长
def circle(r: "圆的半径") -> "返回圆的周长":
    return 2 * 3.14 * r


res = circle(10)
print("圆的周长是:{}".format(res))
print(circle.__annotations__)
"""
输出:
圆的周长是:62.800000000000004
{'r': '圆的半径', 'return': '返回圆的周长'}
"""
相关推荐
天天要nx2 分钟前
D64【python 接口自动化学习】- python基础之数据库
数据库·python
何曾参静谧6 分钟前
「QT」文件类 之 QTextStream 文本流类
开发语言·qt
monkey_meng9 分钟前
【Rust类型驱动开发 Type Driven Development】
开发语言·后端·rust
落落落sss18 分钟前
MQ集群
java·服务器·开发语言·后端·elasticsearch·adb·ruby
2401_8532757338 分钟前
ArrayList 源码分析
java·开发语言
zyx没烦恼38 分钟前
【STL】set,multiset,map,multimap的介绍以及使用
开发语言·c++
lb363636363638 分钟前
整数储存形式(c基础)
c语言·开发语言
feifeikon41 分钟前
Python Day5 进阶语法(列表表达式/三元/断言/with-as/异常捕获/字符串方法/lambda函数
开发语言·python
大鲤余1 小时前
Rust,删除cargo安装的可执行文件
开发语言·后端·rust
浪里个浪的10241 小时前
【C语言】从3x5矩阵计算前三行平均值并扩展到4x5矩阵
c语言·开发语言·矩阵