东方耀AI技术分享
标题:
03、python中的装饰器与迭代器_笔记
[打印本页]
作者:
东方耀
时间:
2017-12-18 16:43
标题:
03、python中的装饰器与迭代器_笔记
03、python中的装饰器与迭代器
# 装饰器本质上是一个Python函数 它可以让其他函数在不需要做任何代码变动的前提下增加额外功能
# 装饰器的返回值也是一个函数对象
# 它经常用于有切面需求的场景 比如:插入日志 性能测试 权限判断等
# 有了装饰器 我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用
# 总之 装饰器的作用就是为已经存在的对象添加额外的功能
# -*- coding: utf-8 -*-
__author__ = 'dongfangyao'
__date__ = '2017/12/18 下午4:21'
__product__ = 'PyCharm'
__filename__ = 'decorator1'
def addTips(fun):
def wrap(*args, **kwargs):
print('这是操作之前')
result = fun(*args, **kwargs)
print('操作结束啦!')
return result
return wrap
@addTips
def add(x, y):
return x+y
print(add(2, 3))
复制代码
# -*- coding: utf-8 -*-
__author__ = 'dongfangyao'
__date__ = '2017/12/18 下午4:29'
__product__ = 'PyCharm'
__filename__ = 'decorator2'
def addTips(i):
def wrap1(fun):
def wrap(*args, **kwargs):
print('这是操作之前')
result = 0
if i > 10:
result = fun(*args, **kwargs)
else:
print('对不起,没有执行fun的权限')
print('操作结束啦!')
return result
return wrap
return wrap1
@addTips(11)
def add(x, y):
return x+y
print(add(2, 3))
复制代码
# -*- coding: utf-8 -*-
# 迭代器(iterator)
# 可迭代的对象:如果一个对象可以用for in 的方式遍历其内容 就是一个可迭代的对象 list tuple 字典
# 迭代器:遍历可迭代对象内容的方式
# 常见的迭代器:组合 排列 笛卡尔积 串联迭代器
可以被next()函数调用的并不断返回下一个值得对象叫做迭代器:iterator
凡是可以用作与next()函数的对象都是iterator
# -*- coding: utf-8 -*-
__author__ = 'dongfangyao'
__date__ = '2017/12/18 下午4:35'
__product__ = 'PyCharm'
__filename__ = 'iterator1'
# 排列 组合 笛卡尔积 串联迭代器
import itertools
x = range(1, 5)
y = list('abc')
# 排列
com1 = itertools.combinations(x, 3)
# 组合
com2 = itertools.permutations(x, 3)
# 笛卡尔积
com3 = itertools.product(x, y)
# 串联迭代器
com4 = itertools.chain(com1, com2, com3)
for i in com4:
print(i)
复制代码
可迭代对象与迭代器的区别
:
通过iter()将一个可迭代对象变成迭代器
list01 = [1,2,3,4,5] #是一个可迭代对象
# for i in list01:
# print(i)
# print(next(list01)) #list01不是迭代器所以无法调用 next
#通过iter()将一个可迭代对象变成迭代器
a = iter(list01)
print(a)
print(next(a))
print(next(a))
print(next(a))
复制代码
作者:
东方耀
时间:
2018-1-5 12:09
有何高见 回复在笔记帖子下
作者:
东方耀
时间:
2018-1-9 10:44
yield 生成器
生成一个迭代器
-》yield的作用是吧一个函数变成一个generator
-》使用生成器可以达到延迟操作的效果,所谓延迟操作就是指在需要的时候
产生结果而不是立即产生就结果,节省资源消耗,和声明一个序列不同的是
生成器,在不使用的时候几乎是不占内存的。
作者:
东方耀
时间:
2018-1-9 10:52
def getNum(n):
i = 0
while i <= n:
# print(i) #打印i
#return i
# #返回一个i ,结束函数的运行
yield i
#将函数变成一个generator
i+=1
# 调用函数
print(getNum(5))
#把生成器赋值给一个变量a
a = getNum(5)
# 使用生成器 通过 next()方法
print(next(a))
#输出yield返回的值
print(next(a))
print(next(a))
print(next(a))
print(next(a))
print(next(a))
# print(next(a))
复制代码
作者:
东方耀
时间:
2018-1-9 11:00
#for循环遍历一个生成器
for i in a:
print(i)
作者:
东方耀
时间:
2018-1-9 11:01
东方耀 发表于 2018-1-9 11:00
#for循环遍历一个生成器
for i in a:
print(i)
如果生成器用了next() 则for循环会接着next()的位置进行哦
作者:
东方耀
时间:
2018-1-9 11:05
def gen():
i = 0
while i < 5:
temp = yield i #是赋值操作吗?不是
#使用了yield之后是一个生成器
print(temp) #因为 yield 之后返回结果到调用者的地方,暂停运行 ,赋值操作没有运行
i+=1
a = gen()
print(next(a))
print(next(a))
print(a.send('我是a')) #可以将值发送到 上一次yield的地方
print('*'*8)
print(next(a))
复制代码
作者:
wdzhlfl
时间:
2018-2-1 09:40
python数据分析
作者:
longjiacheng
时间:
2018-3-19 21:30
66666666666666666666
作者:
longjiacheng
时间:
2018-3-19 21:30
作者:
hery_ai
时间:
2018-8-8 12:16
666666666666
作者:
kevinwei
时间:
2018-9-18 16:34
你这个结合设计模式再讲吗?我好像感觉不太对。
欢迎光临 东方耀AI技术分享 (http://www.ai111.vip/)
Powered by Discuz! X3.4