ホームページ  >  記事  >  バックエンド開発  >  Python でイテレータとリスト内包表記を使用するにはどうすればよいですか?

Python でイテレータとリスト内包表記を使用するにはどうすればよいですか?

零下一度
零下一度オリジナル
2017-07-17 09:47:521446ブラウズ

イテレーター: 予備調査

前の章で述べたように、実際、for ループは任意の反復可能なオブジェクトで使用できます。実際、これは、for ループ、リスト内包表記、メンバーシップ テスト、マップ組み込み関数など、オブジェクトを左から右にスキャンする Python のすべての反復ツールに当てはまります。

「反復可能なオブジェクト」の概念は、Python では非常に新しいものです。基本的に、これはシーケンスの概念を一般化したものです。オブジェクトが実際に保存されたシーケンスであるか、ツール環境で一度に 1 つずつ反復できるオブジェクトであるかどうかです。 、それを反復可能であると考えてください。

>>ファイル反復子
組み込みのデータ型として、ファイルは反復可能です。これは、呼び出されるたびにファイル内の次の行を返します。ファイルの終わりに到達すると、__next__ は空の文字列を返す代わりに、組み込みの StopIteration 例外を発生させます。

このインターフェイスは、Python のいわゆる反復プロトコルです。__next__ メソッドを持つオブジェクトは次の結果に進み、一連の結果の最後に StopIteration がトリガーされます。このようなオブジェクトはすべて反復可能であるとみなされます。このようなオブジェクトは、for ループやその他の反復ツールを使用して反復することもできます。これは、すべての反復ツールが内部で各反復で __next__ を呼び出し、StopIteratin 例外をキャッチして終了時期を決定することで動作するためです。

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')

以上がPython でイテレータとリスト内包表記を使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。