Python的函数
2026年1月10日 00:00
本文未完待续
1.定义
1.函数代码以def关键字开头,后接函数标识符名称和圆括号()
2.任何传入的参数和自变量必须放在圆括号内,圆括号中定义参数
3.函数内容以冒号:开始,需要缩进
4.return表达式结束函数,返回一个值给调用方,不带表达式的return相当于返回None
def 函数名(参数列表): 函数体 return 返回值例:
def greet(name, age): print("Hello World")2.类型注解 Type Hints
Python函数参数不需要声明类型,解释器会自动推断,但是会带来难以理解,隐藏BUG,开发效率低下等问题,因此类型注解通过引入可选的类型信息解决这些问题,明确指出函数和返回值的类型,让代码更加健壮可维护。
在实现复杂逻辑和对外提供公共接口时,都应当使用类型注解
例:
func.py
def greet(name: str, age: int) -> str: return f"Hello World {name}, age {age}"但是,调用时仍然可以不遵守
func.py
def greet(name: str, age: int) -> str: return f"Hello World {name}, age {age}"if __name__ == '__main__': print( greet('lzj', 12.6) )此时可以通过mypy工具包,对我们的代码进行检测,会检测出问题
先安装mypy工具 pip install mypy,再进行检测
PS D:\PycharmProjects\python-lang-test> mypy .\func\func.pyfunc\func.py:5: error: Argument 2 to "greet" has incompatible type "float"; expected "int" [arg-type]Found 1 error in 1 file (checked 1 source file)如果要彻底避免,需要进行严格类型检查
def add(a: int, b: int) -> int: if not isinstance(a, int): raise TypeError(f"参数a期望类型int,实际传入{type(a).__name__}") if not isinstance(b, int): raise TypeError(f"参数b期望类型int,实际传入{type(b).__name__}") return a + bresult2 = add('5', 3)print(result2)Traceback (most recent call last): File "D:\PycharmProjects\python-lang-test\func\func.py", line 9, in <module> result2 = add('5', 3) File "D:\PycharmProjects\python-lang-test\func\func.py", line 4, in add raise TypeError(f"参数a期望类型int,实际传入{type(a).__name__}")TypeError: 参数a期望类型int,实际传入str在函数返回值是某种特定类型或None时使用Optional,等价于Union[具体类型, None]
例:dic.get(name)可能返回字典的值,也可能在没有值时返回None
from typing import Optionaldef age(name: str) -> Optional[int]: dic = {'a':16, 'b':17, 'c':18} return dic.get(name)if __name__ == '__main__': print(age('dd')) print(age('a'))None163.参数
3.1 必须参数
以正确的形式传入函数,数量要和声明时保持一致
from typing import Optionaldef fun(age:int) -> Optional[int]: print(age) return agefun(10)3.2 关键字参数
函数调用使用关键字参数来确定传入的参数值
def fun(age:int, name:str) : print(age) print(name)fun(name='lzj', age=10)10lzj3.3 默认参数
调用函数时,如果没有传递参数,则会使用默认参数
def fun(name:str = "a", age:int = 25) : print(f"fun---name:{name} age:{age}")fun()fun("zhangliang")fun("wangqiang", 28)fun---name:a age:25fun---name:zhangliang age:25fun---name:wangqiang age:283.4 “*”可变参数
加了*的参数会以元组的形式传入,一般这种参数放在最后
格式:
def fun([普通参数], *var_args_tuple) : 函数体例:
def print_info(num, *var_tuple): print(num) print(var_tuple)print_info(70,1,2,3,4,5)print_info(80)70(1, 2, 3, 4, 5)80()如果后面还有参数,必须通过关键字参数传入,如果没有给不定长的参数传参,那么得到的是空元组
def print_info1(seq, *var_tuple, age) : print(seq) print(var_tuple) print(age)print_info1(1,20,30,40,50, age = 25)print_info1(70, age = 29)1(20, 30, 40, 50)2570()29