Heim  >  Artikel  >  Backend-Entwicklung  >  Wie verwende ich Iteratoren und Listenverständnisse in Python?

Wie verwende ich Iteratoren und Listenverständnisse in Python?

零下一度
零下一度Original
2017-07-17 09:47:521438Durchsuche

Iterator: Eine vorläufige Studie

Wie im vorherigen Kapitel erwähnt, kann die for-Schleife tatsächlich für jedes iterierbare Objekt verwendet werden. Tatsächlich gilt dies für alle Iterationstools in Python, die Objekte von links nach rechts scannen, einschließlich For-Schleifen, Listenverständnissen, Mitgliedschaftstests und der integrierten Map-Funktion.

Das Konzept der „iterierbaren Objekte“ ist in Python recht neu. Im Grunde ist dies die Verallgemeinerung des Sequenzkonzepts: Wenn das Objekt eine tatsächlich gespeicherte Sequenz ist oder in der Iteration jeweils ein Ergebnis erzeugen kann Werkzeugumgebungsobjekt gilt als iterierbar.

>>File Iterator
Als integrierter Datentyp sind Dateien auch iterierbar. Es gibt eine Methode namens __next__, die bei jedem Aufruf zurückgegeben wird nächste Zeile in der Datei. Wenn das Ende der Datei erreicht ist, löst __next__ die integrierte StopIteration-Ausnahme aus, anstatt eine leere Zeichenfolge zurückzugeben.

Diese Schnittstelle ist das sogenannte Iterationsprotokoll in Python: Ein Objekt mit einer __next__-Methode wechselt zum nächsten Ergebnis, und am Ende einer Reihe von Ergebnissen wird StopIteration ausgelöst. Jedes dieser Objekte gilt als iterierbar. Jedes dieser Objekte kann auch mit einer for-Schleife oder einem anderen Iterationstool iteriert werden, da alle Iterationstools intern funktionieren, indem sie bei jeder Iteration __next__ aufrufen und die StopIteratin-Ausnahme abfangen, um zu bestimmen, wann sie verlassen werden sollen.

Python-Iteratoren und Listenanalyse

1) Iteratoren

 一种特殊的数据结构,以对象形式存在
        >>> 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) Listenanalyse [ ]

根据已有列表,高效生产新列表的方式。 常用于实现创建新的列表,因此要放置于 [ ] 中
语法:
    [ 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) Generator ( )

    惰性计算、延迟求值
    生成器表达式并不真正创建数字列表,而是返回一个生成器对象,此对象在每次计算出一个条目后,把这个条目产生出来(一次返回一个值)
    语法:
        ( 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) Offset und Element generieren

    enumerate
    同时偏移缩印和偏移元素,使用enumerate()函数
    此内置函数返回一个生成器对象
    >>> S = 'Hello,world'
    >>> a = enumerate(S)
    >>> a.next()
    (0,'H')
    >>> a.next()
    (1,'e')

Das obige ist der detaillierte Inhalt vonWie verwende ich Iteratoren und Listenverständnisse in Python?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn