Python 函数进阶
1. 匿名函数 lambda
- 匿名函数是指没有名字的函数,这种函数只能使用一次,一般是在函数的函数体只有一句代码且只有一个返回值时,可以使用匿名函数来简化。
1.1 语法结构
result = lambda 参数列表: 表达式
1.2 示例
def calc(a, b):return a + bprint(calc(10, 20)) # 输出 30print('--' * 20)s = lambda a, b: a + b # s 表示一个匿名函数
print(type(s)) # <class 'function'>
print(s(2, 3)) # 输出 5print('--' * 20)# 列表中使用匿名函数
lst = [10, 20, 30, 40]
for i in range(len(lst)):result = lambda x: x[i] # 根据索引取值,x 为列表,result 的类型是函数print(result(lst)) # lst 是实际参数print('--' * 20)# 排序使用匿名函数
student_score = [{'name': 'a', 'score': 99},{'name': 'b', 'score': 68},{'name': 'c', 'score': 89},{'name': 'd', 'score': 79}
]# 字典类型,对列表进行排序,排序的规则是根据字典中的成绩
student_score.sort(key=lambda x: x.get('score'), reverse=True) # 成绩的降序
print(student_score) # [{'name': 'a', 'score': 99}, {'name': 'c', 'score': 89}, {'name': 'd', 'score': 79}, {'name': 'b', 'score': 68}]
1.3 注意事项
-
匿名函数通常用于简化代码,尤其是当函数体只有一句代码时。
-
匿名函数可以作为参数传递给其他函数,例如在
sort()
和filter()
中使用。
2. 递归函数
-
在一个函数的函数体内调用该函数本身,该函数就是递归函数。
-
一个完整的递归操作由两部分组成, 一部分是递归调用,一部分是递归终止条件,一般可使用
if-else
结构来判断递归的调用和递归的终止。
2.1 阶乘示例
def fac(n): # n 的阶乘 N! = N * (N-1)! ... 1! = 1if n == 1:return 1else:return n * fac(n - 1) # 自己调用自己print(fac(5)) # 输出 120
2.2 斐波那契数列
从第三项开始,每项都等于前两项之和。公式为:f(n) = f(n-1) + f(n-2)
。
def fac1(n):if n == 1 or n == 2:return 1else:return fac1(n - 1) + fac1(n - 2)for i in range(1, 10):print(fac1(i), end=' ') # 输出 1 1 2 3 5 8 13 21 34
2.3 注意事项
-
递归函数必须有递归终止条件,否则会导致无限递归,最终引发栈溢出错误。
-
递归函数的调用深度有限制,Python 默认的最大递归深度为 1000。如果需要更大的递归深度,可以使用
sys.setrecursionlimit()
设置。
3. 常用内置函数
3.1 数据类型转换函数
函数名称 | 描述说明 |
---|---|
bool(obj) |
获取指定对象 obj 的布尔值。 |
str(obj) |
将指定对象 obj 转换为字符串类型。 |
int(x) |
将 x 转换为整数类型。 |
float(x) |
将 x 转换为浮点数类型。 |
list(sequence) |
将序列(如元组、字符串等)转换为列表类型。 |
tuple(sequence) |
将序列(如列表、字符串等)转换为元组类型。 |
set(sequence) |
将序列(如列表、元组等)转换为集合类型。 |
3.2 示例代码
# bool() 示例
print("非空字符串的布尔值", bool('hello')) # True
print("空字符串的布尔值", bool('')) # False
print("空列表的布尔值", bool([])) # False
print("空元组的布尔值", bool(())) # False
print("空字典的布尔值", bool({})) # False# str() 示例
print(str(123)) # "123"
print(str([1, 2, 3])) # "[1, 2, 3]"# int() 示例
print(int("123")) # 123
print(int(3.14)) # 3
# print(int("3.14")) # ValueError: invalid literal for int() with base 10: '3.14'
# print(int("abc")) # ValueError: invalid literal for int() with base 10: 'abc'# float() 示例
print(float("3.14")) # 3.14
print(float(123)) # 123.0
# print(float("abc")) # ValueError: could not convert string to float: 'abc'# list() 示例
print(list("hello")) # ['h', 'e', 'l', 'l', 'o']
print(list((1, 2, 3))) # [1, 2, 3]# tuple() 示例
print(tuple("hello")) # ('h', 'e', 'l', 'l', 'o')
print(tuple([1, 2, 3])) # (1, 2, 3)# set() 示例
print(set("hello")) # {'h', 'e', 'l', 'o'}
print(set([1, 2, 3, 2])) # {1, 2, 3}
3.3 常用的数学函数
函数名称 | 描述说明 |
---|---|
abs(x) |
获取 x 的绝对值。 |
divmod(x, y) |
获取 x 与 y 的商和余数,返回一个元组 (商, 余数) 。 |
max(sequence) |
获取序列 sequence 的最大值。 |
min(sequence) |
获取序列 sequence 的最小值。 |
sum(iter) |
对可迭代对象 iter 进行求和运算。 |
pow(x, y) |
获取 x 的 y 次幂。 |
round(x, d) |
对 x 进行四舍五入,保留 d 位小数。 |
3.4 示例代码
# abs() 示例
print(abs(-10)) # 输出 10
print(abs(10)) # 输出 10# divmod() 示例
print(divmod(10, 3)) # 输出 (3, 1),表示商为3,余数为1# max() 示例
print(max([1, 2, 3, 4])) # 输出 4
print(max("hello")) # 输出 'o'# min() 示例
print(min([1, 2, 3, 4])) # 输出 1
print(min("hello")) # 输出 'e'# sum() 示例
print(sum([1, 2, 3, 4])) # 输出 10
print(sum((1, 2, 3, 4))) # 输出 10# pow() 示例
print(pow(2, 3)) # 输出 8,即 2 的 3 次幂# round() 示例
print(round(3.14159)) # 3
print(round(3.14159, 2)) # 3.14 # 保留两位小数
print(round(31.4159, -1)) # 30.0 # 整数31,-1位,对个位数进行四舍五入
print(round(314.159, -2)) # 300.0 # 整数314,-2位,对十位数进行四舍五入
3.5 常用的迭代器操作函数
函数名称 | 描述说明 |
---|---|
sorted(iter) |
对可迭代对象 iter 进行排序,返回一个新的列表。 |
reversed(sequence) |
反转序列 sequence ,生成一个新的迭代器对象。 |
zip(iter1, iter2) |
将 iter1 和 iter2 打包成元组,返回一个可迭代的 zip 对象。 |
enumerate(iter) |
根据可迭代对象 iter 创建一个 enumerate 对象,返回带索引的迭代器。 |
all(iter) |
判断可迭代对象 iter 中所有元素的布尔值是否都为 True 。 |
any(iter) |
判断可迭代对象 iter 中是否至少有一个元素的布尔值为 True 。 |
next(iter) |
获取迭代器 iter 的下一个元素。 |
filter(function, iter) |
通过指定条件 function 过滤序列 iter ,返回一个迭代器对象。 |
map(function, iter) |
通过函数 function 对可迭代对象 iter 的每个元素进行操作,返回一个迭代器对象。 |
3.6 示例代码
# sorted() 示例
print(sorted([3, 1, 4, 1, 5, 9])) # 输出 [1, 1, 3, 4, 5, 9]
print(sorted([3, 1, 4, 1, 5, 9], reverse=True)) # 输出 [9, 5, 4, 3, 1, 1]# reversed() 示例
print(list(reversed([1, 2, 3, 4]))) # 输出 [4, 3, 2, 1]# zip() 示例
print(list(zip([1, 2, 3], ['a', 'b', 'c']))) # 输出 [(1, 'a'), (2, 'b'), (3, 'c')]# enumerate() 示例
print(list(enumerate(['a', 'b', 'c']))) # 输出 [(0, 'a'), (1, 'b'), (2, 'c')]# all() 示例
print(all([True, True, True])) # 输出 True
print(all([True, False, True])) # 输出 False# any() 示例
print(any([False, False, False])) # 输出 False
print(any([False, True, False])) # 输出 True# next() 示例
it = iter([1, 2, 3])
print(next(it)) # 输出 1
print(next(it)) # 输出 2
print(next(it)) # 输出 3# filter() 示例
def is_even(x):return x % 2 == 0 # 判断,可能是 True,False
print(list(filter(is_even, [1, 2, 3, 4, 5]))) # 输出 [2, 4]# map() 示例
def square(x):return x * x
print(list(map(square, [1, 2, 3, 4]))) # 输出 [1, 4, 9, 16]
3.7 其他常用函数
函数名称 | 描述说明 |
---|---|
format(value, format_spec) |
将 value 以 format_spec 指定的格式进行显示。 |
len(s) |
获取 s 的长度或 s 中元素的个数。 |
id(obj) |
获取对象 obj 的内存地址。 |
type(x) |
获取 x 的数据类型。 |
eval(s) |
执行字符串 s 所表示的 Python 代码,并返回结果。 |
3.8 示例代码
# format() 示例
print(format(123.456, ".2f")) # 输出 123.46,保留两位小数
print(format(123456, ",d")) # 输出 123,456,数字用逗号分隔
print(format(0.1234, ".2%")) # 输出:12.34%# len() 示例
print(len("hello")) # 输出 5,字符串的长度
print(len([1, 2, 3, 4])) # 输出 4,列表的长度# id() 示例
a = 10
print(id(a)) # 输出 a 的内存地址# type() 示例
print(type(10)) # 输出 <class 'int'>
print(type("hello")) # 输出 <class 'str'>
print(type([1, 2, 3])) # 输出 <class 'list'># eval() 示例
print(eval("10 + 20")) # 输出 30,执行字符串中的表达式
x = 5
print(eval("x * 2")) # 输出 10,执行字符串中的表达式
总结
-
匿名函数:
- 使用
lambda
定义匿名函数。 - 匿名函数通常用于简化代码,尤其是当函数体只有一句代码时。
- 使用
-
递归函数:
- 在函数内部调用自身。
- 必须有递归终止条件,否则会导致无限递归。
-
常用内置函数:
- 数据类型转换函数:
bool()
、str()
、int()
、float()
、list()
、tuple()
、set()
。 - 数学函数:
abs()
、divmod()
、max()
、min()
、sum()
、pow()
、round()
。 - 迭代器操作函数:
sorted()
、reversed()
、zip()
、enumerate()
、all()
、any()
、next()
、filter()
、map()
。 - 其他函数:
format()
、len()
、id()
、type()
、eval()
。
- 数据类型转换函数: