ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

函数简单方法.装饰器

2022-06-02 18:35:31  阅读:160  来源: 互联网

标签:index args return 函数 kwargs 简单 print 装饰 def


# 三元表达式
# 语法格式: 条件成立时要返回的值 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有