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 的声明式验证: ...
随机推荐
- Java-基础-ArrayList
1. 简介 ArrayList 实现了 List 接口,其底层基于数组实现容量大小动态可变.既然是数组,那么元素存放一定是有序的,并允许包括 null 在内的所有元素. 每个 ArrayList 实例 ...
- NorFlash、NandFlash在技术和应用上有些什么区别?
首先你要搞懂什么是Flash Memory? Flash Memory(快闪存储器),是一种电子式可清除程序化只读存储器的形式,允许在操作中被多次擦或写的存储器.这种科技主要用于一般性数据存储,以及在 ...
- camera HSYNC:VSYNC
HSYNC:行锁存,换行信号VSYNC:祯锁存,换页信号 320×240的屏,每一行需要输入320个脉冲来依次移位.锁存进一行的数据,然后来个HSYNC 脉冲换一行:这样依次输入240行之后换行同时来 ...
- Spring Security:Servlet 过滤器(三)
3)Servlet 过滤器 Spring Security 过滤器链是一个非常复杂且灵活的引擎.Spring Security 的 Servlet 支持基于 Servlet 过滤器,因此通常首先了解过 ...
- 高频面试题:一张图彻底搞懂Spring循环依赖
1 什么是循环依赖? 如下图所示: BeanA类依赖了BeanB类,同时BeanB类又依赖了BeanA类.这种依赖关系形成了一个闭环,我们把这种依赖关系就称之为循环依赖.同理,再如下图的情况: 上图中 ...
- JAVA笔记7__接口应用/Object类/简单工厂模式/静态代理模式/适配器模式
/** * 接口应用 */ public class Main { public static void main(String[] args) { Person p = new Person(&qu ...
- 基于 Istio 的全链路灰度方案探索和实践
作者|曾宇星(宇曾) 审核&校对:曾宇星(宇曾) 编辑&排版:雯燕 背景 微服务软件架构下,业务新功能上线前搭建完整的一套测试系统进行验证是相当费人费时的事,随着所拆分出微服务数量的不 ...
- 性能工具之代码级性能测试工具ContiPerf
前言 做性能的同学一定遇到过这样的场景:应用级别的性能测试发现一个操作的响应时间很长,然后要花费很多时间去逐级排查,最后却发现罪魁祸首是代码中某个实现低效的底层算法.这种自上而下的逐级排查定位的方法, ...
- Qt 隐藏标题栏后实现窗口拖动、设置窗口透明
隐藏标题栏 setWindowFlags(Qt::CustomizeWindowHint); setWindowFlags(Qt::FramelessWindowHint); 两个函数都可以去掉标题栏 ...
- Sqlserver中判断表是否存在
在sqlserver(应该说在目前所有数据库产品)中创建一个资源如表,视图,存储过程中都要判断与创建的资源是否已经存在 在sqlserver中一般可通过查询sys.objects系统表来得知结果,不 ...