Python Vadovėlis/Sąrašai

Iš wiki.angis.net.
Jump to navigation Jump to search
 ← Rekursinės funkcijos Turinys Ciklai For → 


Kintamieji, turintys daugiau nei vieną reikšmę

Tu jau žinai įprastus kintamuosius, kuriuose saugoma viena reikšmė. Tačiau kiti kintamųjų tipai gali turėti daugiau nei vieną reikšmę. Jie vadinami konteineriais (containers), nes juose gali būti daugiau nei vienas objektas. Paprasčiausias tipas vadinamas sąrašu (list). Sąrašo pavyzdys:

kuris = int(input("Kuris mėnuo (1-12)? "))
mėnesiai = ["Sausis", "Vasaris", "Kovas", "Balandis", "Gegužė", "Birželis", "Liepa",
          "Rugpjūtis", "Rugsėjis", "Spalis", "Lapkritis", "Gruodis"]

if 1 <= kuris <= 12:
    print("Mėnuo yra ", mėnesiai[kuris - 1])

pavyzdžio išvestis būtų:

Kuris mėnuo (1-12)? 3
Mėnuo yra Kovas

Šiame pavyzdyje mėnesiai yra sąrašas. Kintamasis mėnesiai yra apibrėžtas šia eilute mėnesiai = ["Sausis", "Vasaris", "Kovas", "Balandis", "Gegužė", "Birželis", "Liepa", ir "Rugpjūtis", "Rugsėjis", "Spalis", "Lapkritis", "Gruodis"] (atkreipk dėmesį, kad viena komanda parašyta per dvi eilutes; paprastai keliant eilutę yra naudojamas simbolis / tačiau šiuo atveju jis nėra būtinas, nes Python'as supranta, kad viskas, kas yra laužtiniuose skliaustuose yra kartu). [ ir ] pradeda ir užbaigia sąrašą, o kableliai (,) atskiria sąrašo elementus. Sąrašas naudojamas šioje dalyje: mėnesiai[kuris - 1]. Sąrašas susideda iš elementų, kurie sunumeruoti pradedant nuo 0. Kitaip tariant, norint sąraše pasiekti elementą "Sausis", turėtum rašyti mėnesiai[0]. Nurodant sąrašui skaičių, tu gauni reikšmę išsaugotą toje sąrašo pozicijoje.

Sąlyginis sakinys if 1 <= kuris <= 12: tikrina, ar skaičius kintamajame kuris yra tarp vieno ir dvylikos imtinai (tiek yra mėnesių ir taip jie numeruojami).

Viename sąraše gali būti saugomi ir skirtingų tipų duomenys. Kiekvienas elementas saugo vis kitą reikšmę. Pavyzdžiui, sąrašas sukurtas šiuo kodu: demoSąrašas = ["gyvybė", 42, "visata", 6, "ir", 9] atrodytų taip:

elemento numeris 0 1 2 3 4 5
demoSąrašas "gyvybė" 42 "visata" 6 "ir" 9

Kiekvienas elementas pasiekiamas per jo eilės numerį – indeksą, todėl komanda demoSąrašas[0] pateiktų reikšmę: "gyvybė", o komanda demoSąrašas[1] – reikšmę 42 ir taip toliau iki kol demoSąrašas[5] pateikia reikšmę 9.

Daugiau sąrašų funkcijų

Kitas pavyzdys yra skirtas parodyti daugybę kitų dalykų, kuriuos gali padaryti sąrašai (šį kartą nesitikiu, kad viską pats sugebėsi parašyti, bet tikriausiai turėtum šiek tiek pažaisti su sąrašais interaktyviame režime, kol apsiprasi su jais). Pavyzdys:

demoSąrašas = ["gyvybė", 42, "visata", 6, "ir", 9]
print("demoSąrašas = ", demoSąrašas)
demoSąrašas.append("oras")
print("po 'oras' pridėjimo, demoSąrašas atrodo taip:")
print(demoSąrašas)
print("len(demoSąrašas) =", len(demoSąrašas))
print("demoSąrašas.index(42) =", demoSąrašas.index(42))
print("demoSąrašas[1] =", demoSąrašas[1])

# o dabar mes pereisime per visą sąrašą "for" ciklu
for c in range(len(demoSąrašas)):
    print("demoSąrašas[", c, "] =", demoSąrašas[c])

del demoSąrašas[2]
print("Po 'visata' pašalinimo, demoSąrašas atrodo taip:")
print(demoSąrašas)
if "gyvybė" in demoSąrašas:
    print("'gyvybė' buvo rasta kintamajame demoSąrašas")
else:
    print("'gyvybė' nebuvo rasta kintamajame demoSąrašas")

if "ameba" in demoSąrašas:
    print("'ameba' buvo rasta kintamajame demoSąrašas")

if "ameba" not in demoSąrašas:
    print("'ameba' nebuvo rasta kintamajame demoSąrašas")

kitasSąrašas = [42, 7, 0, 123]
kitasSąrašas.sort()
print("Išrikiuotas kitasSąrašas atrodo taip", kitasSąrašas)

Kodo išvestis būtų tokia:

demoSąrašas = ["gyvybė", 42, "visata", 6, "ir", 9]
po "oras" pridėjimo, demoSąrašas atrodo taip:
["gyvybė", 42, "visata", 6, "ir", 9, "oras"]
len(demoSąrašas) = 7
demoSąrašas.index(42) = 1
demoSąrašas[1] = 42
demoSąrašas[ 0 ] = gyvybė
demoSąrašas[ 1 ] = 42
demoSąrašas[ 2 ] = visata
demoSąrašas[ 3 ] = 6
demoSąrašas[ 4 ] = ir
demoSąrašas[ 5 ] = 9
demoSąrašas[ 6 ] = oras
Po 'visata' pašalinimo, demoSąrašas atrodo taip:
["gyvybė", 42, 6, "ir", 9, "oras"]
"gyvybė" buvo rasta kintamajame demoSąrašas
"ameba" nebuvo rasta kintamajame demoSąrašas
Išrikiuotas kitasSąrašas atrodo taip [0, 7, 42, 123]

Šiame pavyzdyje rasi daug naujų funkcijų. Atkreipk dėmesį, kad gali tiesiog atspausdinti (print) visą sąrašą. Toliau funkcija append naudojama tam, kad pridėtum naują elementą į sąrašo pabaigą. len grąžina kiek elementų yra sąraše. Tinkami sąrašo indeksai (skaičiai kuriuos naudojame viduje laužtinių skliaustų []) yra nuo 0 iki len - 1. Funkcija index nurodo, kur sąraše yra pirmoji elemento vieta. Atkreipk dėmesį, kaip demoSąrašas.index(42) pateikia 1, o paleidus demoSąrašas[1] grąžina 42. Norint gauti pagalbos dėl visų sąrašo funkcijų, įvykdyk komandą help(list) interaktyviajame Python'o interpretatoriuje.

Eilutė # o dabar mes pereisime per visą sąrašą for ciklu yra tik priminimas programuotojui (dar vadinamas kaip „komentaras“). Python'as ignoruoja viską, kas parašyta esamoje eilutėje po simbolio #. Toliau eilutės:

for c in range(len(demoSąrašas)):
    print("demoSąrašas[", c, "] =", demoSąrašas[c])

sukuria kintamajį c, kuris prasideda nuo 0 ir didinamas vienetu, kol pasiekia paskutinį sąrašo indeksą. Tuo tarpu print komanda išspausdina kiekvieną sąrašo elementą.

Daug geresnis būdas tai padaryti:

for c, x in enumerate(demoSąrašas):
    print("demoSąrašas[", c, "] =", x)

Komanda del gali būti naudojama tam tikram sąrašo elementui pašalinti. Kitos kelios eilutės naudoja in operatorių, kad patikrintų, ar elementas yra sąraše, ar ne. Funkcija sort rūšiuoja sąrašą. Tai naudinga, jei tau reikia sąrašo nuo mažiausio iki didžiausio arba abėcėlės tvarka. Atmink, kad tai pakeičia sąrašą. Apibendrinant, su sąrašu yra atliekami šie veiksmai:

pavyzdys paaiškinimas
demoSąrašas[2] grąžina 2 sąrašo demoSąrašas elementą
demoSąrašas[2] = 3 į sąrašo demoSąrašas 2 poziciją (numeruojama nuo 0) įrašo reikšmę 3
del demoSąrašas[2] pašalina sąrašo demoSąrašas elementą, esantį 2 pozicijoje
len(demoSąrašas) grąžina demoSąrašas sąrašo ilgį, t.y. elementų skaičių
"reikšmė" in demoSąrašas yra True jeigu "reikšmė" yra elementas, priklausantis demoSąrašas
"reikšmė" not in demoSąrašas yra True jeigu "reikšmė" nėra elementas, priklausantis demoSąrašas
kitasSąrašas.sort() surūšiuoja kitasSąrašas. Atmink, kad rūšiavimas pavyktų, visi sąrašo elementai turi būti arba skaičiai, arba eilutės (string).
demoSąrašas.index("reikšmė") grąžina pirmosios vietos, kurioje atsiranda "reikšmė", indeksą
demoSąrašas.append("reikšmė") sąrašo pabaigoje prideda elementą "reikšmė"
demoSąrašas.remove("reikšmė") pašalina pirmą rastą elementą su nurodyta reikšme iš demoSąrašas (taip pat, kaip del demoSąrašas[demoSąrašas.index("reikšmė")])

Pavyzdžiai, kur praktiškai naudojamos šios funkcijos:

meniuElementas = 0
vardųSarašas = []
while meniuElementas != 9:
    print("--------------------")
    print("1. Spausdinti sąrašą")
    print("2. Pridėti vardą prie sąrašo")
    print("3. Pašalinti vardą iš sąrašo")
    print("4. Pakeisti elementą sąraše")
    print("9. Išeiti")
    meniuElementas = int(input("Pasirinkite elementą iš meniu: "))
    if meniuElementas == 1:
        dabartinis = 0
        if len(vardųSarašas) > 0:
            while dabartinis < len(vardųSarašas):
                print(dabartinis, ".", vardųSarašas[dabartinis])
                dabartinis = dabartinis + 1
        else:
            print("Sąrašas tuščias")
    elif meniuElementas == 2:
        vardas = input("Įveskite vardą, kurį norite pridėti: ")
        vardųSarašas.append(vardas)
    elif meniuElementas == 3:
        šalinamasVardas = input("Kokį vardą norėtumėte pašalinti:")
        if šalinamasVardas in vardųSarašas:
            # vardųSarašas.remove(šalinamasVardas) veiktų taip pat gerai
            elementoIndeksas = vardųSarašas.index(šalinamasVardas)
            del vardųSarašas[elementoIndeksas]
            # Aukščiau pateiktas kodas pašalina tik pirmąjį surasta vardą.
            # Žemiau esantis kodas pašalina visus.
            # while šalinamasVardas in vardųSarašas:
            #       elementoIndeksas = vardųSarašas.index(šalinamasVardas)
            #       del vardųSarašas[elementoIndeksas]
        else:
            print(šalinamasVardas, "nerastas")
    elif meniuElementas == 4:
        senasVardas = input("Kokį vardą norėtumėte pakeisti:")
        if senasVardas in vardųSarašas:
            elementoIndeksas = vardųSarašas.index(senasVardas)
            naujasVardas = input("Koks yra naujas vardas: ")
            vardųSarašas[elementoIndeksas] = naujasVardas
        else:
            print(senasVardas, "nerastas")

print("Iki pasimatymo")

Ir čia yra išvesties dalis:

--------------------
1. Spausdinti sąrašą
2. Pridėti vardą prie sąrašo
3. Pašalinti vardą iš sąrašo
4. Pakeisti elementą sąraše
9. Išeiti

Pasirinkite elementą iš meniu: 2
Įveskite vardą, kurį norite pridėti: Benas

Pasirinkite elementą iš meniu: 2
Įveskite vardą, kurį norite pridėti: Liepa

Pasirinkite elementą iš meniu: 1
0. Benas
1. Liepa

Pasirinkite elementą iš meniu: 3
Kokį vardą norėtumėte pašalinti: Benas

Pasirinkite elementą iš meniu: 4
Kokį vardą norėtumėte pakeisti: Liepa
Koks yra naujas vardas: Liepa Petraitė

Pasirinkite elementą iš meniu: 1
0. Liepa Petraitė

Pasirinkite elementą iš meniu: 9
Iki pasimatymo

Tai buvo ilga programa. Panagrinėkime pirminį programos tekstą. Eilutė vardųSarašas = [] sukuria kintamajį vardųSarašas, tuščia sąrašą, be elementų. Kita svarbi eilutė yra while meniuElementas != 9:. Ši eilutė pradeda ciklą, leidžiantį šios programos meniu sistemai veikti. Kitos eilutės parodo meniu ir nusprendžia, kurią programos dalį paleisti.

Ši dalis:

dabartinis = 0
    if len(vardųSarašas) > 0:
        while dabartinis < len(vardųSarašas):
            print(dabartinis, ".", vardųSarašas[dabartinis])
            dabartinis = dabartinis + 1
    else:
        print("Sąrašas tuščias")

eina per sąrašą ir spausdina kiekvieną vardą. len(vardųSarašas) nurodo, kiek elementų yra sąraše. Jei len grąžina 0, tai reiškia sąrašas tuščias.

Toliau po kelių eilučių matysi sakinį vardųSarašas.append(vardas). Jis naudoja funkciją append, kad pridėtų elementą į sąrašo pabaigą. Peršokus dar dvi eilutes, pastebėsi šią kodo dalį:

elementoIndeksas = vardųSarašas.index(šalinamasVardas)
del vardųSarašas[elementoIndeksas]

Čia funkcija index yra naudojama norint rasti indekso reikšmę, kuri vėliau bus naudojama elementui pašalinti. del vardųSarašas[elementoIndeksas] naudojamas sąrašo elementui pašalinti.

Kitoje kodo dalyje

senasVardas = input("Kokį vardą norėtumėte pakeisti:")
if senasVardas in vardųSarašas:
    elementoIndeksas = vardųSarašas.index(senasVardas)
    naujasVardas = input("Koks yra naujas vardas: ")
    vardųSarašas[elementoIndeksas] = naujasVardas
else:
    print(senasVardas, "nerastas")

naudojamas index, kad surastų elementoIndeksas ir tada įdėtų naujasVardas ten, kur buvo senasVardas.

Sveikinu, perpratus sąrašus, dabar tu pakankamai žinai kalbą, kad galėtum atlikti bet kokius skaičiavimus, kuriuos gali atlikti kompiuteris (tai techniškai žinoma kaip Turing-Completeness). Žinoma, vis dar yra daug funkcijų, kurias naudojant tu pasilengvinsi sau gyvenimą.


Pavyzdžiai

testas.py

## Ši programa atlieka žinių patikrinimą

# Pirmiausia surenkame testo klausimus.
# Vėliau šią dalį pakeisime, kad būtų naudojama failinė sistema.
def gauti_klausimus():
    # atkreipk dėmesį, kad duomenys saugomi kaip sąrašų sąrašas
    return [["Kokios spalvos yra dangus giedrą dieną? ", "mėlynas"],
            ["Koks atsakymas į gyvenimą, visatą ir viską? ", "42"],
            ["Kas yra keturių raidžių žodis pelės gaudyklei? ", "katė"]]

# Ši dalis patikrins vieną klausimą
# pateikiamas vienas klausimas
# grąžinama teisinga (True), jei vartotojas įvedė teisingą atsakymą, kitu atveju - klaidinga (False)

def pateik_klausimą(klausimas_ir_atsakymas):
    # ištraukiame klausimą ir atsakymą iš sąrašo
    # Ši funkcija priima dviejų elementų sąrašą, klausimą ir atsakymą.  
    klausimas = klausimas_ir_atsakymas[0]   
    atsakymas = klausimas_ir_atsakymas[1]
    # užduodame klausimą vartotojui
    duotas_atsakymas = input(klausimas)
    # palyginame vartotojo atsakymą su teisingu atsakymu
    if atsakymas == duotas_atsakymas:
        print("Teisingai")
        return True
    else:
        print("Neteisingai. Teisingas atsakymas: ", atsakymas)
        return False

# Šis kodas apims visus klausimus
def atlikti_testus(klausimai):
    if len(klausimai) == 0:
        print("Nepateiktas nei vienas klausimas.")
        # `return` išeis iš funkcijos
        return
    indeksas = 0
    teisingai = 0
    while indeksas < len(klausimai):
        # patikriname klausimą
        # Atkreipk dėmesį, kad tai yra klausimų ir atsakymų sąrašo ištraukimas iš sąrašų sąrašo.
        if pateik_klausimą(klausimai[indeksas]): 
            teisingai = teisingai + 1
        # pareiname prie kito klausimo
        indeksas = indeksas + 1
    # atkreipk dėmesį į skaičiavimo tvarką: pirmiausia padaugini, tada padalini
    print("Atsakei teisingai į ", teisingai * 100 / len(klausimai),\
           "% klausimų iš ", len(klausimai))

# dabar paimkime klausimus iš funkcijos gauti_klausimus ir
# paduokime grąžintą sąrašų sąrašą kaip argumentą funkcijai atlikti_testus.

atlikti_testus(gauti_klausimus())

Reikšmės True ir False turi reikšmes atitinkamai 1 ir 0. Jie dažnai naudojami loginės sekos patikrinimui, ciklo sąlygoms ir pan. Daugiau apie tai sužinosi šiek tiek vėliau (skyrius Loginiai reiškiniai). Atkreipk dėmesį, kad gauti_klausimus() iš esmės yra sąrašas, nors tai techniškai yra funkcija - sąrašų grąžinimas yra vienintelis dalykas, kurį jis daro.

Pavyzdžio išvestis:

Kokios spalvos yra dangus giedrą dieną? žalias
Neteisingai. Teisingas atsakymas: mėlynas
Koks atsakymas į gyvenimą, visatą ir viską? 42
Teisingai
Kas yra keturių raidžių žodis pelės gaudyklei? katė
Teisingai
Atsakei teisingai į 66% klausimų iš 3


Pratimai

Išplėsk testas.py programą, kad ji turėtų meniu, kuriame būtų galima atlikti testą, peržiūrėti klausimų ir atsakymų sąrašą ir pasirinkti išeiti iš programos. Taip pat, pridėk naują klausimą: „Kokį triukšmą kelia tikrai pažangi mašina?“ su teisingu atsakymu „ping“.

Sprendimas  
## Ši programa atlieka žinių patikrinimą

klausimai = [["Kokios spalvos yra dangus giedrą dieną? ", "mėlynas"],
             ["Koks atsakymas į gyvenimą, visatą ir viską? ", "42"],
             ["Kas yra keturių raidžių žodis pelės gaudyklei? ", "katė"],
             ["Kokį triukšmą kelia tikrai pažangi mašina?", "ping"]]

# Ši dalis patikrins vieną klausimą
# pateikiamas vienas klausimas
# grąžinama teisinga (True), jei vartotojas įvedė teisingą atsakymą, kitu atveju - klaidinga (False)

def pateik_klausimą(klausimas_ir_atsakymas):
    # ištraukiame klausimą ir atsakymą iš sąrašo
    # Ši funkcija priima dviejų elementų sąrašą, klausimą ir atsakymą.  
    klausimas = klausimas_ir_atsakymas[0]   
    atsakymas = klausimas_ir_atsakymas[1]
    # užduodame klausimą vartotojui
    duotas_atsakymas = input(klausimas)
    # palyginame vartotojo atsakymą su teisingu atsakymu
    if atsakymas == duotas_atsakymas:
        print("Teisingai")
        return True
    else:
        print("Neteisingai. Teisingas atsakymas: ", atsakymas)
        return False

# Šis kodas apims visus klausimus
def atlikti_testus(klausimai):
    if len(klausimai) == 0:
        print("Nepateiktas nei vienas klausimas.")
        # `return` išeis iš funkcijos
        return
    indeksas = 0
    teisingai = 0
    while indeksas < len(klausimai):
        # patikriname klausimą
        # Atkreipk dėmesį, kad tai yra klausimų ir atsakymų sąrašo ištraukimas iš sąrašų sąrašo.
        if pateik_klausimą(klausimai[indeksas]): 
            teisingai = teisingai + 1
        # pareiname prie kito klausimo
        indeksas = indeksas + 1
    # atkreipk dėmesį į skaičiavimo tvarką: pirmiausia padaugini, tada padalini
    print("Atsakei teisingai į ", teisingai * 100 / len(klausimai),\
           "% klausimų iš ", len(klausimai))

#rodomas klausimų ir atsakymų sąrašas
def rodyk_klausimus():
    k = 0
    while k < len(klausimai):
        a = 0
        print("K:" , klausimai[k][a])
        a = 1
        print("A:" , klausimai[k][a])
        k = k + 1

# dabar apibrėžiu meniu funkciją
def meniu():
    print("-----------------")
    print("Meniu:")
    print("1 - Atlikti testą")
    print("2 - Peržiūrėti klausimų ir atsakymų sąrašą")
    print("3 - Peržiūrėti meniu")
    print("5 - Išeiti")
    print("-----------------")

pasirinkimas = "3"
while pasirinkimas != "5":
    if pasirinkimas == "1":
        atlikti_testus(klausimai)
    elif pasirinkimas == "2":
        rodyk_klausimus()
    elif pasirinkimas == "3":
        meniu()
    print()
    pasirinkimas = input("Pasirinkite savo parinktį iš aukščiau pateikto meniu: ")
 ← Rekursinės funkcijos Turinys Ciklai For →