zoukankan      html  css  js  c++  java
  • python day12

    迭代器
    可迭代对象
    内部含有__iter__方法的就是可迭代对象,遵循可迭代协议。 
     
    可迭代协议:
    假如我们自己写了一个数据类型,希望这个数据类型里的东西也可以使用for被一个一个的取出来,那我们就必须满足for的要求。这个要求就叫做“协议”。
     
    可以被迭代要满足的要求就叫做可迭代协议。可迭代协议的定义非常简单,就是内部实现了__iter__方法。
    dir:查看对象所有方法
     
    # print(dir('123')) # '__iter__'----------------------------True
    # print('__iter__' in dir([1, 2, 3]))---------------------------True
    # print('__iter__' in dir({'name':'alex'}))---------------------------True
    # print('__iter__' in dir({'name'}))---------------------------True
    # print('__iter__' in dir((1, 2, 3)))---------------------------True
    # print('__iter__' in dir(1)) --------------------------- False
    # print('__iter__' in dir(True))--------------------------- False 
     
    什么是迭代器?  
     
      可迭代对象通过__iter__()可以转换成迭代器,满足迭代器协议。  
      内部含有__iter__且__next__方法的就是迭代器。# l = [1, 2, 3]
    # l_obj = l.__iter__()
    # print(l_obj) 
     
    迭代器的取值两种方法:
    l = [1, 2, 3]l_obj= l.__iter__()
    print(l_obj)------------------<list_iterator object at 0x000002B84DE73748>
     
    方法一:
    __next__()print(l_obj.__next__())-------------1
    print(l_obj.__next__())-------------2
    print(l_obj.__next__())-------------3
     
    方法二 for循环foriinl_obj:print(i)print('__next__'indir(l_obj))
    -------------1
         2
            3        
               True
    第二种判断方法:from collections import Iterable
    from collections import Iterator
    print(isinstance('123', Iterable))
    print(isinstance('123', Iterator)) 
     
    迭代器:  
      1,节省内存  
      2,满足惰性机制  
      3,取值过程单向不可逆(一条路走到黑) 
     
    迭代器遵循迭代器协议:必须拥有__iter__方法和__next__方法。
     
    for循环,能遍历一个可迭代对象,他的内部到底进行了什么?
    -将可迭代对象转化成迭代器。(可迭代对象.__iter__())
    -内部使用__next__方法,一个一个取值。
    -加了try异常处理功能,取值到底后自动停止,防止报错。
     
    用while循环模拟for循环:
    l = [1, 2, 3, 4, 5]l_obj= l.__iter__()
    whileTrue:
      try:
      print(l_obj.__next__())
      except Exception:
      break
    ------------1
                2
                3
                4
                5
     
    生成器
     
    生成器本质也是迭代器,生成器是自己用python构建的迭代器  
     

    next-send

    1,send具有next功能  
    2,send可以给上一个yield传值。  
    3,第一个取值不会使用send  
    4,最后一个yield不会得到send的值、 列表推导式:  
    能用列表推导式完成的,用python代码都可以完成。用一句话构建一个你想要的列表。  
    优点:简单,稍微难理解  
    缺点:不能用debug

     
    列表推导式 :简单明了,但是占内存生成器表达式:节省内存,报错不易看出
    30以内所有能被3整除的数的平方
    print([i*iforiinrange(1, 31)ifi % 3 ==0])-------------[9, 36, 81, 144, 225, 324, 441, 576, 729, 900]
     
     
     
    day13作业默写
    1,整理今天的博客,写课上代码,整理流程图。
    2,用列表推导式做下列小题
    (1)过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母
    li = [i.upper()foriin['dfsf','fskjf','fs','f']iflen(i) < 3]print(li)


    (2)求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元祖列表
    li = [(x,y)forxinrange(0,6)foryinrange(0,6)ifx % 2 == 0ify % 2 == 1]print(li)


    (3)求M中3,6,9组成的列表
    M = [[1,2,3],[4,5,6],[7,8,9]]li= [i[-1]foriinM]print(li)


    (4)求出50以内能被3整除的数的平方,并放入到一个列表中。
    li = [i*iforiinrange(50)ifi % 3 ==0]print(li) 

    (5)构建一个列表:['python1期', 'python2期', 'python3期', 'python4期', 'python6期', 'python7期', 'python8期', 'python9期', 'python10期']
    li = ['python%s期'%iforiinrange(1,11)]print(li) 

    (6)构建一个列表:[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]
    li = [(x,y)forxinrange(6)foryinrange(7)ifx == y - 1]print(li) 

    (7)构建一个列表:[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
    li = [iforiinrange(19)ifi % 2 ==0]print(li) 

    (8)有一个列表l1 = ['alex', 'WuSir', '老男孩', '太白']将其构造成这种列表['alex0', 'WuSir1', '老男孩2', '太白3']
    l1 = ['alex','WuSir','老男孩','太白']li= [l1[i] + str(i)foriinrange(len(l1))]print(li) 

    (9)有以下数据类型:
    x = {
    'name':'alex',
    'Values':[{'timestamp':1517991992.94,
    'values':100,},
    {'timestamp': 1517992000.94,
    'values': 200,},
    {'timestamp': 1517992014.94,
    'values': 300,},
    {'timestamp': 1517992744.94,
    'values': 350},
    {'timestamp': 1517992800.94,
    'values': 280}
    ],}
    将上面的数据通过列表推导式转换成下面的类型:
    [[1517991992.94, 100], [1517992000.94, 200], [1517992014.94, 300], [1517992744.94, 350], [1517992800.94, 280]]
    li= [[x['Values'][i]['timestamp'],x['Values'][i]['values']]foriinrange(len(x['Values']))]print(li)
    lst=[[i['timestamp'],i['values']]foriinx['Values']]print(lst) 
  • 相关阅读:
    Enterprise Library 2.0 技巧(4):如何用编程的方法来配置Logging Application Block
    Castle IOC容器实践之EnterpriseLibrary Configuration Facility
    Castle开发系列文章上了Castle的官方网站
    DataGridView也泛型?——一个不错的DataGridView控件
    Enterprise Library for .NET Framework 3.0 what would you like to see?
    设计是否可以更合理一点?——关于ORM中业务实体的讨论
    Enterprise Library 2.0 技巧(2):如何将配置信息保存到数据库中
    关于Castle IOC容器自动装配的问题
    数据库重构与数据库单元测试
    BLINQ初体验
  • 原文地址:https://www.cnblogs.com/chcj/p/9892831.html
Copyright © 2011-2022 走看看