Hogyan ciklusozhatunk, más néven egy program megtervezése, hogy ismétlődő munkát végezzünk az Ön számára
A hurok az egyik legalapvetőbb és legerősebb konstrukció a számításban, mert lehetővé teszi számunkra, hogy megismételjünk egy sor parancsot, ahányszor csak akarunk, az általunk kiválasztott elemek listáján. A számítási gondolkodás nagy része magában foglalja egy feladat felvételét és megoldását oly módon, hogy az minden más hasonló feladatra ismételten alkalmazható legyen, és a for ciklus arra készteti a számítógépet, hogy végezze el ezt az ismétlődő munkát:
Ellentétben azzal a kóddal, amelyet eddig az interaktív parancssorban írtunk, a for-loop nem hajtja végre, amint megnyomjuk az Enter billentyűt:
A kívánt számú parancsot kiírhatjuk a do
és done
kulcsszavak közötti blokkba :
Csak addig, amíg el nem érjük a done
-et és meg nem nyomjuk az Entert, a for-loop elvégzi a dolgát.
Ez alapvetően különbözik a parancssorban eddig tapasztalt soronkénti parancsoktól és válaszoktól. És azt feltételezi, hogyan fogunk tovább programozni: kevesebb hangsúlyt fektetünk a parancsok végrehajtására minden sor, és nagyobb hangsúlyt kell fektetni egy program funkcionalitására, majd később végrehajtani.
Alapszintaktika
A for
ciklusok szintaxisa zavaró lehet, ezért íme néhány alapvető példa arra, hogy előkészítsük / frissítsük ezek megértését:
Itt van egy bonyolultabb változat, amely változókat használ:
Parancscsere használható generálásra azokat az elemeket, amelyeket a for
hurok végigvezet:
Ha el kell olvasnia egy fájlt, és teljesen biztosak abban, hogy egyik sor sem tartalmaz szóközt:
A read-while ciklus a fentiek egyik változata, de biztonságosabb a sorok olvasása egy fájlból:
Alapkészítés a ciklus számára
Kezdjük a kezdetektől, nagyon minimális for
hurok, majd beépítette valami bonyolultabbba, hogy jobban megértsük a céljukat.
A legegyszerűbb hurok
Ez körülbelül ilyen egyszerű amint létrehozhat egy for ciklust:
Ez elég értéktelennek tűnt? Igen kellett volna. Négy sornyi kódot írtam annak elvégzéséhez, amihez egyetlen sor kell, echo "Hi"
.
További elemek a gyűjteményben
Ez “nehéz megmondani, de egy” hurok “végrehajtása megtörtént. Csak egyszer hajtott végre. OK, akkor hogyan érhetjük el, hogy többször is végrehajtódjon? Adjon további (szóközzel elválasztott) elemeket a in
kulcsszó. Adjunk hozzá “s” még négy 1
“szót:
Rendben, nem túl izgalmas, de a program mindenképpen úgy tűnt, hogy legalább ciklus: négy 1
“s eredményeként négy echo
parancsot hajtottak végre.
Mi történik, ha ezt a négy 1
“számot különböző számokkal helyettesítjük? És talán egy pár szót?
És… semmi. Tehát a hurok nem csinál automatikusan semmit, ami specifikus lenne az általunk megadott értékgyűjtéshez. Amúgy még nem.
Lásd a ciklusváltozót
Nézzük meg a in
kulcsszó bal oldalát, és erre x
. Mi értelme van ennek x
? A kisbetűs x
nem egy olyan kulcsszó vagy parancs neve, amellyel eddig találkoztunk (és a parancssorban történő egyedüli végrehajtás hibát fog okozni). Tehát talán ez egy változó? Próbáljuk meg hivatkozni a echo
utasításra:
Bingo. Nagyjából ez egy for
hurok alapvető működése: – Elemek / értékek gyűjteményének beszerzése (Q Zebra 999 Smithsonian
) – Adja át őket egy for
cikluskonstrukció – A hurokváltozó (x
) helyőrzőként parancsok írása a do
/ done
blokk. – A hurok végrehajtásakor a x
ciklusváltozó az egyes elemek értékét veszi fel. a lista – Q
, Zebra
, 999
, Smithsonian
, – és a do
és done
közötti parancsblokk végrehajtásra kerül. Ez a sorrend a lista minden eleméhez egyszer megismétlődik.
A do
/ done
blokk bármilyen parancsok, még egy másik for
-loop:
A ciklusokon belüli hurkok a programozásban gyakori konstrukció.Nagyrészt megpróbálom elkerülni az ilyen logikát magában foglaló problémák kiosztását, mivel a hibakeresés során bonyolult lehet a csavarás.
Fájlok olvasása soronként, megbízhatóan a read-while
Mivel a cat
soronként kinyomtat egy fájlt, a ciklusra vonatkozó következetesnek tűnik:
A parancs behelyettesítése azonban a cat
szavak szóközzel történő felosztását eredményezi. Ha a list-of-dirs.txt
a következő:
A for
ciklus kimenete a következő lesz:
A read-while ciklus megőrzi a soron belüli szavakat:
Az eredményből pipázhatunk is parancs parancsának beillesztésével <(
és )
:
Csövek és hurkok
Ha más nyelvekről érkezel, akkor az adatfolyamok ismeretlenek lehetnek számodra . Legalábbis számomra azok, mivel a velük való munka szintaxisa sokkal közvetlenebb és egyszerűbb a Bash-ban, mint a Ruby vagy a Python esetében.
Ha azonban új ismeretekkel rendelkezik bármilyen nyelvű programozással, akkor mi lehet az sem világos, hogy az adatfolyamokkal való munka hogyan különbözik a hurkoktól.
Például a következő részlet:
– ugyanazt a kimenetet produkálja, mint ez a hurok:
És a dolgok mentális modelljétől függően úgy tűnik, hogy mindkét példában minden szó, pl. hello
, world
fordítási folyamaton keresztül vezetik át (tr
útján), majd visszhangozzák.
Csövek és szűrők
Anélkül, hogy belemennék a Unix rendszer alapjaiba, amelyben egy cső alapvetően eltérően működik, mint itt a hurok, hadd javasoljak egy mentális megoldást:
Azok a programok, amelyek az stdin-ből és az stdout-ból indulnak, rendszerint szűrőként rendezhetők, amelyekben adatfolyam folyik belemegy egy programba, és más formátumban jelenik meg:
Az olyan feladatok esetében, amelyek nem csupán adatok átalakítása, szűrőről szűrőre gondoljon egy hurok használatára. Mi lehet például egy feladat? Megadva az URL-ek listáját, töltse le mindegyikét, és küldje el e-mailben a letöltött adatokat testreszabott törzzsel és témával:
Az adatbeviteli forrás, minden URL a urls.txt
mezőben, nem igazán szűrjük ide. Ehelyett minden lépésnél egy többlépcsős feladatot hajtanak végre.
Beolvasás közben olvasás
Ennek ellenére maga a hurok is megvalósítható mint még egy szűrő a szűrők között. Vegyük a read-while ciklus ezt a variációját, amelyben az echo | grep
eredményét soronként vezetjük a while
ciklus, amely az stdout-ba nyomtat a echo
segítségével, amelyet átirányítanak a some.txt nevű fájlba:
Ez nem egy olyan konstrukció, amelyet gyakran, ha egyáltalán meg kell tennie, de remélhetőleg megerősíti a Unix-ban a csőhasználatot.
Kevesebb interaktív programozás
A A for
ciklusok és hasonló konstrukciók gyakori használata azt jelenti, hogy “túlhaladunk a jó” napokon, amikor a c parancsokat, és azonnal végrehajtani, miután megnyomtuk az Enter billentyűt. Nem számít, hány parancsot csomagolunk egy for
ciklusba, semmi sem történik, amíg el nem találjuk a done
kulcsszót.
Írj egyszer. Ezután hurkolja meg
A héjjal történő soronkénti interakció elvesztésével elveszítjük az interaktív prompt fő előnyét: azonnali visszajelzést. És még mindig megvannak az összes hátrányunk: ha a do
és a done
közötti parancsblokkban korábban elírunk egy gépelési hibát, el kell kezdenünk az egész.
Tehát ezt enyhítjük:
Tesztelje a kódját, egyenként,
Az egyik legnagyobb hiba, amelyet az újoncok elkövetnek for
ciklusok szerintük egy for
hurok azonnal megoldja a problémájukat. Tehát, ha 10 000 URL-t kell letölteniük, de “Csak egy URL-t nem lehet megfelelően letölteni, szerintük a hibás parancsok for
ciklusba helyezése jó irányba tett lépés.
Ezen túlmenően ez alapvetően egy for
hurok félreértése, a gyakorlati probléma az, hogy a törött kódot 10 000-szer futtatja, ami azt jelenti, hogy 10 000-szer annyit kell várnia, hogy megtudja, hogy a kódja jaj, még mindig összetört.
Tehát úgy tesz, mintha még soha nem hallottál volna for
hurkok. Tegyük fel, hogy le kell töltenie mind a 10 000 URL-t, egyszerre csak egy parancsot. Írhat-e parancsot az első URL-hez. Mi lenne a másodikkal? Miután meggyőződött arról, hogy semmilyen kisebb szintaktikai hiba nem ütközik el, itt az ideje gondolkodni azon, hogyan lehet általános mintát találni a 9 999 másik URL-hez.
Szkriptek írása
Az interaktív parancssor nagyszerű.Nagyon jó volt kezdeni, és szórakoztató lesz számítástechnikai karrierje során. De amikor egy nagy feladat áll előtted, több mint tíz sornyi kóddal, akkor itt az ideje, hogy ezt a kódot egy shell script. Ne bízzon az esendő emberi ujjaiban, hogy hibátlanul írja be a kódot.
Használja a nanót a hurkok kezeléséhez és héjként történő mentéshez szkriptek. Hosszabb fájlok esetén a számítógépem szövegszerkesztőjével dolgozom (Sublime Text), majd feltöltöm a szerverre.
Gyakorolj webes kaparással
Csak a föld megalapozása érdekében a for-ciklus szintaxisa és működése, itt a gondolkodási folyamat a rutinfeladat ciklussá alakításával:
Az 1-től 10-ig terjedő számok esetében a curl segítségével töltse le a Wikipedia bejegyzését az egyes számokhoz, és mentse el egy “
wiki-number-(whatever the number is).html
”
A régimódi módszer
Csak 10 URL-lel állíthatunk be pár változót, majd tízszer másolhatjuk be és beilleszthetjük a curl parancsot, minden soron változtatva:
És kitalálod? Működik. 10 URL esetén ez nem rossz megoldás, és lényegesen gyorsabb, mint a régi vágású módon (a böngészőből)
Az ismétlés csökkentése
A ciklus gondolkodása nélkül is csökkenthetjük az ismétlést változók segítségével: az alap URL, és az alap fájlnév soha nem változik, ezért rendeljük ezeket az értékeket a változókhoz amelyek újrafelhasználhatók:
a for-loop alkalmazása
Ezen a ponton addig egyszerűsítettük a mintát, hogy láthassuk, milyen kevés változás változik az egyes feladatoknál. A for
-loop megismerése után sok gondolkodás nélkül alkalmazhatjuk (hozzáadunk egy alvás parancsot is, hogy szünetet tartsunk a webes kérések között)
lista
A legtöbb helyzetben a for-loop létrehozása egyszerű; ez egy olyan lista létrehozása, amely nehéz munka lehet. Mi lenne, ha az 1–100 számok oldalait szeretnénk összegyűjteni? Ez sok gépelés.
De ha hagyjuk, hogy lustaságunk diktálja gondolkodásunk során el tudjuk képzelni, hogy az x-től y-ig számolás eredendően számítási feladatnak tűnik. És ez van, és a Unix rendelkezik a seq
segédprogrammal:
Nem számok listájának generálása az iterációhoz
Sok ismétlődő feladat Ez nem olyan egyszerű, mint az x-től y-ig számolás, ezért a probléma az lesz, hogyan lehet nemlineáris elemlistát létrehozni? Ez alapvetően az adatgyűjtés és -kezelés művészete. De készítsünk egy egyszerű forgatókönyvet mi magunk:
A tízbetűs (vagy több) szó közül tíznél, amelyek legalább egyszer szerepelnek a címsorban az aktuális NYTimes.com címoldalon, töltse le a szó Wikiszótár oldalát
Ezt a feladatot két részre bontjuk:
- Tíz 10-es lista felkutatása + betűs szavak az nytimes.com címsoraiból
- Adja át ezeket a szavakat a for-ciklusunknak
1. lépés: A pup segédprogram (vagy a az Ön választása):
2. lépés (feltételezve, hogy a words
változót továbbadják):
Nézze meg a Softwát a Re Carpentry kiváló útmutató a Bash for-ciklusokhoz