38
Programiranje 1 Liste, Stringovi, Torke Univerzitet u Beogradu Elektrotehnički fakultet

Liste, Stringovi, Torke - rti.etf.bg.ac.rs · Sadržaj Liste ⚫Ispisivanje liste i sortiranje liste ⚫Ugrađene funkcije za rad sa listama ⚫Kreiranje liste prema zadatom pravilu

  • Upload
    others

  • View
    30

  • Download
    1

Embed Size (px)

Citation preview

  • Programiranje 1

    Liste, Stringovi, Torke

    Univerzitet u BeograduElektrotehnički fakultet

  • Sadržaj

    Liste Ispisivanje liste i sortiranje liste Ugrađene funkcije za rad sa listama Kreiranje liste prema zadatom pravilu

    Stringovi Operacije sa stringovima Formatiranje stringova ASCII

    Torke Pakovanje i raspakivanje torki

    ETF Beograd::Programiranje 1 2/38

  • Ispisivanje liste

    Lista se može ispisati: Kao sama lista, okružena zagradama [] Konvertovana u string Element po element, korišćenjem petlje Korišćenjem operatora * za raspakivanje

    lista = [1, 2, 3, 4, 5]

    print(lista) # [1, 2, 3, 4, 5]print(str(lista)[1:-1]) # 1, 2, 3, 4, 5

    for x in lista:print(x, end=" ") # 1 2 3 4 5

    print()

    print(*lista) # 1 2 3 4 5print(*lista, sep=", ") # 1, 2, 3, 4, 5

    ETF Beograd::Programiranje 1 3/38

  • Sortiranje liste

    Lista se može sortirati korišćenjem: Nekog od algoritama za sortiranje (npr. selection sort) Metode sort() za rad sa listama

    lista = [3, 4, 5, 2, 1]for i in range(len(lista)):

    for j in range(i + 1, len(lista)):if lista[i] > lista[j]:

    lista[i], lista[j] = lista[j], lista[i]print(lista) # [1, 2, 3, 4, 5]

    def fun(elem):return elem % 5

    lista = [3, 4, 5, 2, 1]lista.sort(); # [1, 2, 3, 4, 5]lista.sort(reverse=True); # [5, 4, 3, 2, 1]lista.sort(key=fun); # [5, 1, 2, 3, 4]lista.sort(key=lambda x : x % 5, reverse=True) # [4, 3, 2, 1, 5]

    ETF Beograd::Programiranje 1 4/38

  • Ugrađene funkcije za rad sa listama

    Mogu se koristiti kao pomoć: prilikom provere uslova za prolazak kroz elemente u petlji

    for i, x in enumerate(lista):print("lista[{}] = {}".format(i, x))

    prva = [3, 4, 5, 2, 1]druga = [1, 2, 3, 4, 5]for p, d in zip(prva, druga):

    print(p + d, end=" ") # 4 6 8 6 6

    lista = [3, 4, 5, 2, 1]if lista != sorted(lista):

    lista.sort() # 1 2 3 4 5

    lista = [3, 4, 5, 2, 1]print(*reversed(lista)) # 1 2 5 4 3

    ETF Beograd::Programiranje 1 5/38

  • Kreiranje liste prema zadatom pravilu (1)

    nova = []for x in stara:

    nova.append(x**2)

    nova = [x**2for x in stara

    ]

    nova = []for x in stara:

    if x % 2 == 1:nova.append(x**2)

    nova = [x**2for x in staraif x % 2 == 1

    ]

    Jednostavan način za kreiranje nove liste

    nova = [x**2 for x in stara]

    ETF Beograd::Programiranje 1 6/38

  • Kreiranje liste prema zadatom pravilu (2)

    Lista se kreira korišćenjem elemenata neke druge sekvence (liste, stringa, opsega brojeva, ...)

    Moguće je filtriranje korišćenjem uslovnih izraza

    Pravilo po kojem se kreira lista je proizvoljan izraz

    a = [slovo for slovo in "string"] # ['s', 't', 'r', 'i', 'n', 'g']b = [broj for broj in range(1, 6)] # [1, 2, 3, 4, 5]

    lista = input().split() # ['-3', '4', '5', '-2', '1']lista = [int(x) for x in lista] # [-3, 4, 5, -2, 1]c = [x**3 for x in lista] # [-27, 64, 125, -8, 1]d = [y/x for x, y in zip(lista, c)] # [9.0, 16.0, 25.0, 4.0, 1.0]

    e = [x for x in lista if x >= 0] # [4, 5, 1]f = [x if x >= 0 else -x for x in lista] # [3, 4, 5, 2, 1]

    ETF Beograd::Programiranje 1 7/38

  • Kreiranje liste prema zadatom pravilu (3)

    Dozvoljeno je ugnježdavanje

    matrica = [[1, 2], [3, 4], [5, 6]]

    lista = []for red in matrica:

    for x in red:lista.append(x)

    lista = [xfor red in matricafor x in red

    ]

    # [1, 2, 3, 4, 5, 6]

    matrica = []for i in range(3):

    red = []for j in range(2):

    red.append(i*2 + j + 1)matrica.append(red)

    matrica = []for i in range(3):

    red = [i*2 + j + 1 for j in range(2)]matrica.append(red)

    matrica = [[i*2 + j + 1 for j in range(2)]for i in range(3)

    ]

    ETF Beograd::Programiranje 1 8/38

  • Na programskom jeziku Python sastaviti funkcijukoja računa skalarni proizvod vektora.

    1. zadatak

    p: 1, 2, 3q: 4, 5, 6[1.0, 2.0, 3.0] * [4.0, 5.0, 6.0] = 32.0

    def skalarni_proizvod(p, q):s = [p_koor * q_koor for p_koor, q_koor in zip(p, q)]return sum(s)

    p = [float(x) for x in input("p: ").split(", ")]q = [float(x) for x in input("q: ").split(", ")]print("{} * {} = {}".format(p, q, skalarni_proizvod(p, q)))

    ETF Beograd::Programiranje 1 9/38

  • Na programskom jeziku Python sastaviti programkoji tabelira polinom.

    Primer:

    2. zadatak

    stepen = int(input())koeficijenti = [float(k) for k in input().split()]xmin, xmax, dx = [float(x) for x in input().split(", ")]x = xminwhile x

  • Na programskom jeziku Python sastaviti funkcijekoje za prosleđenu listu i količnik proveravaju: a) Da li je bar jedan element liste deljiv količnikom b) Da li su svi elementi liste deljivi količnikom

    Koristiti ugrađene funkcije any() i all().

    3. zadatak

    def bar_jedan_deljiv(lista, k):deljivost = [not x % k for x in lista]return any(deljivost)

    def svi_deljivi(lista, k):deljivost = [not x % k for x in lista]return all(deljivost)

    ETF Beograd::Programiranje 1 11/38

  • Stringovi

    String literali se okružuju znacima navoda: Jednostrukim ('…') ili dvostrukim ("…")

    Ako se string piše u više redova, okružuje se satri para znaka navoda: Jednostrukih (' ' '…'' ') ili dvostrukih ("""…""")

    print('Tekst između jednostrukih znaka navoda.')print("Tekst između dvostrukih znaka navoda.")

    print("""Tekstnapisan u višeredova mora seokružiti satri para znakanavoda""")

    ETF Beograd::Programiranje 1 12/38

  • Operacije sa stringovima

    Dodela vrednosti promenljivoj tipa string obavljase korišćenjem operatora =

    Konkatenacija (nadovezivanje) dva stringa se obavlja korišćenjem operatora +

    Elementima stringa se pristupa korišćenjem [] Za proveru da li se neki string nalazi u drugom

    stringu koriste se operatori in i not ina = "Ovo je "b = "kraj rečenice."c = a + b # c = "Ovo je kraj rečenice."d = c[7:11] # d = "kraj"e = d in c # e = True

    ETF Beograd::Programiranje 1 13/38

  • Formatiranje stringova

    print("{} reč".format("jedna")) # jedna rečprint("{} i {}".format("prva", "druga")) # prva i drugaprint("{1} i {0}".format("prva", "druga")) # druga i prvaprint("{macak} i {mis}".format(mis = "Jerry", macak = "Tom")) # Tom i Jerry

    print("{:10d}".format(42)) # 42print("{:010b}".format(42)) # 0000101010print("{:10.2f}".format(-3.141592653589793)) # -3.14print('{:=+10.5f}'.format(3.141592653589793)) # + 3.14159

    Uparivanje:

    Formatiranje brojeva:

    print("{:9s}".format("desno!")) # ...desno!print("{:-^9.3s}".format("sredina")) # ---sre---

    Formatiranje teksta:

    ETF Beograd::Programiranje 1 14/38

  • 4. zadatak (1/2)

    Na programskom jeziku Python sastaviti programkoji sa standardnog ulaza učitava studentski mejlformata [email protected], a zatim iznjega dobija podatke o fakultetu, tipu studija(osnovne ili master) i broju indeksa studenta iispisuje ih na standardnom izlazu.

    Unesite vaš studentstki mejl: [email protected] ste student osnovnih studija.Studirate na ETF-u.Vaš broj indeksa je 2019/0189.

    ETF Beograd::Programiranje 1 15/38

  • 4. zadatak (2/2)

    email = input("Unesite vaš studentstki mejl: ")year = email[2:4]number = email[4:8]type = email[8]school = email[-6:-3]full_year = ("20" if int(year)

  • 5. zadatak (1/2)

    Na programskom jeziku Python sastaviti programkoji pronalazi palindrome.

    Unesite rečenicu: Maja sa Nedom ode na sajam"Maja sa Nedom ode na sajam" JESTE palindrom.

    def prepareSentence(s):return s.lower().strip().replace(" ", "")

    def isPalindrome1(s):prepared = prepareSentence(s)for i in range(len(prepared) // 2):

    if prepared[i] != prepared[-i-1]:return False

    return True

    ETF Beograd::Programiranje 1 17/38

  • 5. zadatak (2/2)def isPalindrome2(s):

    prepared = prepareSentence(s)for p, r in zip(prepared, reversed(prepared)):

    if p != r:return False

    return True

    def isPalindrome3(s):prepared = prepareSentence(s)reverse = prepared[::-1]return prepared == reverse

    sentence = input("Unesite rečenicu: ")if isPalindrome3(sentence):

    print("\"{}\" JESTE palindrom.".format(sentence))else:

    print("\"{}\" NIJE palindrom.".format(sentence))

    ETF Beograd::Programiranje 1 18/38

  • 6. zadatak

    Na programskom jeziku Python sastaviti programkoji pronalazi i ispisuje najdužu od učitanih reči.Reči se odvajaju razmakom. Ako ima više reči istedužine ispisati prvu. Šta u kodu treba izmeniti da bise ispisala poslednja takva reč.

    words = input("Unesi reči odvojene razmakom: ").split()longest = ""for word in words:

    if len(word) > len(longest):longest = word

    print("Najduža reč je {}.".format(longest))print("Sastoji se od {} karaktera.".format(len(longest)))

    ETF Beograd::Programiranje 1 19/38

  • 7. zadatak (1/4)

    Na programskom jeziku Python sastaviti funkcijukoja proverava da li se u prosleđenoj rečenici svakainstanca prvog prosleđenog slova nalazi pre svakeinstance drugog prosleđenog slova. Prosleđenaslova se pojavljuju bar jednom u rečenici.

    Unesite rečenicu: ranijih godina se predavao pascalUnesite slova: i pSvako slovo i se nalazi pre svakog slova p.

    Unesite rečenicu: profesori predaju python na programiranjuUnesite slova: p oNije svako slovo p pre svakog slova o.

    ETF Beograd::Programiranje 1 20/38

  • 7. zadatak (2/4)def isEveryFirstBeforeEvertSecond(sentence, first, second):

    f = 0s = len(sentence)found = Falsefor i, letter in enumerate(sentence):

    if letter == first:f = i

    elif letter == second and not found:s = ifound = True

    return f < s

    Da li može efikasnije? Da li je bitna pozicija slova urečenici za određivanje uslova?

    ETF Beograd::Programiranje 1 21/38

  • 7. zadatak (3/4)

    Da li može preko metoda za rad sa stringovima?

    def isEveryFirstBeforeEvertSecond(sentence, first, second):f = Falses = Falsefor letter in sentence:

    if letter == first:if s:

    return Falsef = True

    elif letter == second:if not f:

    return Falses = True

    return True

    ETF Beograd::Programiranje 1 22/38

  • 7. zadatak (4/4)

    def isEveryFirstBeforeEvertSecond(sentence, first, second):return sentence.rindex(first) < sentence.index(second)

    sentence = input("Unesite rečenicu: ")first, second = input("Unesite slova: ").split()if isEveryFirstBeforeEvertSecond(sentence, first, second):

    print("Svako slovo {} se nalazi pre svakog slova {}.".format(first, second))

    else:print("Nije svako slovo {} pre svakog slova {}."

    .format(first, second))

    ETF Beograd::Programiranje 1 23/38

  • 8. zadatak (1/2)

    Na programskom jeziku Python sastaviti programkoji uneti broj prikazuje u Majanskom brojnomsistemu. U pitanju je brojni sistem sa osnovom 20.Svaka cifra se prikazuje korišćenjem tačaka i crtica,dok se cifra 0 prikazuje kao školjka.

    Primeri: 33 = 1*201 + 13*200

    5125 = 12*202 + 16*201 + 5*200

    ETF Beograd::Programiranje 1 24/38

  • 8. zadatak (2/2)number = int(input("Unesi broj: "))mayan = []while number:

    remainder = number % 20if remainder:

    dots = "{:^5}\n".format("o" * (remainder % 5))bars = "_____\n" * (remainder // 5)symbol = dots + bars

    else:symbol = "{:^5}".format("@")

    mayan.append(symbol)number = number // 20;

    mayan.reverse()if not mayan:

    mayan.append("{:^5}".format("@"))for digit in mayan:

    print(digit)

    ETF Beograd::Programiranje 1 25/38

  • ASCII

    Upravljački znaci (0-31) Znaci koji uvek mogu da se štampaju (32-127)

    ETF Beograd::Programiranje 1 26/38

  • 9. zadatak (1/3)

    Na programskom jeziku Python sastaviti programkoji u zadatom tekstu prebrojava mala i velikaslova, cifre i ostale znake. Obrađuje se linija polinija, sve dok se ne unese prazan red. U programuiskoristiti: a) ugrađene funkcije: ord() i chr() b) metode za rad sa stringovima: isupper(), islower(),

    isalpha() i isdigit()

    ETF Beograd::Programiranje 1 27/38

  • 9. zadatak (2/3)

    a):

    num_ll = num_ul = num_di = num_ot = 0ll = [chr(l) for l in range(ord("a"), ord("z") + 1)]ul = [chr(l) for l in range(ord("A"), ord("Z") + 1)]di = [chr(d) for d in range(ord("0"), ord("9") + 1)]while True:

    line = input()if len(line) == 0: breakfor char in line:

    if char in ll: num_ll += 1elif char in ul: num_ul += 1elif char in di: num_di += 1else: num_ot += 1

    print(num_ll, num_ul, num_di, num_ot)

    ETF Beograd::Programiranje 1 28/38

  • 9. zadatak (3/3)

    b):

    num_ll = num_ul = num_di = num_ot = 0while True:

    line = input()if len(line) == 0: breakfor char in line:

    if char.isalpha() and char.islower(): num_ll += 1elif char.isalpha() and char.isupper(): num_ul += 1elif char.isdigit(): num_di += 1else: num_ot += 1

    print(num_ll, num_ul, num_di, num_ot)

    Da li su neophodni svi postavljeni uslovi?

    ETF Beograd::Programiranje 1 29/38

  • Torke

    Kolekcije drugih objekata (kao lista) Nepromenljiv tip podataka (za razliku od lista):

    Brže iteracije kroz torke nego kroz liste

    Elementi mogu biti različitih tipova (kao kod lista) Elementi su uređeni (kao kod lista) Dozvoljeni su duplikati (kao kod lista)

    torka = tuple([1, "tekst", 1, False]) # (1, 'tekst', 1, False)torka = (1, "tekst", 1, False) # (1, 'tekst', 1, False)torka = 1, "tekst", 1, False # (1, 'tekst', 1, False)torka = (1,) # (1,)torka = 1, # (1,)

    ETF Beograd::Programiranje 1 30/38

  • 10. zadatak

    Na programskom jeziku Python sastaviti programkoji sortira dva prosleđena broja.

    def min_max(a, b):return min(a, b), max(a, b)

    a, b = input("A, B: ").split()a, b = min_max(a, b)asc_desc = input("R | O: ")if asc_desc in ("o", "O"):

    a, b = b, aprint("{}: {}, {}".format(asc_desc, a, b))

    Gde su sve korišćene torke u zadatku?ETF Beograd::Programiranje 1 31/38

  • Pakovanje i raspakivanje torki

    Pakovanje i raspakivanje torki realizuje sekorišćenjem operatora *

    def pakovanje(*torka):for element in torka:

    print(element, end=' ')print()

    pakovanje(3, 2, 4, 5, 1) # 3 2 4 5 1

    def raspakivanje(a, b, c, d):print(a, b, c, d)

    lista = [1, 2, 3, 4]raspakivanje(*lista) # 1 2 3 4print(*lista) # 1 2 3 4

    torka = (1, "tekst", 1, False)a, b, *c = torka # a = 1 b = 'tekst' c = [1, False]

    ETF Beograd::Programiranje 1 32/38

  • Pregled

    ETF Beograd::Programiranje 1 33/38

  • Pregled – Funkcije i metode

    Ugrađene funkcije: sorted() reversed()

    Metode za rad sa stringovima: upper() lower() strip()

    Metode za rad sa listama: sort()

    replace() index() rindex()

    enumerate() zip()

    any() all()

    find() rfind() isupper()

    islower() isaplha() isdigit()

    ETF Beograd::Programiranje 1 34/38

    ord() chr()

  • Pregled – Operatori

    Aritmetički operatori Bitski operatori Operatori dodele Relacioni operatori Logički operatori Operatori identiteta Operatori pripadnosti

    in, not in

    ETF Beograd::Programiranje 1 35/38

  • Pregled – Tipovi podataka

    Int Float Complex Boolean String List Tuple Set Dict

    Numerički tipovi

    Logički tip

    Kolekcije

    ETF Beograd::Programiranje 1 36/38

  • Literatura – Knjige

    M. Kovačević, Osnove programiranja u Pajtonu, Akademska misao, Beograd, 2017.

    M. Lutz, Learning python: Powerful object-oriented programming, 5th edition, O'Reilly Media, Inc., 2013.

    J. Zelle, Python Programming: An Introduction to Computer Science, 3rd Ed., Franklin, Beedle & Associates, 2016.

    D. Beazley, B. K. Jones, Python Cookbook, 3rd edition, O'Reilly Media, 2013.

    A. Downey, J. Elkner, C. Meyers, How To Think Like A Computer Scientist: Learning With Python, free e-book

    ETF Beograd::Programiranje 1 37/38

  • Literatura – Online izvori

    Python 3 documentation, https://docs.python.org/3/index.html

    Learn Python, Basic tutorial, https://www.learnpython.org/

    TutorialsPoint, Python tutorial https://www.tutorialspoint.com/python/index.htm

    W3Schools, Python tutorial https://www.w3schools.com/python/

    GeeksforGeeks, Python programming language https://www.geeksforgeeks.org/python-programming-language/

    ETF Beograd::Programiranje 1 38/38