# Obiekty iterowalne - np. range, stringi, krotki,
# w przyszlosci wiecej

# iteracja w petli for: iterujemy po dowolnym obiekcie,
# ktory jest iterowalny

for i in range(10, 20, 2):
    print(i) # 10, 12, ..., 18


for c in "napis":
    print(c) # znak po znaku (jednoznakowe napisy: "n", "a", "p", "i", "s")


# po "in" moze pojawic sie dowolne wyrazenie, ktorego wartoscia (wynikiem) jest
# obiekt iterowalny:
rng = range(20)
for i in rng:
    print(i ** 2) # 0, 1, ..., 361

# a takze:
for c in "nap" + "is" + str(10):
    print(c) # "n", "a", "p", "i", "s", "1", "0"

# krotki: uogolnienie par, trojek, etc.
p = 1, 2
# rownowaznie: p = (1, 2)
# p: para liczb

# rozpakowanie krotki (*):
x, y = p # x==1, y==2

# krotka niejednorodna (obiekty w krotce maja rozne typy, np. tez sa krotkami):
t = (1, "2", 3.0, (0,0,0,0), 5)

# iteracja po krotce - jak po np. stringu: for x in t: ...

# ogolnie, rozpakowywanie obiektu iterowalnego:
a, b, c, d = range(1, 5)

# dlugosc obiektu iterowalnego:
print(len(t)) # 5
print(len(rng)) # 20
print(len("napis2")) # 6

# pusta krotka: ()
# krotka jednoelementowa: ("a",)

# BONUS (bedzie za tydzien) - indeksowanie:
# (odpowiada na pytanie zadane na wykladzie)
print(t[2]) # 3.0 - trzeci element (indeksowanie zaczyna sie od 0) krotki t

# t[3] to krotka (0,0,0,0), zatem np.:
print(t[3][2]) # 0, tozsame z (t[3])[2]

# a takze:
print("napis"[1]) # "a"
