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!