Jak smyčky, aka navrhování programu, který za vás dělá opakovanou práci
Smyčka je jedním z nejzásadnějších a nejmocnějších konstruktů ve výpočetní technice, protože nám umožňuje opakovat sadu příkazů, kolikrát chceme, na seznam položek podle našeho výběru. Hodně výpočetního myšlení zahrnuje převzetí jednoho úkolu a jeho vyřešení způsobem, který lze opakovaně aplikovat na všechny ostatní podobné úkoly, a smyčka for je způsob, jak přimět počítač k opakované práci:
Na rozdíl od většiny kódu, který jsme doposud napsali na interaktivní výzvu, smyčka for se neprovede, jakmile stiskneme klávesu Enter:
Mezi klíčová slova do
a done
můžeme v bloku vypsat tolik příkazů, kolik chceme. :
Pouze do té doby, než dosáhneme done
a stiskneme Enter, funguje smyčka for.
Toto se zásadně liší od toho, jaký řádek-by-line příkaz a odpověď jsme dosud zažili na výzvu. A předznamenává to, jak budeme programovat dále: menší důraz na provádění příkazů s každý řádek a větší důraz na plánování funkčnosti programu a jeho následné provedení.
Základní syntaxe
Syntaxe smyček for
může být matoucí, takže zde je několik základních příkladů, jak je pochopit:
Zde je propracovanější verze využívající proměnné:
Ke generování lze použít substituci příkazu položky, které smyčka for
iteruje napříč:
Pokud potřebujete přečíst seznam řádků z soubor a jsou si naprosto jisti, že žádný z řádků v nich neobsahuje mezeru:
Smyčka pro čtení je variantou výše uvedeného, ale je bezpečnější pro čtení řádků ze souboru:
Vytvoření základní smyčky pro smyčku
Pojďme začít od začátku s velmi minimální for
smyčku a poté ji zabudoval do něčeho propracovanějšího, aby nám pomohl porozumět jejich účelu.
Nejjednodušší smyčka
Je to asi tak jednoduché jak můžete vytvořit smyčku pro:
Zdálo se vám to celkem bezcenné? Ano, mělo by to být. Napsal jsem čtyři řádky kódu, abych udělal to, co je potřeba k provedení jediného řádku, echo "Hi"
.
Další prvky v kolekci
It „Je těžké to říct, ale„ smyčka “se skutečně spustila. Právě se provedla jednou. Dobře, tak jak to můžeme udělat, aby se spustila více než jednou? Přidejte více (oddělených mezerami) prvků napravo od in
klíčové slovo. Přidejte čtyři další 1
„s:
Dobře, není to moc vzrušující, ale program se rozhodně zdál přinejmenším smyčkou: čtyři 1
„s vedly ke spuštění čtyř echo
příkazů.
Co se stane, když tyto čtyři 1
nahradíme různými čísly? A možná pár slov?
A … nic. Takže smyčka automaticky nedělá nic konkrétního pro kolekci hodnot, které jsme jí dali. Zatím ne.
Podívejte se na proměnnou smyčky
Pojďme se podívat nalevo od klíčového slova in
a poté x
. Jaký to má smysl x
? Malá x
není název klíčového slova nebo příkazu, se kterým jsme se zatím setkali (a jeho samotné provedení na výzvu způsobí chybu). Možná je to tedy proměnná? Zkusme na ni odkazovat v echo
prohlášení:
Bingo. Toto je do značné míry základní fungování smyčky for
: – Získejte sbírku položek / hodnot (Q Zebra 999 Smithsonian
) – Předejte je do for
konstrukce smyčky – Pomocí proměnné smyčky (x
) jako zástupného symbolu můžete psát příkazy mezi do
/ done
blok. – Když se smyčka spustí, proměnná smyčky x
převezme hodnotu každé z položek v seznam – Q
, Zebra
, 999
, Smithsonian
, – a poté se provede blok příkazů mezi do
a done
. Tato sekvence se opakuje jednou pro každou položku v seznamu.
Blok do
/ done
může obsahovat libovolnou sekvenci příkazy, dokonce i další for
-loop:
Loops-within-loops je běžný konstrukt v programování.Většinou se pokusím vyhnout se přiřazování problémů, které by zahrnovaly tento druh logiky, protože může být obtížné rozmotat se během ladění.
Číst soubor, řádek po řádku, spolehlivě při čtení
Protože cat
tiskne soubor řádek po řádku, zdá se být rozumné následující pro smyčku:
Nahrazení příkazu však způsobí, že cat
rozdělí slova na mezeru. Pokud list-of-dirs.txt
obsahuje následující:
Výstup smyčky for
bude tento:
Smyčka pro čtení zachová slova v řádku:
Z výsledku můžeme také vytvořit kanál příkazu uzavřením do <(
a )
:
Potrubí a smyčky
Pokud pocházíte z jiných jazyků, datové toky vám mohou být neznámé . Přinejmenším jsou pro mě, protože syntaxe pro práci s nimi je v Bash mnohem přímější a přímočarější než v Ruby nebo Pythonu.
Pokud však programování v jakémkoli jazyce začínáte, co by mohlo Také je nejasné, v čem se liší práce s datovými proudy od práce se smyčkami.
Například následující fragment:
– produkuje stejný výstup jako tato smyčka:
A v závislosti na vašem mentálním modelu věcí se zdá, že v obou příkladech každé slovo, např. hello
, world
, je předán procesem překladu (pomocí tr
) a poté zopakován.
Trubky a filtry
Aniž bychom se dostali k základům systému Unix, ve kterém roura funguje zásadně odlišně od smyčky, dovolte mi navrhnout mentální řešení:
Programy, které procházejí standardním a standardním výstupem, lze obvykle uspořádat jako filtry, ve kterých je proud dat přejde do programu a vyjde v jiném formátu:
U úkolů, které jsou více než jen transformací dat, z filtru na filtr, zvažte použití smyčky. Co by to mohlo být za úkol? Vzhledem k seznamu adres URL si stáhněte všechny a stažená data odešlete e-mailem s přizpůsobeným tělem a předmětem:
Zdroj vstupu dat, každá adresa URL v urls.txt
, opravdu se zde nefiltruje. Místo toho se pro každou adresu URL provádí vícestupňový úkol.
Piping do read-while
To znamená, že lze implementovat samotnou smyčku jako jen jeden další filtr mezi filtry. Vezměte tuto variantu smyčky pro čtení, ve které je výsledek echo | grep
pipedován, řádek po řádku, do while
smyčka, která se vytiskne na standardní výstup pomocí echo
, která je přesměrována do souboru s názvem some.txt:
Toto není konstrukce, kterou možná budete muset dělat často, pokud vůbec, ale doufejme, že to posílí využití potrubí v Unixu.
Méně interaktivní programování
časté používání smyček for
a podobných konstruktů znamená, že se pohybujeme kolem dobrých dní psaní na jednom řádku c ommands a nechat to provést hned poté, co jsme stiskli Enter. Bez ohledu na to, kolik příkazů zabalíme do smyčky for
, nic se nestane, dokud nenarazíme na klíčové slovo done
.
Napište jednou. Poté to smyčkujte
S touto ztrátou interakce řádek po řádku s shellem ztrácíme hlavní výhodu interaktivní výzvy: okamžitou zpětnou vazbu. A stále máme všechny nevýhody: pokud uděláme překlep dříve v bloku příkazů mezi do
a done
, musíme začít všude.
Takže takto to zmírňujeme:
Otestujte svůj kód, jeden případ po druhém
Jedna z největších chyb, kterých se začátečníci dopouštějí for
smyčky si myslí, že smyčka for
okamžitě vyřeší jejich problém. Pokud tedy musí stáhnout 10 000 adres URL, musí nemohou správně stáhnout pouze jednu adresu URL, myslí si, že uvedení jejich chybných příkazů do smyčky for
je krok správným směrem.
Kromě toho je to zásadně nedorozumění smyčky for
, praktickým problémem je, že nyní používáte svůj poškozený kód 10 000krát, což znamená, že musíte 10 000krát počkat, než zjistíte, že váš kód je, bohužel stále zlomený.
Takže předstírejte, že jste nikdy neslyšeli o for
smyčky. Předstírejte, že musíte stáhnout všech 10 000 adres URL, jeden příkaz najednou. Můžete napsat příkaz k tomu pro první URL. A co ten druhý? Jakmile jste si dostatečně jisti, že vás nezklamou žádné drobné chyby syntaxe, je na čase přemýšlet o tom, jak najít obecný vzor pro dalších 9 997 adres URL.
Psát skripty
Interaktivní příkazový řádek je skvělý.Začalo to zábavně a „Bude to zábava po celou dobu vaší počítačové kariéry. Ale když máte před sebou velký úkol zahrnující více než deset řádků kódu, pak je čas dát tento kód do shell skript. Nedůvěřujte svým omylným lidským prstům, že bezchybně přepíšete kód.
Pomocí nano pracujte na smyčkách a ukládejte je jako shell skripty. U delších souborů budu pracovat v textovém editoru svého počítače (Sublime Text) a poté je nahraji na server.
Cvičení s webovým škrábáním
Stačí uzemnit syntaxe a fungování smyčky for, zde je myšlenkový proces přeměny rutinního úkolu na smyčku:
U čísel 1 až 10, pomocí curl stáhněte položku Wikipedie pro každé číslo a uložte ji do souboru s názvem „
wiki-number-(whatever the number is).html
“
Staromódní způsob
S pouhými 10 adresami URL bychom mohli nastavit několik proměnných a poté desetkrát zkopírovat a vložit příkaz curl a provést změny v každém řádku:
A hádejte co? Funguje to. U 10 adres URL to není špatné řešení a je to podstatně rychlejší než to udělat staromódním způsobem (pomocí webového prohlížeče).
Snížení opakování
I bez přemýšlení o smyčce můžeme stále snižovat opakování pomocí proměnných: základní URL, a základní název souboru se nikdy nezmění, takže nechme tyto hodnoty přiřadit proměnným které lze znovu použít:
Použití smyčky for-smyčky
V tomto okamžiku jsme vzor zjednodušili tak, že můžeme vidět, jak málo se mění s každou samostatnou úlohou. Poté, co se dozvíte o for
-loop, můžeme jej bez velkého přemýšlení použít (přidáme také příkaz spánku, abychom mezi webovými požadavky pozastavili)
Generování seznam
Ve většině situací je vytvoření smyčky for snadné; „Vytvoření seznamu může být tvrdá práce. Co kdybychom chtěli shromáždit stránky pro čísla 1 až 100? To je spousta psaní.
Ale pokud necháme diktovat naši lenost naše myšlení, můžeme si představit, že počítání od x do y se jeví jako neodmyslitelně výpočetní úkol. A je tomu tak a Unix má k tomu obslužný program seq
:
Generování seznamu nečíselných čísel pro iteraci
Mnoho opakujících se úkolů nejsou tak jednoduché jako počítání od x do y, a tak se stává problémem, jak vygenerovat nelineární seznam položek? To je v podstatě umění sběru a správy dat. Ale pojďme udělat jednoduchý scénář pro sami:
Deset z 10písmenových (nebo více) slov, která se alespoň jednou objeví v nadpisu na aktuální titulní stránce NYTimes.com, načíst stránku Wikislovníku pro toto slovo
Tento úkol rozdělíme na dvě části:
- Načíst seznam deseti 10 + -letá slova z nadpisů nytimes.com
- Předejte tato slova do naší smyčky for.
Krok 1: Použití obslužného programu pup (nebo parseru HTML příkazového řádku vaše volba):
Krok 2 (za předpokladu, že bude předána proměnná words
):
Podívejte se na Softwa re Carpentry je vynikající průvodce pro smyčky v Bash