Python 函数进阶

Python 函数进阶

1. 匿名函数 lambda

  • 匿名函数是指没有名字的函数,这种函数只能使用一次,一般是在函数的函数体只有一句代码且只有一个返回值时,可以使用匿名函数来简化。

1.1 语法结构

result = lambda 参数列表: 表达式

1.2 示例

def calc(a, b):
    return a + b

print(calc(10, 20))  # 输出 30

print('--' * 20)

s = lambda a, b: a + b  # s 表示一个匿名函数
print(type(s))  # <class 'function'>
print(s(2, 3))  # 输出 5

print('--' * 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! = 1
    if n == 1:
        return 1
    else:
        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 1
    else:
        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) 获取 xy 的商和余数,返回一个元组 (商, 余数)
max(sequence) 获取序列 sequence 的最大值。
min(sequence) 获取序列 sequence 的最小值。
sum(iter) 对可迭代对象 iter 进行求和运算。
pow(x, y) 获取 xy 次幂。
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) iter1iter2 打包成元组,返回一个可迭代的 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) valueformat_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()

posted @ 2025-03-23 17:45  kyle_7Qc  阅读(41)  评论(0)    收藏  举报