Forum za obvestila

Tretja domača naloga: Načrtovanje poti

Tretja domača naloga: Načrtovanje poti

by Janez Demšar -
Number of replies: 2

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

  1. po možnosti ne napišemo zanke, če se ji da izogniti.
  2. Č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, dodamo enumerate, pogosto pa pride prav tudi zip.
  3. Če ne gre drugače, uporabimo for čez indekse ali pa celo while. 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 zanko for č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..)

In reply to Janez Demšar

Zadeva: Tretja domača naloga: Načrtovanje poti

by Janez Demšar -

Če hočete narediti kopijo slovarja, bo potrebno napisati nov_zemljevid = zemljevid.copy(). Samo nov_zemljevid = zemljevid ne bo dovolj. Python ne deluje tako.

Spoilam, ker je to pravzaprav tema naslednjega predavanja, pa ni potrebe, da bi se ob to spotikali že pri tej nalogi.

In reply to Janez Demšar

Zadeva: Tretja domača naloga: Načrtovanje poti

by Janez Demšar -

split() ni isto kot split(" ").

>>> "".split()
[]
>>> "".split(" ")
['']

Kadar razstavljamo niz glede na presledke, praktično vedno potrebujemo prvo. Kadar ga glede na kak drug znak, pa želimo, da se obnaša drugače. Več o tem v dokumentaciji metode str.split.

Pri domači nalogi boste imeli v prvi nalogi sitnosti, če se je lotite z napačno različico klica.