其他分享
首页 > 其他分享> > 函数简单方法.装饰器

函数简单方法.装饰器

作者:互联网

# 三元表达式
# 语法格式: 条件成立时要返回的值 if 条件 else 条件不成立时要返回的值
x=1
y=2

res=x if x > y else y
print(res)

二分法:
ums=[-3,4,7,10,13,21,43,77,89]
find_num=8
def binary_search(find_num,l):
print(l)
if len(l) == 0:
print('找的值不存在')
return
mid_index=len(l) // 2

if find_num > l[mid_index]:
# 接下来的查找应该是在列表的右半部分
l=l[mid_index+1:]
binary_search(find_num,l)
elif find_num < l[mid_index]:
# 接下来的查找应该是在列表的左半部分
l=l[:mid_index]
binary_search(find_num,l)
else:
print('find it')

binary_search(find_num,nums)


如果再局部想要修改全局的名字对应的值(不可变类型),需要用global
 x=111
  def func():
global x # 声明x这个名字是全局的名字,不要再造新的名字了
x=222

func()
print(x)  

# nonlocal(了解): 修改函数外层函数包含的名字对应的值(不可变类型)
x=0
def f1():
x=11
def f2():
nonlocal x
x=22
f2()
print('f1内的x:',x)

f1()



# # # 总结无参装饰器模板
def outter(func):
def wrapper(*args,**kwargs):
# 1、调用原函数
# 2、为其增加新功能
res=func(*args,**kwargs)
return res
return wrapper

例子:
def auth(func):
def wrapper(*args, **kwargs):
name = input('your name>>: ').strip()
pwd = input('your password>>: ').strip()
if name == 'zhu' and pwd == '123':
res = func(*args, **kwargs)
return res
else:
print('账号密码错误')

return wrapper


@auth
def index():
print('from index')
index()



由于语法糖@的限制,outter函数只能有一个参数,并且该才是只用来接收被装饰对象的内存地址
###有参装饰器
# 有参装饰器模板
def 有参装饰器(x,y,z):
def outter(func):
def wrapper(*args, **kwargs):
res = func(*args, **kwargs)
return res
return wrapper
return outter

@有参装饰器(1,y=2,z=3)
def 被装饰对象():
pass




如何得到自定义的迭代器:
在函数内一旦存在yield关键字,调用函数并不会执行函数体代码
会返回一个生成器对象,生成器即自定义的迭代器
def func():
print('第一次')
yield 1
print('第二次')
yield 2
print('第三次')
yield 3
print('第四次')


g=func()
print(g)

# # 会触发函数体代码的运行,然后遇到yield停下来,将yield后的值
# # 当做本次调用的结果返回
总结yield:
# 有了yield关键字,我们就有了一种自定义迭代器的实现方式。yield可以用于返回值,但不同于return,函数一旦遇到return就结束了,而yield可以保存函数的运行状态挂起函数,用来返回多次值
#####(了解)
、叠加多个装饰器的加载、运行分析(了解***)

def deco1(func1): # func1 = wrapper2的内存地址
def wrapper1(*args, **kwargs):
print('正在运行===>deco1.wrapper1')
res1 = func1(*args, **kwargs)
return res1

return wrapper1

def deco2(func2): # func2 = wrapper3的内存地址
def wrapper2(*args, **kwargs):
print('正在运行===>deco2.wrapper2')
res2 = func2(*args, **kwargs)
return res2

return wrapper2

def deco3(x):
def outter3(func3): # func3=被装饰对象index函数的内存地址
def wrapper3(*args, **kwargs):
print('正在运行===>deco3.outter3.wrapper3')
res3 = func3(*args, **kwargs)
return res3

return wrapper3

return outter3


# 加载顺序自下而上(了解)
@deco1 # index=deco1(wrapper2的内存地址) ===> index=wrapper1的内存地址
@deco2 # index=deco2(wrapper3的内存地址) ===> index=wrapper2的内存地址
@deco3(111) # ===>@outter3===> index=outter3(index) ===> index=wrapper3的内存地址
def index(x, y):
print('from index %s:%s' % (x, y))


# 执行顺序自上而下的,即wraper1-》wrapper2-》wrapper3
index(1, 2) # wrapper1(1,2)

标签:index,args,return,函数,kwargs,简单,print,装饰,def
来源: https://www.cnblogs.com/zhufuxiong/p/16338026.html