python之函数的基础用法
# 演示函数功能包括函数定义、传参、变量作用域、函数文档、类型注释、内省和闭包 # 函数可选参数举例,hoppy参数可传可不传 def gethoppy(name, age, hoppy=""): """ 功能:查询对象爱好(方法说明) 参数: - name 名字 - age 年龄 返回: - 对象爱好 """ if hoppy: print("name:", name.title(), "age:", age, "hoppy:", hoppy) else: print("name:", name.title(), "age:", age) gethoppy('mike', 25) # name: Mike age: 25 gethoppy(name='mike', age=25) # 同上 gethoppy('mike', age=25) # 同上,位置参数要在前面 gethoppy('mike', 25, "游泳") # name: Mike age: 25 hoppy: 游泳 help(gethoppy) # 查询函数文档 ######### 传递混合参数 ######### def getuser(name, age, *args, **kwargs): """ 传递混合参数,如位置参数、列表参数(*args)和字典参数(**kwargs) 字典参数调用处传递键值对参数,函数将键值对参数当成一个数据字典来处理 """ print("入参:", name, age, args, kwargs) # mike 26 ('男',) {'hoppy': 'swim', 'job': 'singer'} info = {'name': name.title(), 'age': age, 'sex': args[0]} for key, value in kwargs.items(): info[key] = value print(info) getuser('mike', 26, '男', hoppy='swim', job='singer') ######### 参数解包、定义参数和返回值类型 ######### def sum_fn(a: int, b: int, c: int = 0) -> int: return a + b + c # 参数解包:将整个list当做参数传给函数 listed = [1, 2, 4] sumed = sum_fn(*listed) print("参数解包:", sumed) # 7 dd = {'a': 1, 'b': 2, 'c': 3} print(sum_fn(**dd)) # 6 解包 ######### 内省 ######### print("函数名称", sum_fn.__name__) # sum_fn print("函数参数", sum_fn.__annotations__) # {'a': <class 'int'>, 'b': <class 'int'>, 'c': <class 'int'>, 'return': <class 'int'>} print("函数文档", sum_fn.__doc__) # 同help ######### 入参格式限制 ######### def sum_fn2(a, /, b, c): """ 左侧入参只能位置参数: / """ return a + b + c def sum_fn3(a, b, *, c): """ 右侧入参只能关键字参数: * """ return a + b + c sum_fn2(1, b=2, c=3) sum_fn3(1, 2, c=3) ######### 作用域 ######### # 全局作用域(global)、嵌套函数的外层函数作用域(nonlocal)、局部作用域、内置作用域、 def myfun(): global x # 申明全局变量 x = 20 x = 10 myfun() print("作用域", x) # 20 默认不修改全局变量,需要申明global ######### 嵌套函数 ######### def funA(): x = 520 def funB(): nonlocal x # 申明函数外部变量 x = 880 print("funB:", x) funB() print("funA:", x) funA() """ funB: 880 funA: 880 """ ######### 闭包 ######### def funA(): x = 520 def funB(): print("funB:", x) return funB print("闭包:", funA()) # <function funA.<locals>.funB at 0x00000221787D3A30> funA()() # 520 myfun = funA() myfun() # 520 # 带参数(类似工厂,内层函数会记住外层函数作用域) def funA(a): def funB(b): x = pow(b, a) print("funB:", x) return funB square = funA(2) square(3) # 9 square(4) # 16