Python 迭代器和列表解析

Python 迭代器和列表解析express

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)列表解析 [ ]app

根據已有列表,高效生產新列表的方式。 經常使用於實現建立新的列表,所以要放置於 [ ] 中
語法:
    [ 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)產生偏移和元素code

enumerate
    同時偏移縮印和偏移元素,使用enumerate()函數
    此內置函數返回一個生成器對象
    >>> S = 'Hello,world'
    >>> a = enumerate(S)
    >>> a.next()
    (0,'H')
    >>> a.next()
    (1,'e')
相關文章
相關標籤/搜索