Python 函数全攻略:函数进阶(生成器、闭包、内置函数、装饰器、推导式)
一、默认参数中的易错点
-
问题: 当函数的默认参数是可变类型(如
list
,dict
)时,存在“坑”。 -
现象:
def func(a2=[]): # a2 默认是一个空列表a2.append(2)print(a2)func() # 第一次调用,a2 默认为 [],输出 [2] func([]) # 传入新列表,输出 [2] func([1]) # 传入带元素的列表,输出 [1, 2] func() # 再次调用 func(),a2 仍指向第一次创建的那个列表,输出 [2, 2]
-
原因:
-
函数定义时,默认参数的可变对象只创建一次,并被该参数引用。
-
当函数调用时未传递该默认参数,它会一直使用并修改第一次创建的那个可变对象。
-
当函数调用时传递了该默认参数,它会使用传入的值,不影响原始默认对象。
-
不可变类型(
int
,str
,tuple
)则无此问题,因其“修改”会生成新对象,不影响原默认值。
-
二、内置函数(Functions)
Python内置函数丰富,以下分组介绍常用和重要部分:
-
数值计算类 (5个):
-
abs(x)
: 求绝对值。 -
pow(base, exp)
:base
的exp
次方 (等同于base ** exp
)。-
示例:
pow(2, 5)
-> 32
-
-
sum(iterable)
: 对可迭代对象中的数字求和。-
示例:
sum([1, 2, 3])
-> 6
-
-
divmod(dividend, divisor)
: 返回商和余数的元组(商, 余数)
。-
示例:
divmod(98, 10)
->(9, 8)
-
应用场景: 分页计算(总页数 = 商 + (1 if 余数 > 0 else 0))。
-
-
round(number, ndigits=None)
: 四舍五入,ndigits
指定小数位数。-
示例:
round(3.1415926, 2)
-> 3.14;round(3.147, 2)
-> 3.15
-
-
-
序列操作与布尔判断类 (4个):
-
min(iterable)
: 获取可迭代对象中的最小值。 -
max(iterable)
: 获取可迭代对象中的最大值。 -
all(iterable)
: 判断可迭代对象中所有元素布尔值为True
才返回True
,否则返回False
(空可迭代对象返回True
)。-
示例:
all([1, 'hello', True])
->True
;all([1, 0, True])
->False
-
应用: 校验多条件(如用户名密码非空)。
-
-
any(iterable)
: 判断可迭代对象中任一元素布尔值为True
就返回True
,否则返回False
(空可迭代对象返回False
)。-
示例:
any([0, '', False, 1])
->True
;any([0, '', False])
->False
-
-
-
进制转换类 (4个):
-
核心: 计算机底层是二进制,其他进制(八进制、十进制、十六进制)为方便人类表示。
-
转换路径: 二进制/八进制/十六进制 <-> 十进制 (必须通过十进制中转)。
-
Python表示:
-
十进制:普通整数
90
-
二进制:
0b
前缀字符串0b1011010
-
八进制:
0o
前缀字符串0o132
-
十六进制:
0x
前缀字符串0x5a
-
-
转换函数:
-
bin(decimal)
: 十进制转二进制字符串(带0b
前缀)。 -
oct(decimal)
: 十进制转八进制字符串(带0o
前缀)。 -
hex(decimal)
: 十进制转十六进制字符串(带0x
前缀)。 -
int(string, base=None)
: 将字符串(或其他类型)转为十进制整数。base
参数指定字符串的进制(2, 8, 16
等),若无base
则自动推断。-
示例:
int('0b1011010', base=2)
-> 90;int('0o132', base=8)
-> 90;int('0x5a', base=16)
-> 90
-
-
-
面试题: 将IP地址 (
192.168.11.23
) 转换为二进制字符串,再转换为整体十进制数。-
思路:
-
IP按
.
分割成四个字符串数字。 -
遍历每个字符串数字:
-
转为整数 (十进制)。
-
-
-
-