1.迭代器与生成器

1.1 迭代器

  • 基础的迭代器初始和访问
i = iter('abc')
print(i.__next__())
print(i.__next__())
print(i.__next__())
for i in iter('abc'):print(i)
  • 针对类的时候,需要__iter__(self)__next__(self)结合。并且,使用raise stopIteration来停止迭代器。
class MyIterator(object):def __init__(self):self.a = 0self.b = 1def __iter__(self):return selfdef __next__(self):self.a,self.b = self.b,self.a+self.bif self.a>100000:raise StopIteration # 这样就会自动停止return self.a
for n in MyIterator():print(n)

1.2 生成器

  • 生成器:yield。访问:obj.__next__()

2. 闭包

  1. 注意闭包的用法:返回内部函数
  2. func是函数引用,func()是函数调用
def greeting_conf(prefix):def greeting(name):print (prefix, name)return greeting
mGreeting = greeting_conf("Good Morning") # 现在的mGreeting是function:greeting
print ("function name is:", mGreeting.__name__)
print ("id of mGreeting is:", id(mGreeting))
print()
aGreeting = mGreeting("Good Afternoon")
print ("inner function returns:",aGreeting)
print ("id of aGreeting is:", id(aGreeting))

3. 装饰器

3.1 类方法:@classmethod AND @staticmethod

  • 避免实例化,可以直接调用类的方法。
class MyClass:bar = 1def foo(self):print('MyClass')@classmethod #避免硬编码def classFoo(cls):print('classFoo',end=" ")print(cls.bar)cls().foo()# cls.foo() # 这种调用会报错。没有self@staticmethoddef staticFoo():print('staticFoo',end=" ")print(MyClass.bar)MyClass().foo()# MyClass.foo() # 这种调用会报错。没有self
# 不用实例化,直接调用
MyClass.classFoo()
MyClass.staticFoo()

3.2 @property类装饰器

  • @property相当于get,对应的之后的装饰器,都需要 func+setter/deleter
class MyClass:def __init__(self):self.__x = None@propertydef x(self):return self.__x@x.setterdef x(self,value):self.__x = value@x.deleterdef x(self):del self.__xmyclass = MyClass()
print(myclass.x) # 调用@property
myclass.x = 100 # 调用@x.deleter
print(myclass.x)
del(myclass.x) # 调用@x.deleter
try:print(myclass.x)
except Exception as error:print('Fail',error)

3.3 自定义装饰器

虽然有很多对装饰器的理解,但是,楼主还是觉得,装饰器是对函数行为的定义。(#^.^#)

  • 最简单的装饰器,闭包+函数参数
def log(func):# 最基础的装饰器def wrapper(*args,**kw):print("call %s();" % func.__name__)# return func(*args,**kw) # 可以不注释掉,就会调用return wrapper
@log
def now():print("Now")
now()
  • 带参数的装饰器:3层封装,注意声明的时候必须有括号!!!
def log(text="我是默认文本"):# 带参数的装饰器def decorator(func):def wrapper(*args,**kw):print(func.__name__)return func(*args,**kw)return wrapperreturn decorator
@log() #注意:有参数的装饰器声明的时候,必须有括号
def now():print("Now")
now()
  • 下面这个算是很有用的装饰器用法,定义了函数行为。
def Before(request, kargs):print('before')
def After(request, kargs):print('after')
def Filter(before_func, after_func):def outer(main_func):def wrapper(request, kargs):before_result = before_func(request, kargs)if (before_result != None):return before_resultmain_result = main_func(request, kargs)if (main_result != None):return main_resultafter_result = after_func(request, kargs)if (after_result != None):return after_resultreturn wrapperreturn outer
@Filter(Before, After)
def Index(request, kargs):print('index')
Index(1,2)

输出结果:

before
index
after

欢迎进一步交流本博文相关内容:
GitHub地址 :https://github.com/AsuraDong/Blog
CSDN地址 : http://blog.csdn.net/asuradong
简书地址:http://www.jianshu.com/u/d1570f4a618a
博客园地址 : http://www.cnblogs.com/AsuraDong/(不一定及时更新)
也可以致信进行交流 : xiaochiyijiu@163.com
欢迎关注个人微博:http://weibo.com/AsuraDong
欢迎转载 , 但请指明出处  :  )


三神器-迭代器、生成器和装饰器相关推荐

  1. python全栈开发—什么是迭代器生成器、装饰器、数据序列化,建议收藏

    迭代器&生成器 装饰器 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 孩子,我现在有个需求,看列表[0, 1, 2, 3, 4, 5, 6, 7, ...

  2. Day4 - 迭代器生成器、装饰器、Json pickle 数据序列化、软件目录结构规范

    ---恢复内容开始--- 本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表 ...

  3. Python 三大利器:迭代器、生成器、装饰器

    Python 中的三大利器包括: 迭代器.生成器.装饰器,利用好它们才能开发出最高性能的代码,涉及到的内置模块 itertools 提供迭代器相关的操作. 迭代器 迭代是Python最强大的功能之一, ...

  4. python迭代器、生成器及装饰器

    迭代器         迭代是Python最强大的功能之一,是访问集合元素的一种方式:迭代器是一个可以记住遍历的位置的对象:迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能 ...

  5. Python基础(八)--迭代,生成器,装饰器与元类

    目录 Python基础(八)--迭代,生成器,装饰器与元类 1 迭代 1.1 可迭代对象与迭代器 1.2 自定义迭代类型 1.3 迭代合体 2 生成器 2.1 什么是生成器 2.2 生成器表达式 2. ...

  6. python之路6-迭代器、生成器、装饰器

    1.迭代器&生成器 列表生成式 现在有个需求,列表[1,2,3,4,5,6,7,,8,9],要求把列表里的每个值加1,如何实现? 方法一: list = [1,2,3,4,5,6,7,8,9] ...

  7. 递归函数、生成器、装饰器

    递归函数.生成器.装饰器 递归:  在函数执行中调用自身 必须有边界条件,递归前进段和递归返回段 python中递归有层次限制 递归函数实现阶乘 def fact(n): if n <= 1:r ...

  8. python 生成器装饰器_对Python生成器、装饰器、递归的使用详解

    1.Python生成器表达式 1).Python生成器表达式 语法格式: (expr for iter_var in iterable) (expr for iter_var in iterable ...

  9. Python三大神器(迭代器、生成器、装饰器)和csv文件操作

    三大神器和csv文件操作 迭代器 1.什么是迭代器(iter) 迭代器是容器型数据类型 特点: 无法通过打印迭代器查看元素.也无法统计元素个数 需要使用元素的时候必须将元素从迭代器中取出,取出以后该元 ...

最新文章

  1. 「镁客·请讲」深睿医疗乔昕:AI医疗才起步,说变革尚早
  2. 牛客题霸 NC5 二叉树根节点到叶子节点的所有路径和
  3. Metal之简单渲染动态切换屏幕颜色
  4. 超级高铁Hyperloop进入新阶段,将在华盛顿破土动工!
  5. 非x面容解锁插件ios13_iOS13.5 Beta3 推送,戴口罩解锁更加方便
  6. 买买买!!!电商促销必备的气氛PSD分层海报
  7. 每日一拍:linux升级python2.x到python3.x
  8. SpringBoot使用Swagger2实现Restful API
  9. 从CUBIC/BBR的TCP ACK失速说起
  10. 设置mybatis 的sql 打印
  11. java中什么是实例化
  12. matConvNet学习-使用GPU
  13. beetl模板使用场景_BeetlSQL3性能
  14. 手表开发的isFinishing
  15. 嗅探器c语言源码,自己做的嗅探器
  16. Exploring Pre-trained Language Models for Event Extraction and Generation 论文阅读
  17. mysql查询低效语句_MySQL数据库中查找执行从命慢的SQL语句
  18. springboot毕业设计 基于springboot医院预约挂号系统毕业设计设计与实现参考
  19. 数据防泄密(DLP)系统
  20. Abbexa低样本量鸡溶菌酶 C (LYZ) ELISA 试剂盒

热门文章

  1. 是否有唯一的 Android 设备 ID?
  2. ⭐️Python实用小工具之制作酷炫二维码(有界面、附源码)⭐️
  3. ant design Vue 纯前端实现分页
  4. Valley Blue Pasture《谷蓝尼牧场》签到可领大红包
  5. linux bin目录下存放的什么,Linux_Linux根目录下主要目录功能说明,/bin:存放最常用命令;   /b - phpStudy...
  6. 数星星 Stars 题解
  7. c语言中用递推法解决渔夫问题,递归、递推 - IT小冰的个人空间 - OSCHINA - 中文开源技术交流社区...
  8. HDU 6148 - Valley Numer(数位DP)
  9. 数据服务门槛再提升,这个“TOP1玩家”凭何再度领军?
  10. 即兴小探华为开源行业领先大数据虚拟化引擎openLooKeng