目录一、函数参数的五种类型1.1 位置参数必传参数1.2 默认参数1.3 可变位置参数*args1.4 关键字参数1.5 可变关键字参数**kwargs1.6 参数组合顺序二、参数传递的细节2.1 传值还是传引用2.2 使用 * 和 ** 解包参数三、函数返回值详解3.1 单个返回值3.2 多个返回值3.3 返回函数闭包3.4 返回生成器yield四、进阶技巧4.1 使用类型提示Type Hints4.2 强制关键字参数4.3 参数与返回值的文档五、总结一、函数参数的五种类型Python 函数的参数分为五类按声明顺序依次为1. 位置参数Positional Arguments2. 默认参数Default Arguments3. 可变位置参数*args4. 关键字参数Keyword Arguments5. 可变关键字参数**kwargs1.1 位置参数必传参数位置参数是最常见的参数形式调用时必须按定义顺序传递且数量必须匹配。python def greet(name, message): print(f{message}, {name}!) greet(Alice, Hello) # Hello, Alice! greet(Bob) # TypeError: missing 1 required positional argument1.2 默认参数在定义时给参数赋予默认值调用时可以不传递该参数。默认参数必须放在位置参数之后。python def greet(name, messageHello): print(f{message}, {name}!) greet(Alice) # Hello, Alice! greet(Bob, Hi) # Hi, Bob!注意默认参数在函数定义时计算且只计算一次。如果默认参数是可变对象如列表、字典多次调用会共享该对象。python def add_item(item, lst[]): # 不推荐 lst.append(item) return lst print(add_item(1)) # [1] print(add_item(2)) # [1, 2] 共享了同一个列表 # 推荐写法 def add_item(item, lstNone): if lst is None: lst [] lst.append(item) return lst1.3 可变位置参数*args*args用于接收任意数量的位置参数并将它们打包成一个元组。args是约定名称可以改为其他名字但*必不可少。python def sum_all(*args): return sum(args) print(sum_all(1, 2, 3, 4)) # 10 print(sum_all()) # 0应用场景当不确定传入多少个参数时使用如数学计算、装饰器等。1.4 关键字参数调用时使用 keyvalue形式传递的参数可以不按顺序。但必须在所有位置参数之后传递。python def describe_person(name, age, city): print(f{name} is {age} years old and lives in {city}.) describe_person(Alice, cityNew York, age25) # 合法1.5 可变关键字参数**kwargs**kwargs用于接收任意数量的关键字参数并将它们打包成一个字典。kwargs是约定名称**必不可少。python def print_info(**kwargs): for key, value in kwargs.items(): print(f{key}: {value}) print_info(nameAlice, age25, cityNew York)1.6 参数组合顺序在函数定义中参数必须按以下顺序声明位置参数 → 默认参数 → *args → 关键字参数仅限Python 3 → **kwargs示例python def complex_func(a, b1, *args, c, d2, **kwargs): print(fa{a}, b{b}, args{args}, c{c}, d{d}, kwargs{kwargs}) complex_func(10, 20, 30, 40, c50, d60, e70, f80) # a10, b20, args(30, 40), c50, d60, kwargs{e: 70, f: 80}二、参数传递的细节2.1 传值还是传引用Python 的参数传递是对象引用传递。简单说如果传入的是不可变对象如整数、字符串函数内部修改会创建新对象不影响外部如果传入的是可变对象如列表、字典函数内部修改会影响外部。python def modify(x, lst): x 1 # 不可变对象x指向新对象 lst.append(4) # 可变对象原列表被修改 a 10 b [1,2,3] modify(a, b) print(a) # 10 print(b) # [1,2,3,4]2.2 使用 * 和 ** 解包参数在调用函数时可以用 * 解包列表、元组为位置参数用 **解包字典为关键字参数。python def add(a, b, c): return a b c nums [1, 2, 3] print(add(*nums)) # 6 kwargs {a: 10, b: 20, c: 30} print(add(**kwargs)) # 60三、函数返回值详解3.1 单个返回值函数可以使用return返回任意类型的值。如果没有return或只有return默认返回None。python def square(x): return x ** 2 result square(5) # 253.2 多个返回值Python 函数可以返回多个值实际上返回的是一个元组可以自动解包。python def get_stats(numbers): return min(numbers), max(numbers), sum(numbers) / len(numbers) min_val, max_val, avg get_stats([1, 2, 3, 4, 5]) print(min_val, max_val, avg) # 1 5 3.03.3 返回函数闭包函数可以作为返回值形成闭包保留外部函数的变量。python def make_multiplier(n): def multiplier(x): return x * n return multiplier times2 make_multiplier(2) times3 make_multiplier(3) print(times2(5)) # 10 print(times3(5)) # 153.4 返回生成器yield使用 yield可以让函数返回一个生成器对象实现惰性求值节省内存。python def count_up_to(n): i 1 while i n: yield i i 1 for num in count_up_to(5): print(num) # 1 2 3 4 5四、进阶技巧4.1 使用类型提示Type HintsPython 3.5 支持类型注解提高代码可读性和 IDE 支持。python def greet(name: str, age: int 18) - str: return f{name} is {age} years old.4.2 强制关键字参数在 *之后的参数必须使用关键字传递避免歧义。python def person_info(name, *, age, city): print(f{name}, {age}, {city}) person_info(Alice, age25, cityNYC) # 正确 # person_info(Alice, 25, NYC) # 错误4.3 参数与返回值的文档使用 docstring 清晰描述参数和返回值。python def divide(a: float, b: float) - float: 返回 a 除以 b 的结果。 参数: a (float): 被除数 b (float): 除数 返回: float: 商 异常: ZeroDivisionError: 当 b 为 0 时抛出 return a / b五、总结位置参数: def f(a, b), 必须按顺序传入默认参数: def f(a, b1)可选定义时求值可变位置参数: def f(*args), 接收多个位置参数打包为元组关键字参数: def f(a, *, b), * 后必须用关键字传递可变关键字参数: def f(**kwargs), 接收多个关键字参数打包为字典
Python函数进阶:参数类型与返回值详解
目录一、函数参数的五种类型1.1 位置参数必传参数1.2 默认参数1.3 可变位置参数*args1.4 关键字参数1.5 可变关键字参数**kwargs1.6 参数组合顺序二、参数传递的细节2.1 传值还是传引用2.2 使用 * 和 ** 解包参数三、函数返回值详解3.1 单个返回值3.2 多个返回值3.3 返回函数闭包3.4 返回生成器yield四、进阶技巧4.1 使用类型提示Type Hints4.2 强制关键字参数4.3 参数与返回值的文档五、总结一、函数参数的五种类型Python 函数的参数分为五类按声明顺序依次为1. 位置参数Positional Arguments2. 默认参数Default Arguments3. 可变位置参数*args4. 关键字参数Keyword Arguments5. 可变关键字参数**kwargs1.1 位置参数必传参数位置参数是最常见的参数形式调用时必须按定义顺序传递且数量必须匹配。python def greet(name, message): print(f{message}, {name}!) greet(Alice, Hello) # Hello, Alice! greet(Bob) # TypeError: missing 1 required positional argument1.2 默认参数在定义时给参数赋予默认值调用时可以不传递该参数。默认参数必须放在位置参数之后。python def greet(name, messageHello): print(f{message}, {name}!) greet(Alice) # Hello, Alice! greet(Bob, Hi) # Hi, Bob!注意默认参数在函数定义时计算且只计算一次。如果默认参数是可变对象如列表、字典多次调用会共享该对象。python def add_item(item, lst[]): # 不推荐 lst.append(item) return lst print(add_item(1)) # [1] print(add_item(2)) # [1, 2] 共享了同一个列表 # 推荐写法 def add_item(item, lstNone): if lst is None: lst [] lst.append(item) return lst1.3 可变位置参数*args*args用于接收任意数量的位置参数并将它们打包成一个元组。args是约定名称可以改为其他名字但*必不可少。python def sum_all(*args): return sum(args) print(sum_all(1, 2, 3, 4)) # 10 print(sum_all()) # 0应用场景当不确定传入多少个参数时使用如数学计算、装饰器等。1.4 关键字参数调用时使用 keyvalue形式传递的参数可以不按顺序。但必须在所有位置参数之后传递。python def describe_person(name, age, city): print(f{name} is {age} years old and lives in {city}.) describe_person(Alice, cityNew York, age25) # 合法1.5 可变关键字参数**kwargs**kwargs用于接收任意数量的关键字参数并将它们打包成一个字典。kwargs是约定名称**必不可少。python def print_info(**kwargs): for key, value in kwargs.items(): print(f{key}: {value}) print_info(nameAlice, age25, cityNew York)1.6 参数组合顺序在函数定义中参数必须按以下顺序声明位置参数 → 默认参数 → *args → 关键字参数仅限Python 3 → **kwargs示例python def complex_func(a, b1, *args, c, d2, **kwargs): print(fa{a}, b{b}, args{args}, c{c}, d{d}, kwargs{kwargs}) complex_func(10, 20, 30, 40, c50, d60, e70, f80) # a10, b20, args(30, 40), c50, d60, kwargs{e: 70, f: 80}二、参数传递的细节2.1 传值还是传引用Python 的参数传递是对象引用传递。简单说如果传入的是不可变对象如整数、字符串函数内部修改会创建新对象不影响外部如果传入的是可变对象如列表、字典函数内部修改会影响外部。python def modify(x, lst): x 1 # 不可变对象x指向新对象 lst.append(4) # 可变对象原列表被修改 a 10 b [1,2,3] modify(a, b) print(a) # 10 print(b) # [1,2,3,4]2.2 使用 * 和 ** 解包参数在调用函数时可以用 * 解包列表、元组为位置参数用 **解包字典为关键字参数。python def add(a, b, c): return a b c nums [1, 2, 3] print(add(*nums)) # 6 kwargs {a: 10, b: 20, c: 30} print(add(**kwargs)) # 60三、函数返回值详解3.1 单个返回值函数可以使用return返回任意类型的值。如果没有return或只有return默认返回None。python def square(x): return x ** 2 result square(5) # 253.2 多个返回值Python 函数可以返回多个值实际上返回的是一个元组可以自动解包。python def get_stats(numbers): return min(numbers), max(numbers), sum(numbers) / len(numbers) min_val, max_val, avg get_stats([1, 2, 3, 4, 5]) print(min_val, max_val, avg) # 1 5 3.03.3 返回函数闭包函数可以作为返回值形成闭包保留外部函数的变量。python def make_multiplier(n): def multiplier(x): return x * n return multiplier times2 make_multiplier(2) times3 make_multiplier(3) print(times2(5)) # 10 print(times3(5)) # 153.4 返回生成器yield使用 yield可以让函数返回一个生成器对象实现惰性求值节省内存。python def count_up_to(n): i 1 while i n: yield i i 1 for num in count_up_to(5): print(num) # 1 2 3 4 5四、进阶技巧4.1 使用类型提示Type HintsPython 3.5 支持类型注解提高代码可读性和 IDE 支持。python def greet(name: str, age: int 18) - str: return f{name} is {age} years old.4.2 强制关键字参数在 *之后的参数必须使用关键字传递避免歧义。python def person_info(name, *, age, city): print(f{name}, {age}, {city}) person_info(Alice, age25, cityNYC) # 正确 # person_info(Alice, 25, NYC) # 错误4.3 参数与返回值的文档使用 docstring 清晰描述参数和返回值。python def divide(a: float, b: float) - float: 返回 a 除以 b 的结果。 参数: a (float): 被除数 b (float): 除数 返回: float: 商 异常: ZeroDivisionError: 当 b 为 0 时抛出 return a / b五、总结位置参数: def f(a, b), 必须按顺序传入默认参数: def f(a, b1)可选定义时求值可变位置参数: def f(*args), 接收多个位置参数打包为元组关键字参数: def f(a, *, b), * 后必须用关键字传递可变关键字参数: def f(**kwargs), 接收多个关键字参数打包为字典