Ap/Py/Sąrašų demonstracija
Pilnas šios treniruotės Python kodas yra čia. Tai yra trumpas įvadas, skirtas tiems kas jau žino Pascal ar C++ kalbų masyvus ar yra bandę Vėžliuko grafiką ir nori greitai įgauti supratimą apie darbą su Python sąrašais.
Sąrašai yra indeksuojami
Sąrašų sąvoka yra glaudžiai susijusi su masyvais, kur prieiga prie atskirų elementų atliekama indeksų pagalba, ką demonstruoja pirmoji šios temos funkcija. Sąrašas gali būti užrašomas tiesiogiai programoje, elementus išvardijant tarp laužtinių skliaustų. Pažvelkite į šį pavyzdį:
skaičiai = [11, 8, 10, 6]
# indeksai 0 1 2 3 -> len=4
komandos = ["Žalgiris", "Galiūnas", "Atletas", "Vilkai", "Neptūnas"]
# indeksai 0 1 2 3 4 -> len=5
def demo_indeksai(sąr):
print("Duota->", sąr, "ilgis=", len(sąr))
print(sąr[0], sąr[1], sąr[2]) # pradžia
print(sąr[-1], sąr[-2], sąr[-3]) # pabaiga - atvirkščiai
#=== def end
demo_indeksai(skaičiai)
demo_indeksai(komandos)
demo_indeksai([10, 11, 12, 13, 14, 15, 16])
""" Gaunami rezultatai
Duota-> [11, 8, 10, 6] ilgis= 4
11 8 10
6 10 8
Duota-> ['Žalgiris', 'Galiūnas', 'Atletas', 'Vilkai', 'Neptūnas'] ilgis= 5
Žalgiris Galiūnas Atletas
Neptūnas Vilkai Atletas
Duota-> [10, 11, 12, 13, 14, 15, 16] ilgis= 7
10 11 12
16 15 14
"""
Demonstracinė funkcija rodo šias savybes:
- sąrašą galima spausdinti tiesiogiai kaip vientisą objektą;
- parodo kaip pasiekiami pirmieji trys elementai.
- parodo kad panaudojant neigiamus indeksus patogu nagrinėti sąrašo pabaigą, tai yra naujovė, lyginant su C++ šeimos kalbomis.
Sąrašams skirtos funkcijos
Atliekant sąrašo kaip objekto analizę būtina žinoti, kad jo aktualus dydis nustatomas funkcijos len(sąr) pagalba, todėl parametruose nereikia papildomai nurodyti sąrašo dydžio. Funkcija sum(sąr) grąžina visų sąraše esančių skaičių sumą. Jei sąraše pasitaiko teksto eilučių, signalizuojama apie klaidą. Todėl jei sąrašo elementai prieš sumavimą yra nežinomo tipo, reikia patikrinti ar jie yra int tipo. Matome ir kitas naudingas funkcijas, skirtas mažiausių ir didžiausių reikšmių radimui, rikiavimui.
def demo_funkcijos(sąr):
print("visas sąrašas:", sąr)
print("sąrašo ilgis: ", len(sąr))
if isinstance(sąr[0], int): # sumuoti galima tik skaičius
print("sąrašo suma: ", sum(sąr))
print("sąrašo min: ", min(sąr))
print("sąrašo max: ", max(sąr))
print("Rikiuotas sąr:", sorted(sąr))
print("Galutinis sąr:", sąr, "\n---------")
demo_funkcijos(skaičiai)
demo_funkcijos(komandos)
""" Gaunami rezultatai:
visas sąrašas: [11, 8, 10, 6]
sąrašo ilgis: 4
sąrašo suma: 35
sąrašo min: 6
sąrašo max: 11
Rikiuotas sąr: [6, 8, 10, 11]
Galutinis sąr: [11, 8, 10, 6]
---------
visas sąrašas: ['Žalgiris', 'Galiūnas', 'Atletas', 'Vilkai', 'Neptūnas']
sąrašo ilgis: 5
sąrašo min: Atletas
sąrašo max: Žalgiris
Rikiuotas sąr: ['Atletas', 'Galiūnas', 'Neptūnas', 'Vilkai', 'Žalgiris']
Galutinis sąr: ['Žalgiris', 'Galiūnas', 'Atletas', 'Vilkai', 'Neptūnas']
"""
Sąrašo analizė su indeksais
Analizuojant sąrašus galima naudoti klasikinius ciklus su indeksais, panašiai kaip senosios C kalbos atveju.
Naudojant for i in range(len(sąr)): gausime iteraciją per visus galimus sąrašo indeksus.
def su_indeksais_suma(sąr):
print("Pradinis:", sąr)
suma = 0 # kaupiama suma
for i in range(len(sąr)):
suma += sąr[i] # pridedame eilinį narį
print("sąr["+str(i)+"]=", sąr[i], "\t∑=", suma)
print("Galutinė suma=", suma)
su_indeksais_suma(skaičiai)
skaičiai.append(7)
su_indeksais_suma(skaičiai)
""" Gaunami rezultatai:
Pradinis: [11, 8, 10, 6]
sąr[0]= 11 ∑= 11
sąr[1]= 8 ∑= 19
sąr[2]= 10 ∑= 29
sąr[3]= 6 ∑= 35
Galutinė suma= 35
Pradinis: [11, 8, 10, 6, 7]
sąr[0]= 11 ∑= 11
sąr[1]= 8 ∑= 19
sąr[2]= 10 ∑= 29
sąr[3]= 6 ∑= 35
sąr[4]= 7 ∑= 42
Galutinė suma= 42
"""
Kita sąrašo ypatybė yra ta, kad sąrašą galima eigoje papildyti naudojant funkciją sąr.append(sk), kas yra svarbu dinamiškai formuojant sąrašus. Jei užduotyje yra nagrinėjami sąrašo elementų tarpusavio santykiai (pvz. važiuojama į kalną ar leidžiamasi), tai tokiu atveju geriau naudoti indeksus, kas ir parodyta demo pokyčių skaičiavimo funkcijoje.
Sąrašo analizė be indeksų
Pilnai sąrašo analizei galimi ciklai panaudojant indeksus ir be jų. Ciklas for sk in sąr: dažnai yra skaitomas taip “kiekvienam sk iš sąr” (anglų kalba for each). Panagrinėjus šiuos du atvejus detaliau matyti, kad atvejis be indeksų yra paprastesnis, mažiau galimybių suklysti, todėl ir yra rekomenduojamas naudoti ten, kur indeksai nebūtini.
def be_indeksų_suma(sąr):
suma = 0
for sk in sąr:
suma += sk
print(sk, "\t∑=", suma)
print("Galutinė suma=", suma)
be_indeksų_suma(skaičiai)
skaičiai.append(7)
be_indeksų_suma(skaičiai)
""" Rezultatai tokie patys kaip ir su indeksais """
Savarankiškas darbas
Žinių apie sąrašus įtvirtinimui pateikiama paprasta užduotis:
DUOTA: krepšinio komandos žaidėjų pelnytų taškų sąrašas
taškai = [8, 2, 11, 15, 5, 0, 21, 12, 1]
- parašykite funkciją, kuri pagal surinktus krepšinio rungtynių taškus rastų
- kiek yra silpnų, vidutinių ir gerų žaidėjų:
- silpni < 5 tšk, vidutiniai < 12, geri >= 12