Python_复习_34
2024-08-31 05:05:39
+# 函数 —— 2天
# 函数的定义和调用
# def 函数名(形参):
#函数体
#return 返回值
#调用 函数名(实参)
# 站在形参的角度上 : 位置参数,*args,默认参数(陷阱),**kwargs
# 站在实参的角度上 : 按照位置传,按照关键字传
# 返回值:没有返回值 返回一个值 返回多个值
# 接收返回值:没有返回值不接收,返回一个值用一个变量接收,返回多个值用一个变量或者对应数目的变量接收
# 闭包函数 —— 在内部函数引用外部函数的变量
# 装饰器函数—— 装饰器一定是闭包函数
# 装饰器的作用 : 在不改变原来函数的调用方式的情况下 在这个函数的前后添加新的功能
# 完美的符合了一个开发原则 :开放封闭原则
# 对扩展是开发的
# 对修改是封闭的
# 基础的装饰器
# from functools import wraps
# def wrapper(func):
# @wraps(func)
# def inner(*args,**kwargs):
# '''在函数被调用之前添加的代码'''
# ret = func(*args,**kwargs) # func是被装饰的函数 在这里被调用
# '''在函数被调用之后添加的代码'''
# return ret
# return inner
# 使用 —— @wrapper
# @wrapper
# def func(): #inner
# pass
#
# func.__name__ 不使用functools.wraps的装饰器:
def tracer(func):
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
print('%s(%r,%r)->%r'%(func.__name__,args,kwargs,result))
return result
return wrapper @tracer
def fibonacci(n):
if n in (0,1):
return n
return (fibonacci(n-1)+fibonacci(n-2)) fibonacci(3)
print(fibonacci)
print('help:')
help(fibonacci)
结果:
可以看到,装饰器完全可以正常工作。。。
但是,函数的名字变成装饰器中的包装器了!!!help内置函数也失效了
也就是说,原函数的属性失效了
如果想要保留原函数的属性,就可以用到functools.wraps了
from functools import wraps
def tracer(func):
@wraps(func)
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
print('%s(%r,%r)->%r'%(func.__name__,args,kwargs,result))
return result
return wrapper @tracer
def fibonacci(n):
if n in (0,1):
return n
return (fibonacci(n-1)+fibonacci(n-2)) fibonacci(3)
print(fibonacci)
print('help:')
help(fibonacci)
结果:
# 带参数的装饰器
# @wrapper -- > @warapper(argument)
# 三层嵌套函数
# def outer(形参):
# def wrapper(func):
# def inner(*args,**kwargs):
# '''在函数被调用之前添加的代码'''
# ret = func(*args,**kwargs) # func是被装饰的函数 在这里被调用
# '''在函数被调用之后添加的代码'''
# return ret
# return inner
# return wrapper
# @outer(True)
# def func():
# pass
# 多个装饰器装饰一个函数
# 俄罗斯套娃 #def wrapper1(func):
# @wraps(func)
# def inner(*args,**kwargs):
# print('before 1')
# print('******')
# ret = func(*args,**kwargs) # func是被装饰的函数 在这里被调用
# '''在函数被调用之后添加的代码'''
# return ret
# def wrapper2(func):
# @wraps(func)
# def inner(*args,**kwargs):
# print('before 2')
# ret = func(*args,**kwargs) # func是被装饰的函数 在这里被调用
# '''在函数被调用之后添加的代码'''
# return ret
# @wrapper1
# @wrapper2
# def func():
# print('111')
# 迭代器和生成器 —— 两天
# 内置函数 —— 两天
最新文章
- mysql数据去除重复及相关优化(转)
- 自定义CollectionViewLayout
- linux dns 连外网
- .net平台下深拷贝和浅拷贝
- c语言变量名称与变量
- nodejs学习:师哥自家的twenty博客框架
- Sql2008的行列转换之行转列
- [Java Performance] 数据库性能最佳实践 - JPA和读写优化
- Nopcommerce架构浅谈之文件结构
- Unity3D NGUI制作进度条
- XML约束
- debian install &; configure(2)-drivers-nvidia
- ShineTime 是一个效果非常精致的缩略图相册
- flashcache中应用device mapper机制
- Angular+ionic2 web端 启动程序出现短暂 白屏或黑屏 的处理小妙招
- 简单的SQL注入
- junit,面向切面开发(动态代理),工厂设计模式,数据库连接池
- EXCEL文件导入时报_未在本地计算机上注册Microsoft.ACE.OLEDB.12.0提供程序
- ModelViewSet 路由 / django logging配置 / django-debug-toolbar使用
- 安装python后,启动时提示“0x00000000001”内存错误
热门文章
- MyBatis笔记----MyBatis 入门经典的两个例子: XML 定义与注解定义
- 看到一个想收藏的的AJAX小列子
- Python:import 与__import__()
- MATLAB一元线性回归分析
- spark on yarn 集群部署
- js data日期初始化的5种方法 [转]
- python requests提示警告InsecureRequestWarning
- java8 流操作
- BZOJ2521:[SHOI2010]最小生成树(最小割)
- 【移动端】meta使用