# 演示函数功能包括函数定义、传参、变量作用域、函数文档、类型注释、内省和闭包
# 函数可选参数举例,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