温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Python生成器怎么使用

发布时间:2021-11-23 17:01:13 来源:亿速云 阅读:228 作者:iii 栏目:编程语言

本篇内容介绍了“Python生成器怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

生成器

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

创建一个生成器函数

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

把生成器赋值给一个对象

>>> r = scq()

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

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

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

Python生成器怎么使用

Python生成器怎么使用

执行结果

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

迭代器

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

特点:

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容

  3. 不能随机访问集合中的某个值 ,只能从头到尾依次访问

  4. 访问到一半时不能往回退

  5. 便于循环比较大的数据集合,节省内存

优化上面range或xrange的生成器

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

Python之装饰器

Python生成器怎么使用

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

#!/usr/bin/env python # _*_ coding: utf-8 _*_  def decorator(func): # 创建一个装饰器函数,接受的参数arg参数就是func函数名  def inner(*args, **kwargs): print("执行函数之前") ret = func(*args, **kwargs) print("执行函数之后") return ret  return inner  @decorator # 如果要让某个函数使用装饰器,只需要在这个函数上面加上@+装饰器名 def func(arg): print(arg)  func("Hello World!")

输出结果为:

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

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

#!/usr/bin/env python # _*_ coding: utf-8 _*_  def decorator1(func): def inner(): print("开始之前执行装饰器01") ret = func() print("结束之后执行装饰器01") return ret  return inner   def decorator2(func): def inner(): print("decorator2>>>Start...") ret = func() print("decorator2>>>End...") return ret  return inner   @decorator1 @decorator2 def index(): print("执行函数...")  index()

输出结果:

/usr/bin/python3.5 /home/ansheng/Documents/PycharmProjects/blogcodes/装饰器.py 开始之前执行装饰器01 decorator2>>>Start... 执行函数... decorator2>>>End... 结束之后执行装饰器01  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()) 
     

“Python生成器怎么使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI