东方耀AI技术分享

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 4520|回复: 11
打印 上一主题 下一主题

[课堂笔记] 03、python中的装饰器与迭代器_笔记

[复制链接]

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14431
QQ
跳转到指定楼层
楼主
发表于 2017-12-18 16:43:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
03、python中的装饰器与迭代器

# 装饰器本质上是一个Python函数 它可以让其他函数在不需要做任何代码变动的前提下增加额外功能
# 装饰器的返回值也是一个函数对象
# 它经常用于有切面需求的场景 比如:插入日志 性能测试  权限判断等
# 有了装饰器 我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用
# 总之 装饰器的作用就是为已经存在的对象添加额外的功能

  1. # -*- coding: utf-8 -*-
  2. __author__ = 'dongfangyao'
  3. __date__ = '2017/12/18 下午4:21'
  4. __product__ = 'PyCharm'
  5. __filename__ = 'decorator1'


  6. def addTips(fun):
  7.     def wrap(*args, **kwargs):
  8.         print('这是操作之前')
  9.         result = fun(*args, **kwargs)
  10.         print('操作结束啦!')
  11.         return result
  12.     return wrap

  13. @addTips
  14. def add(x, y):
  15.     return x+y

  16. print(add(2, 3))
复制代码
  1. # -*- coding: utf-8 -*-
  2. __author__ = 'dongfangyao'
  3. __date__ = '2017/12/18 下午4:29'
  4. __product__ = 'PyCharm'
  5. __filename__ = 'decorator2'

  6. def addTips(i):
  7.     def wrap1(fun):
  8.         def wrap(*args, **kwargs):
  9.             print('这是操作之前')
  10.             result = 0
  11.             if i > 10:
  12.                 result = fun(*args, **kwargs)
  13.             else:
  14.                 print('对不起,没有执行fun的权限')
  15.             print('操作结束啦!')
  16.             return result
  17.         return wrap
  18.     return wrap1

  19. @addTips(11)
  20. def add(x, y):
  21.     return x+y

  22. print(add(2, 3))

复制代码




# -*- coding: utf-8 -*-
# 迭代器(iterator)
# 可迭代的对象:如果一个对象可以用for in 的方式遍历其内容 就是一个可迭代的对象 list tuple 字典
# 迭代器:遍历可迭代对象内容的方式
# 常见的迭代器:组合 排列 笛卡尔积  串联迭代器
可以被next()函数调用的并不断返回下一个值得对象叫做迭代器:iterator
        凡是可以用作与next()函数的对象都是iterator

  1. # -*- coding: utf-8 -*-
  2. __author__ = 'dongfangyao'
  3. __date__ = '2017/12/18 下午4:35'
  4. __product__ = 'PyCharm'
  5. __filename__ = 'iterator1'

  6. # 排列 组合 笛卡尔积 串联迭代器
  7. import itertools
  8. x = range(1, 5)
  9. y = list('abc')
  10. # 排列
  11. com1 = itertools.combinations(x, 3)
  12. #  组合
  13. com2 = itertools.permutations(x, 3)

  14. # 笛卡尔积
  15. com3 = itertools.product(x, y)

  16. # 串联迭代器
  17. com4 = itertools.chain(com1, com2, com3)


  18. for i in com4:
  19.     print(i)



复制代码

可迭代对象与迭代器的区别通过iter()将一个可迭代对象变成迭代器

  1. list01 = [1,2,3,4,5] #是一个可迭代对象
  2. # for i in list01:
  3. #     print(i)
  4. # print(next(list01))   #list01不是迭代器所以无法调用  next

  5. #通过iter()将一个可迭代对象变成迭代器
  6. a = iter(list01)
  7. print(a)
  8. print(next(a))
  9. print(next(a))
  10. print(next(a))
复制代码



让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14431
QQ
沙发
 楼主| 发表于 2018-1-5 12:09:23 | 只看该作者
有何高见 回复在笔记帖子下
让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14431
QQ
板凳
 楼主| 发表于 2018-1-9 10:44:46 | 只看该作者
yield 生成器
    生成一个迭代器
        -》yield的作用是吧一个函数变成一个generator
        -》使用生成器可以达到延迟操作的效果,所谓延迟操作就是指在需要的时候
        产生结果而不是立即产生就结果,节省资源消耗,和声明一个序列不同的是
        生成器,在不使用的时候几乎是不占内存的。
让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14431
QQ
地板
 楼主| 发表于 2018-1-9 10:52:03 | 只看该作者
  1. def getNum(n):
  2.     i = 0
  3.     while i <= n:
  4.         # print(i)    #打印i
  5.         #return i
  6.         # #返回一个i ,结束函数的运行
  7.         yield i
  8.         #将函数变成一个generator
  9.         i+=1
  10. # 调用函数
  11. print(getNum(5))

  12. #把生成器赋值给一个变量a
  13. a = getNum(5)
  14. # 使用生成器 通过 next()方法
  15. print(next(a))
  16. #输出yield返回的值
  17. print(next(a))
  18. print(next(a))
  19. print(next(a))
  20. print(next(a))
  21. print(next(a))
  22. # print(next(a))
复制代码
让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14431
QQ
5#
 楼主| 发表于 2018-1-9 11:00:53 | 只看该作者
#for循环遍历一个生成器
for i in a:
    print(i)
让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14431
QQ
6#
 楼主| 发表于 2018-1-9 11:01:47 | 只看该作者
东方耀 发表于 2018-1-9 11:00
#for循环遍历一个生成器
for i in a:
    print(i)

如果生成器用了next() 则for循环会接着next()的位置进行哦
让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14431
QQ
7#
 楼主| 发表于 2018-1-9 11:05:43 | 只看该作者
  1. def gen():
  2.     i = 0
  3.     while i < 5:
  4.         temp = yield i  #是赋值操作吗?不是
  5.         #使用了yield之后是一个生成器
  6.         print(temp)   #因为 yield 之后返回结果到调用者的地方,暂停运行 ,赋值操作没有运行
  7.         i+=1
  8. a = gen()
  9. print(next(a))
  10. print(next(a))
  11. print(a.send('我是a'))  #可以将值发送到 上一次yield的地方

  12. print('*'*8)
  13. print(next(a))
复制代码
让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

0

主题

98

帖子

200

积分

中级会员

Rank: 3Rank: 3

积分
200
8#
发表于 2018-2-1 09:40:46 | 只看该作者
python数据分析
回复

使用道具 举报

0

主题

190

帖子

402

积分

人工智能VIP

Rank: 9Rank: 9Rank: 9

积分
402
9#
发表于 2018-3-19 21:30:05 | 只看该作者
66666666666666666666
回复

使用道具 举报

0

主题

190

帖子

402

积分

人工智能VIP

Rank: 9Rank: 9Rank: 9

积分
402
10#
发表于 2018-3-19 21:30:51 | 只看该作者
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|人工智能工程师的摇篮 ( 湘ICP备2020019608号-1 )

GMT+8, 2024-4-25 12:13 , Processed in 0.183297 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表