• Python之freshman04


    一、迭代器

      我们已经知道,可以直接作用于for循环的数据类型有以下几种:

      一类是集合数据类型,如listtupledictsetstr等;

      一类是generator,包括生成器和带yield的generator function。

      这些可以直接作用于for循环的对象统称为可迭代对象:Iterable

      可以使用isinstance()判断一个对象是否是Iterable对象:

    特点:

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

    二、生成器

      一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator),如果函数中包含yield语法,那这个函数就会变成生成器

    要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator:

    >>> L = [x * x for x in range(10)]
    >>> L
    [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
    >>> g = (x * x for x in range(10))
    >>> g
    <generator object <genexpr> at 0x1022ef630>

      创建Lg的区别仅在于最外层的[]()L是一个list,而g是一个generator。

      我们可以直接打印出list的每一个元素,但我们怎么打印出generator的每一个元素呢?

      如果要一个一个打印出来,可以通过next()函数获得generator的下一个返回值:

      yield的主要效果呢,就是可以使函数中断,并保存中断状态,中断后,代码可以继续往下执行,过一段时间还可以再重新调用这个函数,从上次yield的下一句开始执行

           *可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。 

      生成器都是Iterator对象,但listdictstr虽然是Iterable,却不是Iterator

      把listdictstrIterable变成Iterator可以使用iter()函数:

     1 import time
     2   def consumer(name):
     3      print("%s 准备吃包子了!" %name)
     4     while True:
     5         baozi = yield                    # yield 通过 send()方法接收值
     6         print("包子[%s]来了,被[%s]吃了" %(baozi,name))
     7 
     8 def producer(name):
     9     c1 = consumer('A')
    10     c2 = consumer('B')
    11      c3 = consumer('C')
    12 
    13     c1.__next__()
    14    c2.__next__()
    15      c3.__next__()
    16 
    17    print("%s 开始准备做包子了!" % name)
    18 
    19     for i in range(10):
    20         time.sleep(1)
    21          print('做了3个包子')
    22         c1.send(i)
    23         c2.send(i)
    24          c3.send(i)
    25  
    26  producer('hh')

    为什么listdictstr等数据类型不是Iterator

    这是因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。

    Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。

    三。装饰器

     1 # 验证登陆
     2 def login(func):
     3     def inner(*args,**kwargs):
     4         print("login success...")
     5         return func(*args,**kwargs)
     6     return inner
     7 
     8 # 验证是否是会员用户
     9 def member(func):
    10     def inner(*args,**kwargs):
    11         print("welcome member...")
    12         return func(*args,**kwargs)
    13     return inner
    14 
    15 def home():
    16     print("welcome to Home...")
    17 
    18 # @login内部会执行一下操作:
    19 # 1.执行login函数,并将 @login 下面的 函数 作为login函数的参数,即:@login 等价于 login(movie)
    20 # 2.•将执行完的 login 函数返回值赋值给@login下面的函数的函数名
    21 @login
    22 @member
    23 def movie(name,passwd):
    24     print("welcome [%s] [%s] to movie...." % (name,passwd))
    25 
    26 @member
    27 @login
    28 def music(name):
    29     print("welcome [%s] to music..." % name)
    30 
    31 movie('huhuan','123')
    32 music('huhuan')
    33 home()

    四。json & pickle数据化序列

    参考 http://www.cnblogs.com/alex3714/articles/5161349.html

  • 相关阅读:
    Android 异步请求通用类
    Android 异步下载
    Eclipse 使用 VS Emulator for android 调试环境配置 步骤
    android ListView 可缩放,支持左右上下手势
    安卓中自定义控件引用
    java中的可释放资源定义,类似c#中的using
    java 实现自定义事件
    c# android 全局捕获未处理异常
    java android 捕获未处理异常
    java 中异常处理示例并捕获完整异常内容
  • 原文地址:https://www.cnblogs.com/Dummer/p/8592009.html
Copyright © 2020-2023  润新知