Ci

Ciklusok ebben a kurzusban: Julia

2 feladat

A(z) Ciklusok fogalomról

Alapvetően kétféle ciklus létezik:

  1. Addig ismétlünk, amíg egy feltétel teljesül.
  2. Végigmegyünk egy gyűjtemény elemein.

Mindkettő lehetséges Juliában, bár a második talán gyakoribb.

A while ciklus

Azokra a nyitott végű problémákra, ahol előre nem tudjuk, hányszor kell körbejárni a ciklust, Julia a while ciklust kínálja.

Az alapforma meglehetősen egyszerű:

while condition
    do_something()
end

Ebben az esetben a program addig ismétli a ciklust, amíg a condition már nem true.

Kétféleképpen lehet idő előtt kilépni a ciklusból:

  • A break hatására a ciklus kilép, és a végrehajtás a ciklus end utáni soron folytatódik.
  • A return x leállítja az aktuális függvény végrehajtását, és az x visszatérési értéket visszaadja a hívónak.

Ezekkel a lehetőségekkel néha kényelmes lehet egy „végtelen” ciklust létrehozni a while true ... end segítségével, majd a ciklus törzsében megkeresni azt a leállási feltételt, amely kivált egy break vagy return utasítást.

Ciklus egy gyűjteményen

A legegyszerűbb példa egy tartomány bejárása.

Ha valamit tízszer szeretnénk végrehajtani:

for n in 1:10
    do_something(n)
end

Ha az aktuális iteráció nem teljesít valamilyen feltételt, a continue segítségével azonnal átugorhatunk a következő iterációra:

for n in 1:10
    if is_useless(n)
        continue
    end
    
    # we decided this iteration could be useful
    do_something_slow(n)
end

Rövidebb formában az if blokk helyettesíthető ezzel: is_useless(n) && continue.

Sok más gyűjteménytípuson is végigmehetünk: egy tömb elemein, egy string karakterein, egy szótár kulcsain...

A feltétel az, hogy a gyűjtemény iterable legyen. Ezt egy későbbi fogalomnál részletesebben is elmagyarázzuk, de a lényeg, hogy a gyűjteménynek legyen módja kiadni a következő elemet, amikor kérik, és jelezni, hogy elérte a végét, és nincs több elem.

Az eddigi példák az 1:10 tartományon iterálnak, ahol az érték egyben a ciklusindex is.

Általánosabban előfordulhat, hogy nemcsak az értékre, hanem az indexre is szükség van. Erre az eachindex() függvényt használjuk, például így: for i in eachindex(my_array) ... end.

Komprehenziók

Az explicit ciklusok írása általában ritkább a Juliában, mint sok hagyományos nyelvben, mert több tömörebb lehetőség is van.

Különösen gyakori helyzet, amikor egy másik gyűjtemény (vektor, string, halmaz ... sok lehetőség van) elemeiből kell új vektort építenünk.

Aki szereti a Python listaértelmezéseit, annak jó hír, hogy Julia hasonló szintaxist használhat.

A lényege, hogy egy nagyon tömör ciklust hozunk létre egy vektoron belül.

A legegyszerűbb szintaxis így néz ki: result = [f(x) for x in some_collection].

Hagyományos ciklussal ez így írható le:

result = []
for x in some_collection
    push!(result, f(x))
end

Opcionálisan a végére egy feltétel is tehető, hogy csak a gyűjtemény megfelelő elemeit válasszuk ki:

# multiples of 3
julia> [n^2 for n in 1:10 if n%3 == 0]
3-element Vector{Int64}:
  9
 36
 81

# letters beyond 'h' in the alphabet
julia> [uppercase(c) for c in "Julia" if c > 'h']
3-element Vector{Char}:
 'U': ASCII/Unicode U+0055 (category Lu: Letter, uppercase)
 'L': ASCII/Unicode U+004C (category Lu: Letter, uppercase)
 'I': ASCII/Unicode U+0049 (category Lu: Letter, uppercase)

A szintaxis hasonló a Pythonéhoz, de nem azonos. Több változó és/vagy többdimenziós tömbök esetén van némi eltérés, ezért ezt a témát egy későbbi fogalomnál részletesebben is tárgyaljuk.

Egyéb lehetőségek

Modern, nagyrészt funkcionális nyelvként a Juliának (természetesen) számos módja van a gyűjteményeken végzett műveletekre, nem csak az explicit ciklus vagy a komprehenzióba tömörített ciklus.

A későbbi fogalmak olyan alternatívákat vizsgálnak majd, mint a broadcasting és a magasabb rendű függvények.

Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg

Tanuld meg a(z) Ciklusok fogalmat