python13各种器
def hello():
print("hello") def test():
print("test") def hello_wrapper():
print("aaa")
hello()
print("bbbb") def test_wrapper():
print("aaaa")
hello()
print("bnbbb") if __name__ == "__main__":
#hello()
hello_wrapper()
test_wrapper()
用装饰器进行改良:
def log(func):
def wrapper():
print("aaaa")
func()
print("bbbb")
return wrapper @log
def hello():
print("hello") def log_in(func):
def wrapper():
print("inaaaa")
func()
print("inbbbb")
return wrapper @log #1开始进入装饰器,调用函数后,然后进入装饰器log_in
@log_in #执行函数,退出装饰器log_in ,退出装饰器log
def test():
print("test") if __name__ == "__main__":
hello()
test()
结果:
aaaa
hello
bbbb
aaaa
inaaaa
test
inbbbb
bbbb
#装饰器传入参数
def log(name=None):
def decorator(func):
def wrapper():
print("{}aaaa".format(name))
func()
print("{}bbbb".format(name))
return wrapper
return decorator
@log()
def hello():
print("hello") @log("test")
def test():
print("test....") if __name__ == "__main__":
hello()
test() 结果:
Noneaaaa
hello
Nonebbbb
testaaaa
test....
testbbbb
#装饰器传入参数
def log(name=None):
def decorator(func):
def wrapper(*args,**kwargs):
print("{}aaaa".format(name))
rest = func(*args,**kwargs)
print("{}bbbb".format(name))
print(rest)
return wrapper
return decorator @log()
def add(a,b):
return a + b @log("okok")
def add2(a,b):
return a + b if __name__ == "__main__":
add(5,6)
add2(5,6) 结果:
Noneaaaa
Nonebbbb
11
okokaaaa
okokbbbb
11
#装饰器传入参数
from functools import wraps def log(name=None):
def decorator(func):
#@wraps(func)#加入这个参数,可以还原原来函数的属性。
#要不就要加入下面那两行,或者更多
def wrapper(*args,**kwargs):
"装饰器的名字"
print("{}aaaa".format(name))
rest = func(*args,**kwargs)
print("{}bbbb".format(name))
return rest#原函数执行到这里完成后,属性改变
#wrapper.__name__ = func.__name__
#wrapper.__doc__ = func.__doc__
return wrapper
return decorator @log("okok")
def hello():
"""
hello
:return:
"""
print("hello") if __name__ == "__main__":
print("doc:{}".format(hello.__doc__))
print("name:{}".format(hello.__name__))
hello() 结果:
doc:装饰器的名字
name:wrapper
okokaaaa
hello
okokbbbb
#装饰器传入参数
from functools import wraps def log(name=None):
def decorator(func):
@wraps(func)#加入这个参数,可以还原原来函数的属性。
#要不就要加入下面那两行,或者更多
def wrapper(*args,**kwargs):
"装饰器的名字"
print("{}aaaa".format(name))
rest = func(*args,**kwargs)
print("{}bbbb".format(name))
return rest#原函数执行到这里完成后,属性改变
#wrapper.__name__ = func.__name__
#wrapper.__doc__ = func.__doc__
return wrapper
return decorator @log("okok")
def hello():
"""
hello
:return:
"""
print("hello") if __name__ == "__main__":
print("doc:{}".format(hello.__doc__))
print("name:{}".format(hello.__name__))
hello() 结果:
doc:
hello
:return: name:hello
okokaaaa
hello
okokbbbb
两个是python中的可变参数。*args表示任何多个无名参数,它是一个tuple;**kwargs表示关键字参数,它是一个 dict。并且同时使用*args和**kwargs时,必须*args参数列要在**kwargs前,像foo(a=1, b=’2′, c=3, a’, 1, None, )
这样调用的话,会提示语法错误“SyntaxError: non-keyword arg after keyword arg”。
对于一些类,都需要添加一些属性或者方法,我们可以通过装饰器,取到一个类,然后进行添加
def eat(cls):
"""吃东西装饰器"""
cls.eat = lambda self : print("{}要wowowo".format(self.name))
return cls @eat
class Cat(object):
"""猫猫猫"""
def __init__(self,name):
self.name = name if __name__ == "__main__":
cat =Cat("quan")
cat.eat() 结果:
quan要wowowo
class Power(object):
"""
迭代器,生成1 2345的平方
"""
value = 0 def __next__(self):
self.value += 1
return self.value * self.value def __iter__(self):
return self if __name__ == "__main__":
Pos = Power()
print(Pos.__next__())
print(Pos.__next__())
print(Pos.__next__())
print(Pos.__next__())
print(next(Pos))
for i in Pos:
print(i) 结果:
1
4
9
16
25
def pow():
yield 1
yield 2
yield 3
yield 4 def pow_number():
for i in [1,2,3,4]:
yield i * i if __name__ == "__main__":
# rest = pow()
# print(next(rest))
# print(next(rest))
# print(next(rest))
rest = pow_number()
print(next(rest))
print(next(rest)) #生成器也是一种迭代器,
结果:
1
4
def use_range():
for i in range(5,10):
print(i) class Iter(object):
"""使用迭代器模拟range"""
def __init__(self,start,end):
self.start = start - 1
self.end = end def __next__(self):
self.start += 1
if self.start >= self.end:
raise StopIteration
return self.start def __iter__(self):
return self if __name__ == "__main__":
use_range()
print("@@@@@@@@@@@@@@@@@@@@@@@@@@@@")
iter = Iter(5,10)
print(next(iter))
print(next(iter))
print(next(iter))
print(next(iter))
print(next(iter))
iter2 = Iter(5,10)
l = list(iter2)#也可以返回一个列表
print(l)
生成器模拟range()
def use_range():
for i in range(5,10):
print(i) class Iter(object):
"""使用迭代器模拟range"""
def __init__(self,start,end):
self.start = start - 1
self.end = end def __next__(self):
self.start += 1
if self.start >= self.end:
raise StopIteration
return self.start def __iter__(self):
return self class Gen(object):
"""生成器模拟range函数"""
def __init__(self,start,end):
self.start = start - 1
self.end = end def get_num(self):
while True:
if self.start >= self.end - 1:
break
self.start +=1
yield self.start if __name__ == "__main__":
use_range()
print("@@@@@@@@@@@@@@@@@@@@@@@@@@@@")
iter = Iter(5,10)
print(next(iter))
print(next(iter))
print(next(iter))
print(next(iter))
print(next(iter))
iter2 = Iter(5,10)
l = list(iter2)#也可以返回一个列表
print(l)
gen = Gen(5,10).get_num()
print(list(gen))
5
6
7
8
9
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
5
6
7
8
9
[5, 6, 7, 8, 9]
[5, 6, 7, 8, 9]
去掉类:
def gen_num(start,end):
start -= 1
while True:
if start >= end - 1:
break
start +=1
yield start if __name__ == "__main__":
print(list(gen_num(5,10))) 结果:
[5, 6, 7, 8, 9]
python13各种器的更多相关文章
- python13 1.函数的嵌套定义 2.global、nonlocal关键字 3.闭包及闭包的运用场景 4.装饰器
## 复习 '''1.函数对象:函数名 => 存放的是函数的内存地址1)函数名 - 找到的是函数的内存地址2)函数名() - 调用函数 => 函数的返回值 eg:fn()() =&g ...
- python笔记3 闭包 装饰器 迭代器 生成器 内置函数 初识递归 列表推导式 字典推导式
闭包 1, 闭包是嵌套在函数中的 2, 闭包是内层函数对外层函数的变量(非全局变量)的引用(改变) 3,闭包需要将其作为一个对象返回,而且必须逐层返回,直至最外层函数的返回值 闭包例子: def a1 ...
- 自定义基于 VLC 的视频播放器
前言(蛋疼的背景故事) 前段时间,接了一个小项目,有个需求是要在系统待机一段时间以后,循环播放 MV(类似于 Windows 系统的屏幕保护). 听到这个需求,我首先想到的是 MediaPlayer ...
- 【.net 深呼吸】细说CodeDom(7):索引器
在开始正题之前,先补充一点前面的内容. 在方法中,如果要引用方法参数,前面的示例中,老周使用的是 CodeVariableReferenceExpression 类,它用于引用变量,也适用于引用方法参 ...
- solr服务中集成IKAnalyzer中文分词器、集成dataimportHandler插件
昨天已经在Tomcat容器中成功的部署了solr全文检索引擎系统的服务:今天来分享一下solr服务在海量数据的网站中是如何实现数据的检索. 在solr服务中集成IKAnalyzer中文分词器的步骤: ...
- Python高手之路【四】python函数装饰器
def outer(func): def inner(): print('hello') print('hello') print('hello') r = func() print('end') p ...
- Sublime Text 3中文乱码解决方法以及安装包管理器方法
一般出现乱码是因为文本采用了GBK编码格式,Sublime Text默认不支持GBK编码. 安装包管理器 简单安装 使用Ctrl+`快捷键或者通过View->Show Console菜单打开命令 ...
- Python应用03 使用PyQT制作视频播放器
作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁任何形式转载. 最近研究了Python的两个GUI包,Tkinter和PyQT.这两个GUI包的底层分别是Tcl/ ...
- 9、 Struts2验证(声明式验证、自定义验证器)
1. 什么是Struts2 验证器 一个健壮的 web 应用程序必须确保用户输入是合法.有效的. Struts2 的输入验证 基于 XWork Validation Framework 的声明式验证: ...
随机推荐
- 安装多个版本的 JDK
安装多个版本的 JDK 刚刚开始学 Java 的时候安装了 JDK9 版本,后续发现还是 JDK8 使用的多些,而又不想删除原先版本 因此安装两个版本的 JDK 在需要是切换一下即可 1. 安装第一个 ...
- SpringMvc 中 FrameworkServlet 覆盖 service 的有点。
@Override protected void service(HttpServletRequest request, HttpServletResponse response) throws Se ...
- mybatis中的#和$的区别 以及 防止sql注入
声明:这是转载的. mybatis中的#和$的区别 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sq ...
- UltraSoft - Beta - Scrum Meeting 5
Date: May 21st, 2020. Scrum 情况汇报 进度情况 组员 负责 今日进度 q2l PM.后端 修复了课程通知链接的bug Liuzh 前端 暂无 Kkkk 前端 增加消息中心板 ...
- [no_code][Alpha]事后分析
$( "#cnblogs_post_body" ).catalog() 设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我们要解决的 ...
- [CPP] 类的内存布局
本文可以解决下面 3 个问题: 以不同方式继承之后,类的成员变量是如何分布的? 虚函数表及虚函数表指针,在可执行文件中的位置? 单一继承.多继承.虚拟继承之后,类的虚函数表的内容是如何变化的? 在这里 ...
- error: ‘int64_t’ does not name a type
我在CodeBlock中编译工程没有出现问题,但是放到ubuntu上用自己写的Makefile make的时候报错 error: 'int64_t' does not name a type # 2 ...
- configure: error: C preprocessor "arm-linux-gnueabihf-g++" fails sanity check
今天在交叉编译某个编解码库过程中碰到一个configure错误 运行configure的时候设置了一些配置项目 ./configure CC=arm-linux-gnueabihf-gcc CPP=a ...
- nod_1009 数字1的数量(分析题)
题意: 给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的个数. 例如:n = 12,包含了5个1.1,10,12共包含3个1,11包含2个1,总共5个1. Input 输入 ...
- 问题解决:补充安装c语言的库函数和系统调用man手册
问题解决:补充安装c语言的库函数和系统调用man手册 今日份麻麻~上课时大家的Ubuntu都可以通过man查到关于stat的库函数,但是我的Kali查出来是这样: 询问老师之后得知需要去安装相 ...