# 函数分为内嵌函数、三方函数、自定义函数
# 不定长参数函数
# def name(*arg): # 参数为元组
# def name(**dic): # 参数为字典
# 参数装包:把传递的参数包装成一个集合
# 参数拆包:把集合参数分解成个体
# Python中参数传递只有引用传递,但如果数据类型是可变的才可以改变原件,否则不能
# 函数中return后续代码不会被执行,只能返回一次,若想返回多个值,
# 可以把这些值包装成元组或列表返回
def calculate(*arg):
"""
返回两数之和及两数之差
:param a:
:param b:
:return:
"""
add = arg[0] + arg[1]
minus = arg[0] - arg[1]
return (add,minus)
res1, res2 = calculate(2, 4)
print(res1, res2) # 结果为6 -2
# 偏函数:当函数中的参数大部分情况下都是某个数值时,我们可以把这个函数设置为偏函数,
# 这样在大量的运算中更方便
# 格式:import functools
# newfunc = functools.partial(oldfunc, para=value)
import functools
int2 = functools.partial(int, base=2)
print(int2("1100")) # 结果为12
# 高阶函数:当一个函数的参数是另一个函数时,则称这个函数是高阶函数
# 匿名函数,也称lambda函数,可以使代码写起来更简便
# 语法: lambda para1, para2...:表达式
# 注意:只能写一个表达式,表达式的结果就是返回值,不能用return,所以只能用于一些简单的操作处理
people = [{"name": "xx2", "age": 14}, {"name": "xx1", "age": 18}, {"name": "xx3", "age": 20}]
# 按姓名进行排序
# 方式1:定义一个函数
def getkey(x):
return x["name"]
res = sorted(people, key=getkey)
print(res) # 结果为[{'name': 'xx1', 'age': 18}, {'name': 'xx2', 'age': 14}, {'name': 'xx3', 'age': 20}]
# 方式2:借助匿名函数
res1 = sorted(people, key=lambda x: x["name"])
print(res1) # 结果为[{'name': 'xx1', 'age': 18}, {'name': 'xx2', 'age': 14}, {'name': 'xx3', 'age': 20}]
# 生成器:一个特殊的迭代器,惰性地处理数据,可以节省内存,能记录状态,
# 并通过next()函数访问下一个状态,
# 具备可迭代性,当需要访问某一数据时,才将其调入内存,访问结束后删除
# 创建方式1:把列表推导式的[]改成()
g = (i for i in range(1,12) if i % 2 == 0)
print(g) # 结果为<generator object <genexpr> at 0x000001E0EFB428E0>
for v in g:
print(v) # 逐一打印出相应的偶数
# 创建方式2:利用生成器语句,函数中包含yield语句,该函数的执行结果是生成器
# 执行完一条yield语句之后会使函数暂停,并输出当前是第几条yield语句,
# 通过next()函数可以使函数往下执行
def test():
yield 1
print("a")
yield 2
print("b")
res = test()
print(res) # 结果为<generator object test at 0x000001DFD4172990>
print(next(res)) # 结果为1,即为执行完yield之后挂起时的返回值
print(next(res)) # 结果为a \n 2
# 关闭生成器
g.close()