if<\/A><\/SPAN> výraz. Kombinovaný výraz generuje hodnoty pro obalující funkci:<\/P><SPAN class="operator token">>><\/SPAN><SPAN class="operator token">><\/SPAN> sum<SPAN class="punctuation token">(<\/SPAN>i<SPAN class="operator token">*< \/SPAN>i <SPAN class="keyword token">for< \/SPAN> i <SPAN class="keyword token">in< \/SPAN> range<SPAN class="punctuation token">(< \/SPAN><SPAN class="number token">10< \/SPAN><SPAN class="punctuation token">)< \/SPAN><SPAN class="punctuation token">)< \/SPAN> <SPAN class="comment token"># součet čtverců 0, 1, 4, ... 81< \/SPAN>
<SPAN class="number token">285< \/SPAN>
<SPAN class="line-numbers-rows"><SPAN>< \/SPAN><SPAN>< \/SPAN>< \/SPAN>< \/CODE>< \/PRE>< \/TD>< \/TR>< \/TBODY>< \/TABLE>< \/BLOCKQUOTE>< P >< \/P >< P >< STRONG >iterable< \/STRONG >< P style = "margin-left: 30px;" > Objekt schopný vracet své členy po jednom. Příklady iterable zahrnují všechny sekvenční typy (jako jsou < SPAN style = "font-family: courier new,courier;" >< A href = "https:\/\/docs.python.org\ /2\ /library\ /functions.html#list" rel = "nofollow noopener noreferrer" target = "_blank" > list < \/A >< \/SP N > , < SPAN style = "font-family: courier new,courier;" >< A href = "https:\/\ /docs.python.org\ /2\ /library\ /functions.html#str" rel = "nofollow noopener noreferrer" target = "_blank" > str < \/A >< \/SP N > , a < SPAN style = "font-family: courier new,courier;" >< A href = "https:\/\ /docs.python.org\ /2\ /library\ /functions.html#tuple" rel = "nofollow noopener noreferrer" target = "_blank" > tuple < \/A >< \/SP N > ) a některé neseqvenční typy jako jsou < SPAN style = "font-family: courier new,courier;" >< A href = "https:\/\ /docs.python.org\ /2\ /library\ /stdtypes.html#dict" rel = "nofollow noopener noreferrer" target = "_blank" > dict < \/A >< \/SP N > a < SPAN style = "font-family: courier new,courier;" >< A href = "https:\/\ /docs.python.org\ /2\ /library\ /functions.html#file" rel = "nofollow noopener noreferrer" target = "_blank" > file < \/A > < \/SP N > a objekty jakýchkoli tříd, které definujete s metodou < SPAN style = "font-family: courier new,courier;" >< A href = "https:\/\ /docs.python.org\ /2\ /reference\ /datamodel.html#object.__iter__" rel = "nofollow noopener noreferrer" target = "_blank" > __iter__() < \/A >< \/SP N > nebo < SPAN style = "font-family: courier new,courier;" >< A href = "https:\/\ /docs.python.org\ /2\ /reference\ /datamodel.html#object.__getitem__" rel = "nofollow noopener noreferrer" target = "_blank" > __getitem__() < \/A >< \/SP N > . Iterable lze použít ve smyčce typu < SPAN style = "font-family: courier new,courier;" >< A href = "https:\/\ /docs.python.org\ /2\ /reference\ /compound_stmts.html#for" rel = "nofollow noopener noreferrer" target = "_blank" > for < \/A >< \/SP N > a na mnoha dalších místech, kde je potřeba sekvence (< SPAN style = "font-family: courier new,courier;" >< A href = "https:\/\ /docs.python.org\ /2\ /library\ /functions.html#zip" rel = "nofollow noopener noreferrer" target = "_blank" > zip() < \/A >< \/SP N > , < SPAN style = "font-family: courier new,courier;" >< A href = "https:\/\ /docs.python.org\ /2\ /library\ /functions.html#map" rel = "nofollow noopener noreferrer" target = "_blank" > map() < \/A >< \/SP N > , ...). Když je iterable objekt předán jako argument vestavěné funkci < SPAN style = "font-family: courier new,courier;" >< A href = "https:\/\ /docs.python.org\ /2\ /library\ /functions.html#iter" rel = "nofollow noopener noreferrer" target = "_blank" > iter() < \/A >< \/SP N > , vrátí iterator pro tento objekt. Tento iterator je vhodný pro jedno průchod přes množinu hodnot. Při používání iterable obvykle není nutné volat funkci < SPAN style = "font-family: courier new,courier;" >< A href = "https:\/\ /docs.python.org\ /2\ /library\ /functions.html#iter" rel = "nofollow noopener noreferrer" target = "_blank" > iter() < \/A >< \/SP N > nebo pracovat s iterator objekty sami. Příkaz typu < SPAN style = "font-family: courier new,courier; background-color: #e0e0e0;">for< \/SP AN > to dělá automaticky za vás, vytváří dočasnou anonymní proměnnou pro držení iteratoru po dobu trvání smyčky. Viz také<EM><A href= „https://docs.python.org/2/glossary.html#term-iterator“ rel= „nofollow noopener noreferrer“ target= „_blank“> iterator </A></EM>, <EM> <A href= „https://docs.python.org/2/glossary.html#term-sequence“ rel= „nofollow noopener noreferrer“ target= „_blank“> sekvence </A></EM>, a <EM> <A href= „https://docs.python.org/2/glossary.html#term-generator“ rel= „nofollow noopener noreferrer“ target= „_blank“> generátor </A></EM>.< /P > <P ></P > <P ><STRONG >iterator</STRONG ></P > <P style= „margin-left: 30px;“ >An object representing a stream of data. Repeated calls to the iterator27s <span style=22font-family: courier new,courier;223E<a href=22https://docs.python.org/2/reference/expressions.html#generator.next22 rel=22nofollow noopener noreferrer22 target=22_blank223Enext()<2Fa3E3C/span3E method return successive items in the stream. When no more data are available a <a href=22https://docs.python.org/2/library/exceptions.html#exceptions.StopIteration22 rel=22nofollow noopener noreferrer22 target=22_blank223E<span style=22font-family: courier new,courier;223EStopIteration</span>3C/a3E exception is raised instead. At this point, the iterator object is exhausted and any further calls to its <span style=22font-family: courier new,courier;223E<a href=22https://docs.python.org/2/reference/expressions.html#generator.next22 rel=22nofollow noopener noreferrer22 target=22_blank223Enext() </a>3C/span3Emethod just raise <a href=22https://docs.python.org/2/library/exceptions.html#exceptions.StopIteration22 rel=22nofollow noopener noreferrer22 target=22_blank223E<span style=22font-family: courier new,courier;223EStopIteration</span>3C/a3E again. Iterators are required to have an <span style=22font-family: courier new,courier;223E<a href=22https://docs.python.org/2/reference/datamodel.html#object.__iter__2 courier new,courier;"><A href="https://docs.python.org/2/library/functions.html#iter" rel="nofollow noopener noreferrer" target="_blank">iter()</A></SPAN> funkce nebo ji použijte v <SPAN style="font-family: courier new,courier;"><A href="https://docs.python.org/2/reference/compound_stmts.html#for" rel="nofollow noopener noreferrer" target="_blank">for</A></SPAN> smyčce. Pokus o to s iterátorem vrátí pouze stejný vyčerpaný objekt iterátoru použitý v předchozím průchodu, což způsobí, že se bude jevit jako prázdný kontejner.</P><P></P><P><STRONG>sekvence</STRONG></P><P style="margin-left: 30px;"><A href="https://docs.python.org/2/glossary.html#term-iterable" rel="nofollow noopener noreferrer" target="_blank"><EM>iterable</EM> </A>, který podporuje efektivní přístup k prvkům pomocí celočíselných indexů přes speciální metodu <SPAN style="font-family: courier new,courier;"><A href="https://docs.python.org/2/reference/datamodel.html#object.__getitem__" rel="nofollow noopener noreferrer" target="_blank">__getitem__()</A></SPAN> a definuje metodu <SPAN style="font-family: courier new,courier;"><A href="https://docs.python.org/2/library/functions.html#len" rel="nofollow noopener noreferrer" target="_blank">len()</A></SPAN>, která vrací délku sekvence. Některé vestavěné typy sekvencí jsou <A href="https://docs.python.org/2/library/functions.html#list" rel="nofollow noopener noreferrer" target="_blank"><SPAN style="font-family: courier new,courier;">list</SPAN></A>, <A href="https://docs.python.org/2/library/functions.html#str" rel="nofollow noopener noreferrer" target="_blank"><SPAN style="font-family: courier new,courier;">str</SPAN></A>, <SPAN style="font-family: courier new,courier;"><A href="https://docs.python.org/2/library/functions.html#tuple" rel="nofollow noopener noreferrer" target="_blank">tuple</A></SPAN> a <SPAN style="font-family: courier new,courier;"><A href="https://docs.python.org/2/library/functions.html#unicode" rel="nofollow noopener noreferrer" target="_blank">unicode</A></SPAN>. Všimněte si, že <SPAN style="font-family: courier new,courier;"><A href="https://docs.python.org/2/library/stdtypes.html#dict" rel="nofollow noopener noreferrer" target="_blank">dict</A></SPAN> také podporuje <SPAN style="font-family: courier new,courier;"><A href="https://docs.python.org/2/reference/datamodel.html#object.__getitem__" rel="nofollow noopener noreferrer" target="_blank">__getitem__()</A></SPAN> a <SPAN style="font-family: courier new,courier;"><A href="https://docs.python.org/2/reference/datamodel.html#object.__len__" rel="nofollow noopener noreferrer" target="_blank">__len__()</A></SPAN>, ale je považován za mapování spíše než sekvenci, protože vyhledávání používá libovolné <A href="https://docs.python.org/2/glossary.html#term-immutable" rel="nofollow noopener noreferrer" target="_blank"><EM>immutable</EM> </A>klíče místo celých čísel.</P><P>Ve srovnání se starým slovníkem z <A href="http://resources.arcgis.com/" rel="nofollow noopener noreferrer" target="_blank">ArcGIS Resources</A>, nyní přejmenovaným na <A href="http://support.esri.com/en/knowledgebase/Gisdictionary/browse" rel="nofollow noopener noreferrer" target="_blank">GIS Dictionary </A>a umístěným na <A href="http://support.esri.com/" rel="nofollow noopener noreferrer" target="_blank">Esri Support</A>, je <A href="https://docs.python.org/2/glossary.html" rel="nofollow noopener noreferrer" target="_blank">Python Glossary </A>docela rozsáhlý. Nicméně Python Glossary je také jedním z těch, které dávají smysl lidem, kteří už znají odpověď, ale může být trochu náročný pro nováčky v jazyce.</P><P></P><P>Z pohledu výše uvedeného výňatku ze slovníku lze vyčíst, že několik speciálních/magických/dunder metod je velmi důležitých pro iteraci: <SPAN style="font-family: courier new,courier;">__iter__()</SPAN>, <SPAN style="font-family: courier new,courier;">__getitem__()</SPAN> a <SPAN style="font-family: courier new,courier;">next()</SPAN> (<EM>nebo <SPAN style="font-family: courier new,courier;">__next__()</SPAN>, pokud pracujete v Python 3.x</EM>). Existuje také několik důležitých vestavěných funkcí, které s těmito metodami interagují: <SPAN style="font-family: courier new,courier;">iter()</SPAN> a <SPAN style="font-family: courier new,courier;">next()</SPAN>. A nakonec, ale ne méně důležité, smyčka <SPAN style="font-family: courier new,courier;">for</SPAN> a příkaz <SPAN style="font-family: courier new,courier;">yield</SPAN>. Existuje více metod, funkcí, příkazů a řídicích struktur zapojených do iterace, ale výše zmíněné jsou stěžejní pro jakoukoli diskusi. Pro čtenáře zajímající se o další informace o iterátorech, generátorech, sekvencích atd... existuje mnoho úvodů a tutoriálů, které již byly napsány a jsou jen na dosah rychlého vyhledání na Googlu.</P><P></P><P>Seznamy jsou v Pythonu tak běžné a nováčci v jazyce s nimi přicházejí do styku tak brzy, že budu používat příklady Python listů pro kontext spolu s příklady ArcPy Data Access search cursor. Dokumentace Python Glossary uvádí, že list je "vestavěná Python sekvence," a sekvence je "iterable, který podporuje efektivní přístup k prvkům pomocí celočíselných indexů...." Dokumentace ArcPy <A href="https://pro.arcgis.com/en/pro-app/arcpy/data-access/searchcursor-class.htm" rel="nofollow noopener noreferrer" target="_blank">Data Access SearchCursor </A>uvádí, že search cursor "vrací iterátor n-tic." Protože iterátory jsou také iterable, získáváme pocit, že vestavěné funkce a výrazy běžně používané pro manipulaci se seznamy mohou být také použity s ArcPy kurzory.</P><P></P><P style="padding-left: 30px;"><EM>Ačkoli lze použít vestavěnou funkci <SPAN style="font-family: courier new,courier;"><A href="https://docs.python.org/2/library/functions.html#dir" rel="nofollow noopener noreferrer" target="_blank">dir()</A></SPAN> k pokusu o vrácení seznamu platných atributů objektu, rozhodl jsem se objekty tímto způsobem nezkoumat, protože by to přineslo nepořádek ze všech atributů nesouvisejících s iterací. Místo toho se spolehnu na vestavěnou funkci <SPAN style="font-family: courier new,courier;"><A href="https://docs.python.org/2/library/functions.html#isinstance" rel="nofollow noopener noreferrer" target="_blank">isinstance()</A></SPAN> spolu s vestavěnými <A href="https://docs.python.org/2/glossary.html#term-abstract-base-class" rel="nofollow noopener noreferrer" target="_blank">abstraktními základními třídami (ABCs)</A> k prozkoumání vlastností iterace.</EM></P><P></P><PRE class="lia-code-sample line-numbers language-none"><CODE><SPAN class="operator token">>></SPAN><SPAN class="operator token">></SPAN> #import relevantní ABCs z modulu collections
<span class='operator token'>>></span><span class='operator token'>></span> from collections import Iterable, Iterator, Sequence
<span class='operator token'>>></span><span class='operator token'>></span>
<span class='operator token'>>></span><span class='operator token'>></span> #vytvořit ukázkový list a arcpy.da.SearchCursor
<span class='operator token'>>></span><span class='operator token'>></span> l = [10, 20, 30, 40, 50]
<span class='operator token'>>></span><span class='operator token'>></span> cur = arcpy.da.SearchCursor(fc,["OID@", "SHAPE@"])
<span class='operator token'>>></span><span class='operator token'>></span>
<span class='operator token'>>></span><span class='operator token'>></span> #podívat se na vlastnosti iterace ukázkových objektů
<span class='operator token'>>></span><span class='operator token'>></span> abcs = (Iterable, Iterator, Sequence)
<span class='operator token'>>></span><span class='operator token'>></span> [isinstance(l, abc) for abc in abcs]
[True, False, True] #Iterable, ne Iterator, Sequence
<span class='operator token'>>></span><span class='operator token'>></span>
<span class='operator token'>>></span><span class='operator token'>></span> <SPAN class="punctuation token">[</SPAN>isinstance<SPAN class="punctuation token">(</SPAN>cur<SPAN class="punctuation token">,</SPAN> abc<SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">pro</SPAN> abc <SPAN class="keyword token">v</SPAN> abcs<SPAN class="punctuation token">]</SPAN>
<SPAN class="punctuation token">[</SPAN><SPAN class="token boolean">True</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="token boolean">True</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="token boolean">False</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="comment token">#Iterable, Iterator, ne Sequence</SPAN>
<SPAN class="operator token">>></SPAN><SPAN class="operator token">></SPAN>
<SPAN class="operator token">>></SPAN><SPAN class="operator token">></SPAN> <SPAN class="comment token">#podívejte se na typy vzorových objektů a iterátorů vzorových objektů</SPAN>
<SPAN class="operator token">>></SPAN><SPAN class="operator token">></SPAN> it_l <SPAN class="operator token">=</SPAN> iter<SPAN class="punctuation token">(</SPAN>l<SPAN class="punctuation token">)</SPAN>
<SPAN class="operator token">>></SPAN><SPAN class="operator token">></SPAN> type<SPAN class="punctuation token">(</SPAN>l<SPAN class="punctuation token">)</SPAN>
<SPAN class="operator token"><</SPAN>type <SPAN class="string token">'list'</SPAN><SPAN class="operator token">></SPAN>
<SPAN class="operator token">>></SPAN><SPAN class="operator token">></SPAN> type<SPAN class="punctuation token">(</SPAN>it_l<SPAN class="punctuation token">)</SPAN>
<SPAN class="operator token"><</SPAN>type <SPAN class="string token">'listiterator'</SPAN><SPAN class="operator token">></SPAN>
<SPAN class="operator token">>></SPAN><SPAN class="operator token">></SPAN>
<SPAN class="operator token">>></span><span class="operator token">></span> it_cur <span class="operator token">=</span> iter<span class="punctuation token">(</span>cur<span class="punctuation token">)</span>
<span class="operator token">>></span><span class="operator token">></span> type<span class="punctuation token">(</span>cur<span class="punctuation token">)</span>
<span class="operator token"><</span>type <span class="string token">'da.SearchCursor'</span><span class="operator token">></span>
<span class="operator token">>></span><span class="operator token">></span> type<span class="punctuation token">(</span>it_cur<span class="punctuation token">)</span>
<span class="operator token"><</span>type <span class="string token">'da.SearchCursor'</span><span class="operator token">></span>
<span class="operator token">>></span><span class="operator token">></span>
<span class="operator token">>></span><span class="operator token">></span> <span class="comment token">#podívejte se na identitu kurzorových objektů</span>
<span class="operator token">>></span><span class="operator token">></span> id<span class="punctuation token">(</span>cur<span class="punctuation token">)</span>
<span class="number token">262686224</span>
<span class="operator token">>></span><span class="operator token">></span> id<span class="punctuation token">(</span>it_cur<span class="punctuation token">)</span>
<span class="number token">262686224</span>
<span class="operator token"></span>
<span class="line-numbers-rows"><span><<EMOJI_0>></span><span><<EMOJI_1>></span><span><<EMOJI_2>></span><span><<EMOJI_3>></span><span><<EMOJI_4>></span><span><<EMOJI_5>></span><span><<EMOJI_6>></span><span><<EMOJI_7>></span><span><<EMOJI_8>></span><span><<EMOJI_9>></span><span><<EMOJI_10>></span><span><<EMOJI_11>></span><span><<EMOJI_12>></span><span><<EMOJI_13>></span><span><<EMOJI_14>></span><span><<EMOJI_15>></span><span><<EMOJI_16>></span><span><<EMOJI_17>></span><span><<EMOJI_18>></span><span><<EMOJI_19>></span><span><<EMOJI_20>></span><span><<EMOJI_21>></span><span><<EMOJI_22>></span><span><<EMOJI_23>></span><span><<EMOJI_24>></span><span><<EMOJI_25>></ span >< span >& lt ; & lt ; EM OJ I _ 26 & gt ; & gt ; </ span >< span >& lt ; & lt ; EM OJ I _ 27 & gt ; & gt ; </ span >< span >& lt ; & lt ; EM OJ I _ 28 & gt ; & gt ; </ span >< span >& lt ; & lt ; EM OJ I _ 29 & gt ; & gt ; </ span >< span >& lt ; & lt ; EM OJ I _ 30 & gt ; & gt ; </ span >< span >& lt ; & lt ; EM OJ I _ 31 & gt ; & gt ; </ span >< span >& lt ; & lt ; EM OJ I _ 32 & gt ; & gt ; </ span >< span >& lt ; & lt ; EM OJ I _ 33 & gt ; & gt ; </ span ></ span >
Jak je vidět výše, což v podstatě demonstruje to, co je uvedeno v Python Glossary, seznam je jak iterable tak sequence, ale není iterator, zatímco ArcPy Data Access search cursor je jak iterable tak iterator, ale není sequence. Z řádků 20-21 vidíme, že volání iter() na seznamu vrací nový typ objektu i nový objekt, tj. listiterator. Z řádků 26-27 vidíme, že volání iter() na search cursor vrací search cursor místo nového iterator objektu. Nejenže je search cursor vrácen voláním iter(), ale řádky 30-33 ukazují, že je vrácen ten stejný search cursor objekt. Tento návrhový vzor mít iterable jako svůj vlastní iterator je v Pythonu poměrně běžný.
V dalším příspěvku v této sérii přejdeme za komponenty iterace a začneme skutečně iterovat přes Python objekty, včetně ArcPy Data Access kurzorů.