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 的声明式验证: ...
随机推荐
- 谈谈BEM规范(含代码)
css规范之BEM规范 前言 引用一句经典名言在编程的世界里其中一件最难的事情就是命名,不管是设计到编程语言还是标记语言都会有命名的需求.今天聊的就是关于css的命名规范的发展过程以及演变. 命名的发 ...
- 2020BUAA软工个人博客作业-软件案例分析
2020BUAA软工个人博客作业-软件案例分析 17373010 杜博玮 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人博客作业-软件案例分 ...
- 用cmd命令行创建vue项目模板
1.进入cmd命令行 输入存放项目的位置 2.通过vue create 项目名称 创建项目 3.选择Manually select features 4.通过空格选中第1.2.5.6.7.去掉8 4. ...
- windows下wchar_t的问题
使用vs新建工程或者编译工程的时候默认在编译设置里面讲wchar_t设置为内置类型,如下图: 但是在编译相互依赖的工程的时候,如果有的工程不将wchar_t设置为内置类型的时候,将会出现链接错误,需要 ...
- vs2015 MSB600 "inf2cat.ext"已退出,代码为2
使用vs2015编译XDMA驱动过程中,报如下错误: vs2015 MSB600 "inf2cat.ext"已退出,代码为2 在使用Qt编译PCIE码表的过程中,出现C1038:无 ...
- cf16E Fish(状压DP)
题意: N只FISH.每个回合会有一只FISH吃掉另一个FISH.直到池塘里只剩一只FISH. 给出aij:第i只FISH吃掉第J只FISH的概率. 问每一只FISH是最后存活者的概率. Input ...
- 刷题日记-JZ25合并有序链表
合并有序链表 递归方式合并链表pHead1,pHead2 base case是 pHead1为空或者pHead2为空 递归方式是 如果pHead1->val < pHead2->va ...
- JDK 之 Arrays.asList - 源码分析
Arrays工具类提供了一个方法asList, 使用该方法可以将一个变长参数或者数组转换成List . 其源代码如下: @SafeVarargs public static <T> Lis ...
- java框架面试高频问题(SpringMVC)
1.SpringMVC是什么? 请说出你对它的理解? SpringMVC是Spring将Web层基于MVC封装后的框架. 在没有SpringMVC之前,Web层的Servlet负责的事情很多,很杂. ...
- 如何正确的找BUG
什么是BUG 漏洞是在硬件.软件.协议的具体实现或系统安全策略上存在的缺陷,从而可以使攻击者能够在未授权的情况下访问或破坏系统.具体举例来说,比如在Intel Pentium芯片中存在的逻辑错误,在S ...