zoukankan      html  css  js  c++  java
  • Python 迭代器和列表解析

    Python 迭代器和列表解析

    1)迭代器

     一种特殊的数据结构,以对象形式存在
            >>> i1 = l1.__iter__()
            >>> i1 = iter(l1)
            可迭代对象:
                序列:      list、str、tuple
                非序列:     dict、file
                自定义类:  __iter__()、 __getitem__()
       注意:
             若要实现迭代器,需要在类中定义next()方法
             要使迭代器指向下一个对象,则使用成员函数 next() 
                 i1.next()
             当没有元素时,会引发StopIteration异常
             for循环可用于任何可迭代对象
             
             例:   >>> l1 = ['Sun','Mon','Tue','Wed','Thu','Fri','Sat']
                    >>> i1 = l1.__iter__()
                    >>> il.next()
                    'Sun' 
                    >>> il.next()
                    'Mon'
    

    2)列表解析 [ ]

    根据已有列表,高效生产新列表的方式。 常用于实现创建新的列表,因此要放置于 [ ] 中
    语法:
        [ expression for iter_var in iterable ]
        [ expression for iter_var in iterable if cond_expr ]
    
        os模块中  listdir() 能够列出所有文件
        例:事先定义l1 l2        l1 = [ 1,2,3,4,5 ]     l2=[ ]                
               >>>  for i in l1:
                       l2.append(i**2)                     l2列表内各项为l1的平方
               >>>  print l2
               [1, 4, 9, 16, 25]
    
                >>> l3 = [ i**2 for i in l1 ]               l3列表内各项为l1的平方
                [1, 4, 9, 16, 25]
              
                >>> l4 = [ i**2 for i in l1 if i>=3 ]       l3列表内各项为l1中 >= 3的平方
                [9, 16, 25]
                
         例题:  l1 = ['x','y','z']     l2 = [1,2,3]  应用列表解析方法使其各项相乘
                
                >>> l3 = [ (i,j) for  i in l1 for j in l2 ]     for循环内部嵌套一个for循环实现各项乘
                [('x', 1), ('x', 2), ('x', 3), ('y', 1), ('y', 2), ('y', 3), ('z', 1), ('z', 2), ('z', 3)]
    

    3)生成器 ( )

        惰性计算、延迟求值
        生成器表达式并不真正创建数字列表,而是返回一个生成器对象,此对象在每次计算出一个条目后,把这个条目产生出来(一次返回一个值)
        语法:
            ( expr for iter_var in iterable )
            ( expr for iter_var in iterable  if cond_expr )
        
         例:  >>> l1 = ( i**2 for i in range(2,11,2))
               >>> l1.next()
               2
               >>> l1 = ( i**2 for i in range(2,11) if i%2==0 )
               >>> l1.next()
               2
         注意:
            序列过长,并且每次只获取一个元素时,应当考虑使用生成器表达式而不是列表解析
            列表解析与生成器的关系相当于range()与xrange()
    

    4)产生偏移和元素

        enumerate
        同时偏移缩印和偏移元素,使用enumerate()函数
        此内置函数返回一个生成器对象
        >>> S = 'Hello,world'
        >>> a = enumerate(S)
        >>> a.next()
        (0,'H')
        >>> a.next()
        (1,'e')
  • 相关阅读:
    js array数组检测方式
    js 获取时间戳
    接收二进制流(ArrayBuffer) ,并且显示二进制流图片
    文字小于12px时,设置line-height不居中问题
    设置文字小于12px
    Kafuka面试(整合Kafka两种模式区别)
    secondary namenode 检查点
    MapReduce总结
    Map、Reduce和Job方法总结
    Hadoop 两种环境下的checkpoint机制
  • 原文地址:https://www.cnblogs.com/fanison/p/7109655.html
Copyright © 2011-2022 走看看