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各种器的更多相关文章

  1. python13 1.函数的嵌套定义 2.global、nonlocal关键字 3.闭包及闭包的运用场景 4.装饰器

    ## 复习   '''1.函数对象:函数名 => 存放的是函数的内存地址1)函数名 - 找到的是函数的内存地址2)函数名() - 调用函数 => 函数的返回值  eg:fn()() =&g ...

  2. python笔记3 闭包 装饰器 迭代器 生成器 内置函数 初识递归 列表推导式 字典推导式

    闭包 1, 闭包是嵌套在函数中的 2, 闭包是内层函数对外层函数的变量(非全局变量)的引用(改变) 3,闭包需要将其作为一个对象返回,而且必须逐层返回,直至最外层函数的返回值 闭包例子: def a1 ...

  3. 自定义基于 VLC 的视频播放器

    前言(蛋疼的背景故事) 前段时间,接了一个小项目,有个需求是要在系统待机一段时间以后,循环播放 MV(类似于 Windows 系统的屏幕保护). 听到这个需求,我首先想到的是 MediaPlayer ...

  4. 【.net 深呼吸】细说CodeDom(7):索引器

    在开始正题之前,先补充一点前面的内容. 在方法中,如果要引用方法参数,前面的示例中,老周使用的是 CodeVariableReferenceExpression 类,它用于引用变量,也适用于引用方法参 ...

  5. solr服务中集成IKAnalyzer中文分词器、集成dataimportHandler插件

    昨天已经在Tomcat容器中成功的部署了solr全文检索引擎系统的服务:今天来分享一下solr服务在海量数据的网站中是如何实现数据的检索. 在solr服务中集成IKAnalyzer中文分词器的步骤: ...

  6. Python高手之路【四】python函数装饰器

    def outer(func): def inner(): print('hello') print('hello') print('hello') r = func() print('end') p ...

  7. Sublime Text 3中文乱码解决方法以及安装包管理器方法

    一般出现乱码是因为文本采用了GBK编码格式,Sublime Text默认不支持GBK编码. 安装包管理器 简单安装 使用Ctrl+`快捷键或者通过View->Show Console菜单打开命令 ...

  8. Python应用03 使用PyQT制作视频播放器

    作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁任何形式转载. 最近研究了Python的两个GUI包,Tkinter和PyQT.这两个GUI包的底层分别是Tcl/ ...

  9. 9、 Struts2验证(声明式验证、自定义验证器)

    1. 什么是Struts2 验证器 一个健壮的 web 应用程序必须确保用户输入是合法.有效的. Struts2 的输入验证 基于 XWork Validation Framework 的声明式验证: ...

随机推荐

  1. Java:AQS 小记-2(ReentrantLock)

    Java:AQS 小记-2(ReentrantLock) 整体结构 ReentrantLock 类图 AbstractOwnableSynchronizer 类 public abstract cla ...

  2. MySQL:基础语法-3

    MySQL:基础语法-3 记录一下 MySQL 基础的一些语法,便于查询,该部分内容主要是参考:bilibili 上 黑马程序员 的课程而做的笔记,由于时间有点久了,课程地址忘记了 上文MySQL:基 ...

  3. [技术博客]在团队中使用Pull Request来管理代码

    在团队中使用Pull Request来管理代码 前言 在参加多人共同开发项目,且选用Git作为代码托管工具的时候,我们不免会遇到分支冲突.覆盖.合并等问题.显然,因为同一个仓库是属于大家的,所以每个人 ...

  4. Seata整合SpringBoot和Mybatis

    Seata整合SpringBoot和Mybatis 一.背景 二.实现功能 三.每个服务使用到的技术 1.账户服务 2.订单服务 四.服务实现 1.账户服务实现 1.引入jar包 2.项目配置 3.建 ...

  5. vs2010中使用命令行参数

    使用VS2010增加命令参数的时候老是不起作用,后面经过研究发现,所要增加的命令参数是一个相对文件路径,而默认的工作目录里面没有该文件,所以就没有找到,需要修改工作目录,这样命令行参数才能够起作用.

  6. Python课程笔记(九)

    本次课程主要学习了Excel和JSON格式的一些读写操作.课程代码 一.Excel数据读写操作 1.安装模块 pip install xlrd pip install xlwt 网不好可以采用三方库: ...

  7. 洛谷 P4555 [国家集训队]最长双回文串

    链接: P4555 题意: 在字符串 \(S\) 中找出两个相邻非空回文串,并使它们长度之和最大. 分析: 直接使用马拉车算法求出每个点扩展的回文串.如果枚举两个回文串显然会超时,我们考虑切割一个长串 ...

  8. 『学了就忘』Linux基础 — 8、虚拟机网络模式说明

    目录 1.虚拟机网卡 2.网络连接模式对应工作的网卡 3.桥接模式说明 4.补充说明 这篇主要总结一下虚拟机网络配置中桥接模式.NAT模式和仅主机模式的区别. 打开VMware,选中虚拟机,点击网络适 ...

  9. 树的子结构 牛客网 剑指Offer

    树的子结构 牛客网 剑指Offer 题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) # class TreeNode: # def __init_ ...

  10. cf20B Equation(认真仔细题)

    题意: 求AX^2+BX+C=0的根 思路: 考虑到A,B,C所有可能的情况 代码: double a,b,c; int main(){ cin>>a>>b>>c; ...