• 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')
  • 相关阅读:
    SQL如何对时间戳字段按日期排序
    PHP书写SQL换行
    SQL修改字段
    SQL新增一个字段
    HTML加JS实现点击切换“观看”与“收起”效果切换
    盐:深沉的慢动作 让电影“支离破碎”
    笔:最终会走在一起吗
    笔:那个下午
    关于国内安装百夫长开源网站统计进度过慢的问题
    Java Web系列之JDBC
  • 原文地址:https://www.cnblogs.com/fanison/p/7109655.html
Copyright © 2020-2023  润新知