Objavil sem tretjo domačo nalogo. Priporočam, da si pred reševanjem preberete rešitev druge naloge; to naj bi prispevalo k lepšim rešitvam tretje.
Objavljaje rešitev druge naloge, sem opazil, da sem pozabil na Učilnico dodati rešitev prve. Ako se to še kdaj ponovi, me spomnite.
Ko že ravno pišem, naj dodam še nekaj, dokler je še sveže.
Danes sem na predavanjih povedal nekaj zelo pametnih stvari. (Kot vedno, kot vedno.) Ena je bila, da v Pythonu
- po možnosti ne napišemo zanke, če se ji da izogniti.
- Če že napišemo zanko, ne pišemo zanke čez indekse (kot v
for i in range(len(nekaj))), temveč napodimo zanko čez tisto, čez kar v resnici gremo (for x in nekaj). Če potrebujemo tudi indekse, dodamoenumerate, pogosto pa pride prav tudizip. - Če ne gre drugače, uporabimo
forčez indekse ali pa celowhile. Vendar to naredimo s stisnjenimi zobmi in pri tem pazimo, da nas nihče ne vidi. (Pride mama v sobo in mulec trzne, zapre računalnik in zardi. Mama sprašuje, kaj je bilo, kaj je počel, on pa kar nekaj menca in gleda v tla in še farba in ... Ko je res očitno, da ga je pri nečem zalotila, ji vendarle prizna: napisal je zankoforčez indekse, ampak ni hotel, da ga vidi.)
Za prvo točko sem rekel, da jo boste manjkrat videli, ker se ne boste naučili, kako se izogibati zankam v Pythonu. Potem pa sem na koncu ure pokazal natančno to! Se spomnite: zanimalo nas je, kako za nek seznam preveriti, ali se kak element v njem ponovi. Šlo je sicer za odseke poti, zato smo uporabili zip, vendar je to še lepše pokazati na preprostejši nalogi. Se pravi: imamo seznam s in zanima nas, ali se kak element v njem ponovi.
Začetnik ignorira točko 1 in bluzi takole:
def se_ponovi(s):
for x in s:
if s.count(x) > 1:
return True
return False
Še hujši začetnik bo ignoriral tudi 2 in pisal:
def se_ponovi(s):
for i in range(len(s)):
if s.count(s[i]) > 1:
return True
return False
Zakrknjen C-jevec (ki se ga bo mama kar odrekla) pa
def se_ponovi(s):
for i in range(len(s)):
for j in range(i):
if s[j] == s[i]:
return True
return False
Ali pa bo uporabil celo while.
Kdor zna programirati v Pythonu, pa sledi točki 1 in se izogne zanki napisavši
def se_ponovi(s):
return len(s) == len(set(s))
(Opomba: to deluje samo, če so elementi s-ja nespremenljivi. Če jih ne moremo stlačiti v množico, pa obstajajo drugi triki, ki pa so odvisni od tega, za kakšne elemente gre, koliko jih je ipd..)