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 的声明式验证: ...
随机推荐
- 写了10000条Airtest截图脚本总结出来的截图经验,赶紧收藏!
前言 今天想先给大家分享1个小白用户的Airtest从入门到放弃的故事: 小A是一个自动化的小白,在逛测试论坛的时候,偶然间发现了Airtest这个基于图像识别的UI自动化框架. 出于好奇,小A试用了 ...
- [对对子队]会议记录4.14(Scrum Meeting 5)
今天已完成的工作 刘子航 工作内容:设计第2,3关 相关issue:设计关卡2,3 吴昭邦 工作内容:制作场景,暂时解决了坐标错位问题 相关issue:实现游戏场景中的必要模型 何瑞 ...
- 【二食堂】Alpha - Scrum Meeting 4
Scrum Meeting 4 例会时间:4.14 12:30 - 12:50 进度情况 组员 昨日进度 今日任务 李健 1. 主页面的搭建工作issue 1. 完成主页搭建**issue2. 与后端 ...
- 【二食堂】Alpha - Scrum Meeting 11
Scrum Meeting 11 例会时间:4.21 18:00~18:20 进度情况 组员 进度 今日任务 李健 1. 登录注册页面前后端对接issue 1. 登录注册页面前后端对接issue2. ...
- freemarker中使用String字符串作为模板
在日常开发中,我们有时候需要发送短信.邮件等通知,但是这些通知的内容通常都是动态的,而且可能会发生变动,为了程序的灵活性,我们通常会将通知的内容配置在页面上,然后后台通过渲染这些模板,来获取具体的内容 ...
- 调整数组顺序使奇数位于偶数前面 牛客网 剑指Offer
调整数组顺序使奇数位于偶数前面 牛客网 剑指Offer 题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇 ...
- Linux 显示ip、dns、网关等命令
在新版的ubuntu 终端里输入命令nm-tool, 想查看网络参数设置, 没想到却返回如下内容: 未找到 'nm-tool' 命令,您要输入的是否是: 命令 'dm-tool' 来自于包 'l ...
- mongoDB 的一般使用
理解 mongodb 也是nosql 的一种.他的数据存储类型是一种和json格式比较像的数据类型,可以看作就是json. mongodb 里的数据库都是一个单独的库.一般需要用的库都会设置自己的us ...
- 【java+selenium3】自动化cookie操作+图形验证码处理 (十五)
一.cookie操作 1.获取浏览器所有的cookie import java.util.Set; import org.openqa.selenium.Cookie; //获取浏览器所有的cooki ...
- Jenkins+SVN+Maven+testNG管理项目
1.登录访问:http://localhost:8080/jenkins 2.系统管理 => 全局工具配置 => ADD JDK AND Add Maven 3.安装SVN插件:系统管 ...