Se

Semmi ebben a kurzusban: Julia

1 feladat

A(z) Semmi fogalomról

Sok nyelvben van valami, például a null vagy a none, amivel egy nem létező értéket lehet jelölni. Mivel a Juliát nagy mennyiségű, gyakran rendezetlen adat kezelésére tervezték, többféle formában is kifejezi a semmit.

A fő cél, hogy a hiányzó vagy gyanús értékeket már akkor megjelölje, amikor előkerülnek, majd kivétel dobása nélkül folytassa a működést.

nothing

Ha egy érték valóban nem létezik, azt a nothing képviseli. Ez áll valószínűleg legközelebb ahhoz, amit a C (NULL) vagy a Python (None) tenne.

julia> n = nothing

julia> isnothing(n)
true

julia> typeof(n)
Nothing

A nothing tehát a Nothing típus egyetlen értéke, és tesztelni is tudjuk.

A nothing egyik gyakori felhasználása, hogy visszatérési (nem)értékként szolgál azoknak a függvényeknek, amelyeket csak a mellékhatásaik miatt hívunk (kiírás, hálózat beállítása, vagy bármi más).

missing

Azokban az esetekben, amikor egy érték elvileg létezik, de nem tudjuk, mi az, a missing használatos. Például amikor az úton haladó járműveket számoljuk, előfordulhat, hogy az emberi megfigyelőknek szünetre van szükségük, vagy meghibásodnak az automatikus érzékelők, a forgalom viszont tovább halad.

A missing tehát egy helyőrző, amely figyelmezteti az embereket, hogy dönteniük kell, mit kezdenek az adatokban keletkezett hézaggal.

julia> mv = [1, 2, missing]
3-element Vector{Union{Missing, Int64}}:
 1
 2
  missing

julia> typeof(mv)
Vector{Union{Missing, Int64}} (alias for Array{Union{Missing, Int64}, 1})

julia> ismissing.(mv)  # broadcast function, displays as 1 for true, 0 for false
3-element BitVector:
 0
 0
 1

Kevés más nyelvben van ez a funkció beépítve, de közeli megfelelői az R NA-ja vagy az SQL NULL-ja.

A fenti példában szereplő vektor típusa Union{Missing, Int64}, ami némileg hasonlít más nyelvek Option vagy Maybe típusához.

A kifejezések alapértelmezés szerint általában missing értéket adnak vissza, ha missing értékek vannak bennük. Ha azt szeretnéd, hogy ezeket az értékeket figyelmen kívül hagyják, használd a skipmissing() függvényt, hogy ezt egyértelművé tedd:

julia> mv = [1, 2, missing]
3-element Vector{Union{Missing, Int64}}:
 1
 2
  missing

julia> sum(mv)  # missing in, missing out
missing

julia> skipmissing(mv)
skipmissing(Union{Missing, Int64}[1, 2, missing])

julia> collect(skipmissing(mv))
2-element Vector{Int64}:
 1
 2

julia> sum(skipmissing(mv))  # functions like sum() can work with iterators
3

Mivel a skipmissing egy iterátort hoz létre, ha vektorra van szükséged, az collect() függvénnyel csomagold be.

Néha hasznos, ha a missing értékeket valamilyen alapértelmezett értékkel helyettesítjük. Erre a @coalesce() makró hasznos, mert az első nem hiányzó értéket adja vissza (vagy missing-et, ha nincs más).

julia> str = ["I", "exist", missing]
3-element Vector{Union{Missing, String}}:
 "I"
 "exist"
 missing

julia> [@coalesce(s, "-") for  s in str]
3-element Vector{String}:
 "I"
 "exist"
 "-"

NaN

A NaN a „Not a Number”, azaz „nem szám” rövidítése, és olyan helyzetekben jelez számítási problémát, ahol számot vártunk volna.

julia> v = [0, 1, -1]
3-element Vector{Int64}:
  0
  1
 -1

julia> v / 0
3-element Vector{Float64}:
 NaN
  Inf
 -Inf
 
julia> sum(v / 0)
NaN

Ha az adatok között NaN szerepel, bármilyen számítás NaN eredményt ad.

Jelenleg nincs külön függvény a NaN értékek eltávolítására, de a szabványos filter() függvény ezt egészen egyszerűen megoldja. Csak azok az értékek kerülnek be az eredménytömbbe, amelyekre a megadott feltétel true:

julia> filter(!isnan, [1, 2, NaN])
2-element Vector{Float64}:
 1.0
 2.0

Nem definiált adatok

Ezzel valószínűleg ritkábban találkozol majd. Kivétel például:

  • Az összetett típusokat (például a struct-ot) létrehozhatod inicializálatlan mezőkkel is. A Julia általában alapértelmezett értékeket próbál használni, de ezt csak akkor teheti meg, ha elég információja van a mező típusának kikövetkeztetéséhez.
  • Bizonyos esetekben egy vektor undef értékkel való inicializálása rugalmas és gyors megközelítés lehet. Ezt például a Circular Buffer feladat közösségi megoldásaiban is alkalmazták (ez egy haladó technika, a feladat viszont nehéz besorolást kapott).

Ha egy érték elérésére tett kísérlet undef eredményt ad, az hibás állapot, amelyet általában egy UndefRefError jelez.

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

Tanuld meg a(z) Semmi fogalmat