|
|
51CTO旗下网站
|
|
移动端

Python的三大神器,你知道是哪三大吗?史上最详细的入门教程!

Python的三大神器:装饰器.迭代器与生成器!这就是Python的三大神器,好了废话不多说。直接来上干货吧!

作者:繁华落尽and曲终人散来源:今日头条|2018-06-08 10:18

Python的三大神器,你知道是哪三大吗?史上最详细的入门教程!

Python的三大神器:装饰器、迭代器与生成器!这就是Python的三大神器,好了废话不多说。直接来上干货吧!

生成器

仅仅拥有生成某种东西的能力,如果不用__next__方法是获取不到值得。

创建一个生成器函数

  1. >>> 
  2.  def scq():... print("11")# 当函数代码块中遇到yield关键字的时候,这个函数就是一个生成器函数... yield  
  3. 1... print("22")... yield 2... print("33")... yield 3... 

把生成器赋值给一个对象

  1. >>> r = scq() 

查看r的苏剧类型并且输出r的值

  1. >>> print(type(r),r)<class 'generator'> <generator object scq at 0x000001F117D8DF10> 

当执行生成器的__next__的时候,代码会按照顺序去执行,当执行到yield时会返回并提出,yield后面的值就是返回值,然后记录代码执行的位置,并退出

Python的三大神器,你知道是哪三大吗?史上最详细的入门教程!

Python的三大神器,你知道是哪三大吗?史上最详细的入门教程!

执行结果

  1. C:Python35python.exe F:/Python_code/sublime/Week5/Day03/s1.py0 1 2 3 4Process finished with exit code 0 

迭代器

具有访问生成器的能力,可以访问到生成器的值,类似于生成器的__next__方法,一个一个值一个值得去迭代,只能够按照顺序的去查找。

特点:

  1. 访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容
  2. 不能随机访问集合中的某个值 ,只能从头到尾依次访问
  3. 访问到一半时不能往回退
  4. 便于循环比较大的数据集合,节省内存

优化上面range或xrange的生成器

  1. def 
  2.  irange(start, stop, step=1): while start != stop: yield start start +=  
  3. step  else:  raise StopIteration for n in irange(1, 10):  
  4. """for循环只要遇到StopIteration就会停止"""  print(n)ret = irange(1, 20) print(ret) 
  5.  # 返回一个生成器,相当于只在内存中创建了一个值 print(list(ret)) # 如果想要得到全部的值,变成列表就可以 
  6. /Library/Frameworks/Python.framework/Versions/3.5/bin/python3.5 /Users/ansheng/MyPythonCode/hello.py 
  7. <generator object irange at 0x1021df7d8> 
  8. [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] 
  9.  
  10. Process finished with exit code 0 

Python之装饰器

Python的三大神器,你知道是哪三大吗?史上最详细的入门教程!

现要在执行func这个函数前后执行一些操作,就可以创建一个装饰器来实现:

  1. #!/usr/bin/env python 
  2. # _*_ coding: utf-8 _*_ 
  3.  
  4. def decorator(func): # 创建一个装饰器函数,接受的参数arg参数就是func函数名 
  5.  
  6. def inner(*args, **kwargs): 
  7. print("执行函数之前"
  8. ret = func(*args, **kwargs) 
  9. print("执行函数之后"
  10. return ret 
  11.  
  12. return inner 
  13.  
  14. @decorator # 如果要让某个函数使用装饰器,只需要在这个函数上面加上@+装饰器名 
  15. def func(arg): 
  16. print(arg) 
  17.  
  18. func("Hello World!"

输出结果为:

  1. /usr/bin/python3.5 /home/ansheng/Documents/PycharmProjects/blogcodes/装饰器.py 
  2. 执行函数之前 
  3. Hello World! 
  4. 执行函数之后 
  5.  
  6. Process finished with exit code 0 

多个装饰器装饰同一个函数

  1. #!/usr/bin/env python 
  2. # _*_ coding: utf-8 _*_ 
  3.  
  4. def decorator1(func): 
  5. def inner(): 
  6. print("开始之前执行装饰器01"
  7. ret = func() 
  8. print("结束之后执行装饰器01"
  9. return ret 
  10.  
  11. return inner 
  12.  
  13.  
  14. def decorator2(func): 
  15. def inner(): 
  16. print("decorator2>>>Start..."
  17. ret = func() 
  18. print("decorator2>>>End..."
  19. return ret 
  20.  
  21. return inner 
  22.  
  23.  
  24. @decorator1 
  25. @decorator2 
  26. def index(): 
  27. print("执行函数..."
  28.  
  29. index() 

输出结果:

  1. /usr/bin/python3.5 /home/ansheng/Documents/PycharmProjects/blogcodes/装饰器.py 
  2. 开始之前执行装饰器01 
  3. decorator2>>>Start... 
  4. 执行函数... 
  5. decorator2>>>End... 
  6. 结束之后执行装饰器01 
  7.  
  8. Process finished with exit code 0 

更多实例

  1. #!/usr/bin/env python 
  2. # _*_ coding:utf-8 _*_ 
  3.  
  4. # Created by 安生 on 2017/2/9 
  5.  
  6. ""
  7. 函数装饰器 
  8. "" 
  9.  
  10. def decorator(func): 
  11. def wrapped(*args, **kwargs): 
  12. return func(*args, **kwargs) 
  13.  
  14. return wrapped  
  15.  
  16. @decorator 
  17. def func(a, b): 
  18. return a + b  
  19.  
  20. print(func(1, 2)) 
  21. ""
  22. 类装饰器 
  23. "" 
  24.  
  25. class decorator: 
  26. def __init__(self, func): 
  27. self.func = func 
  28.  
  29. def __call__(self, *args, **kwargs): 
  30. return self.func(*args, **kwargs)  
  31.  
  32. @decorator 
  33. def func(a, b): 
  34. return a + b  
  35.  
  36. print(func(1, 2)) 
  37. ""
  38. 带参数的函数装饰器 
  39. "" 
  40.  
  41. def parameter(a, b): 
  42. print(a, b) 
  43.  
  44. def decorator(func): 
  45. def wrapped(*args, **kwargs): 
  46. return func(*args, **kwargs) 
  47.  
  48. return wrapped  
  49. return decorator  
  50.  
  51. @parameter(1, 2) 
  52. def func(a, b): 
  53. return a + b 
  54.  
  55.  
  56. print(func(10, 20)) 
  57. ""
  58. 带参数的类装饰器 
  59. "" 
  60.  
  61. def parameter(a, b): 
  62. print(a + b) 
  63.  
  64. class decorator: 
  65. def __init__(self, func): 
  66. self.func = func 
  67.  
  68. def __call__(self, *args, **kwargs): 
  69. return self.func(*args, **kwargs) 
  70.  
  71. return decorator  
  72.  
  73. @parameter(1, 2) 
  74. def func(a, b): 
  75. return a + b  
  76.  
  77. print(func(10, 20)) 
  78.  
  79. ""
  80. 带参数的类装饰器 
  81. ""
  82.  
  83.  
  84. def parameter(a, b): 
  85. print(a, b) 
  86.  
  87. def decorator(cls): 
  88. class wrapped: 
  89. def __init__(self, *args, **kwargs): 
  90. self.cls = cls(*args, **kwargs) 
  91.  
  92. def __getattr__(self, item): 
  93. return getattr(self.cls, item) 
  94.  
  95. return wrapped 
  96.  
  97. return decorator  
  98.  
  99. @parameter(1, 2) 
  100. class CLS: 
  101. def __init__(self): 
  102. self.a = 'a' 
  103.  
  104. def P(self, v): 
  105. print(v) 
  106.  
  107.  
  108. obj = CLS() 
  109. print(obj.a) 
  110. obj.P('Hello,'
  111.  
  112. ""
  113. 为函数中和类中的方法添加装饰器 
  114. "" 
  115.  
  116. def Call(aClass): 
  117. calls = 0 
  118.  
  119. def onCall(*args, **kwargs): 
  120. nonlocal calls 
  121. calls += 1 
  122. print('call %s to %s' % (calls, func.__name__)) 
  123. return aClass(*args, **kwargs) 
  124.  
  125. return onCall  
  126.  
  127. @Call 
  128. def func(a, b): 
  129. return a + b  
  130.  
  131. print(func(1, 2))  
  132.  
  133. class CLS: 
  134. def __init__(self): 
  135. self.a = 'a' 
  136.  
  137. @Call 
  138. def b(self): 
  139. return self.a  
  140.  
  141. obj = CLS() 
  142. print(obj.b()) 
     

【编辑推荐】

  1. 6个最高效的语言处理Python库,你用过几个?
  2. 5个Python脚本优化你的网站搜索引擎优化
  3. 如果高考考Python,这些题目你会做吗?
  4. Python与PHP、Java等4大流行语言过招,谁更胜一筹?
  5. 与Java、PHP 、C#相比,为什么Python薪资更高?
【责任编辑:庞桂玉 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

无懈可击的Web设计

一个网站,无论视觉上多美观或者内容多丰富,如果它不能适应各种浏览情况并能面向尽可能广泛的用户群,那它就不算是真正成功的网站。本书提...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊