1. 函数基础
def 函数名(形参1,形参2...)
注释。。。
函数体
return 返回值
语句形式:函数名()
表达式形式
当另外一个函数的参数
- 返回值 执行后需要有明确结果,就return
- 函数参数
形参,实参
位置参数: 从左到右依次传值
关键字参数: 要在位置参数的右边,不能重复传值
可变长参数: *args接收位置参数,元组形式; **kwargs 接收关键字参数 字典形式
默认参数: 在定义阶段给函数传值
在位置函数的右边,通常为不可变类型
命名关键字参数: * 后面定义的参数一定要以关键字实参的形式进行传值
2. 函数属性
可以被引用、当做参数、返回值可以是函数、可当做容器类型元素
函数作为方法在另外一个函数调用
def max(x,y):
return x if x>y else y
def max3(f,g,t):
res1=max(f,g)
res2=max(res1,t)
return res2
print(max3(4,6,7))
名称空间即存放变量名的空间,包含了变量名与变量值的绑定关系
加载顺序:内置名称空间,全局名称空间,局部名称空间
查找顺序:局部---》全局---》内置
注:全局无法查看局部,局部可以查看全局
作用域:
全局作用域
局部作用域
注:作用域关系在函数定义阶段已被固定,与函数调用位置无关
查找顺序(LEGB):本地作用域(Local)、嵌套作用域(Enclosing function locals)、全局作用域(Global)、内置作用域(builtins模块)
global:申明为全局 nonlocal申明为嵌套作用域
内部函数包含对外部作用域(非全局)的引用
def outter(x):
x=1
def inner():
print(x)
return inner #返回inner的内存地址
f=outter(18) #outter()就是inner的内存地址
f() #加()调用inner函数
#结果为 1
返回的不仅仅是一个函数对象,还有外层包裹的作用域,该返回的函数无论在何处调用,优先寻找包裹自己的作用域
无参:
def timmer(func):
def wrapper(*args,**kwargs):
res=func(*args,**kwargs)
return res
return wrapper
有参:
def auth(file='xx'):
def timmer(func):
def wrapper(*args,**kwargs):
res=func(*args,**kwargs)
return res
return wrapper
return timmer
wraps :不改变原有函数结构
3. 生成器与迭代器
定义:每一次重复即迭代,每一次迭代的结果,即下一层迭代的初始值
作用:让没有索引的数据类型进行取值
可迭代对象:包含__iter__方法的对象
迭代器对象: (1)可迭代对象执行__iter__()得到的结果即迭代器对象
(2)包含__iter__和__next__方法
for循环原理:
执行in 后对象的__iter__()方法得到迭代器对象,再执行next(对象),将得到的值赋给相关变量,循环取出 所有的值
优缺点:
不依赖于索引取值,惰性计算,节约内存;
无法获取对象长度,只往前无回退
包含yield关键字,执行函数得到的结果即使生成器,生成对象,不执行函数代码,用next方法取值
def my_max(t):
n,a,b=0,0,1
while n<t:
yield b #返回一个 iterable 对象,
# print(b)
a,b=b,a+b
n+=1
res=my_max(6)
print(res) #<generator object my_max at 0x0041D3C0>
for i in res: #
print(i)
生成器即迭代器,有__iter__和__next__方法
yield:
将函数变成迭代器
可以返回多次值,保存函数状态
复杂的问题简单化,进而流程化,可扩展性差
4. 函数应用
条件成立时返回 if条件 条件不成立时返回
a,b=2,4
res=a if a>b else b
print(res)
names = [x+'hb' for x in names] #在列表的元素中加入hb
print(names)
l=[item**2 for item in range(1,11)]
print(l)
# names=['egon','alex_sb','wupeiqi','yuanhao']
# # 以sb结尾的名字过滤掉,然后保存剩下的名字长度
# names =[len(name) for name in names if not name.endswith('sb') ]
# print(names)
将列表推导式[]变成()即生成器表达式
一次值产生一个值,省内存
chicken=('鸡蛋%s' %i for i in range(5))
print(chicken) #<generator object <genexpr> at 0x00691B40>得到生成器对象,通过next取值
keys=['name','age','sex']
values=['egon',18,'male']
b={k,v for k,v in zip(keys,values)}
print(b)
在函数调用时,直接或者间接的调用到了本身
两个阶段:
回溯:由外到里
递推:由里到外,结束递归
指定递归次数:
sys.setrecursionlimit(limit)
4.1 匿名函数
lambda 形参 代码块 (实参)
res=(lambda x,y:x+y)(1,2)
print(res)
from functools import partial
def func(num:int):
return num**2
res=partial (func,10)
print(res())