Notebook
In [1]:
otroci = {
    "Adam": ["Matjaž", "Cilka", "Daniel", "Erik"],
    "Aleksander": [],
    "Alenka": [],
    "Barbara": [],
    "Cilka": [],
    "Daniel": ["Elizabeta", "Hans"],
    "Erik": [],
    "Elizabeta": ["Ludvik", "Jurij", "Barbara", "Herman", "Mihael"],
    "Franc": [],
    "Herman": ["Margareta"],
    "Hans": [],
    "Jožef": ["Alenka", "Aleksander", "Petra"],
    "Jurij": ["Franc", "Jožef"],
    "Ludvik": [],
    "Margareta": [],
    "Matjaž": ["Viljem"],
    "Mihael": [],
    "Petra": [],
    "Tadeja": [],
    "Viljem": ["Tadeja"],
}

def je_zenska(ime):
    return ime[-1] == "a"

def koliko_sester(ime):
    sester = 0
    for druzina in otroci.values():
        if ime in druzina:
            break
    else:
        druzina = [ime]
    for clovek in druzina:
        if je_zenska(clovek):
            sester += 1
    if je_zenska(ime):
        sester -= 1
    return sester


def najvec_sester():
    s = []
    for clovek in otroci:
        s.append((koliko_sester(clovek), clovek))
    return max(s)[1]

print(najvec_sester())
Aleksander

In [4]:
def najvec_sester_v_druzini(druzina):
    print([je_zenska(ime) for ime in druzina])
    
print(najvec_sester_v_druzini(["Maja", "Aleksander", "Petra"]))
[True, False, True]
None

In [7]:
def najvec_sester_v_druzini(druzina):
    return sum([je_zenska(ime) for ime in druzina])
    
print(najvec_sester_v_druzini(["Maja", "Aleksander", "Petra"]))
2

In [9]:
def najvec_sester_v_druzini(druzina):
    zensk = sum(je_zenska(ime) for ime in druzina)
    if zensk == len(druzina):
        return zensk - 1, druzina[0]
    else:
        moski = [ime for ime in druzina if not je_zenska(ime)]
        return zensk, moski[0]
    
print(najvec_sester_v_druzini(["Maja", "Aleksander", "Petra"]))
print(najvec_sester_v_druzini(["Maja", "Aleksander", "Petra", "Jože"]))
print(najvec_sester_v_druzini(["Maja", "Aleksandra", "Petra"]))
(2, 'Aleksander')
(2, 'Aleksander')
(2, 'Maja')

In [10]:
[najvec_sester_v_druzini(druzina) for druzina in otroci.values()]
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-10-1586b4bdb666> in <module>()
----> 1 [najvec_sester_v_druzini(druzina) for druzina in otroci.values()]

<ipython-input-10-1586b4bdb666> in <listcomp>(.0)
----> 1 [najvec_sester_v_druzini(druzina) for druzina in otroci.values()]

<ipython-input-9-d72043a89c40> in najvec_sester_v_druzini(druzina)
      2     zensk = sum(je_zenska(ime) for ime in druzina)
      3     if zensk == len(druzina):
----> 4         return zensk - 1, druzina[0]
      5     else:
      6         moski = [ime for ime in druzina if not je_zenska(ime)]

IndexError: list index out of range
In [11]:
def najvec_sester_v_druzini(druzina):
    zensk = sum(je_zenska(ime) for ime in druzina)
    if not zensk:
        return 0, ""
    if zensk == len(druzina):
        return zensk - 1, druzina[0]
    else:
        moski = [ime for ime in druzina if not je_zenska(ime)]
        return zensk, moski[0]
    
print(najvec_sester_v_druzini(["Maja", "Aleksander", "Petra"]))
print(najvec_sester_v_druzini([]))v
(2, 'Aleksander')
(0, '')

In [12]:
[najvec_sester_v_druzini(druzina) for druzina in otroci.values()]
Out[12]:
[(0, ''),
 (0, ''),
 (1, 'Matjaž'),
 (0, ''),
 (0, ''),
 (0, ''),
 (0, ''),
 (1, 'Hans'),
 (0, ''),
 (0, ''),
 (2, 'Urša'),
 (1, 'Ludvik'),
 (0, ''),
 (2, 'Aleksander'),
 (0, ''),
 (0, ''),
 (0, ''),
 (0, ''),
 (0, 'Tadeja'),
 (0, 'Margareta')]
In [13]:
max([najvec_sester_v_druzini(druzina) for druzina in otroci.values()])
Out[13]:
(2, 'Urša')
In [14]:
max(najvec_sester_v_druzini(druzina) for druzina in otroci.values())
Out[14]:
(2, 'Urša')
In [ ]:
 
In [15]:
max([najvec_sester_v_druzini(druzina) for druzina in otroci.values()])[1]
Out[15]:
'Urša'
In [16]:
def najvec_sester(ime):
    druzina = otroci[ime]
    naj_sester, naj_ime = najvec_sester_v_druzini(druzina)
    for otrok in druzina:
        sester, ime = najvec_sester(otrok)
        if sester > naj_sester:
            naj_sester = sester
            naj_ime = ime
    return naj_ime

najvec_sester("Adam")
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-16-76b10d53dad5> in <module>()
      9     return naj_ime
     10 
---> 11 najvec_sester("Adam")

<ipython-input-16-76b10d53dad5> in najvec_sester(ime)
      3     naj_sester, naj_ime = najvec_sester_v_druzini(druzina)
      4     for otrok in druzina:
----> 5         sester, ime = najvec_sester(otrok)
      6         if sester > naj_sester:
      7             naj_sester = sester

<ipython-input-16-76b10d53dad5> in najvec_sester(ime)
      3     naj_sester, naj_ime = najvec_sester_v_druzini(druzina)
      4     for otrok in druzina:
----> 5         sester, ime = najvec_sester(otrok)
      6         if sester > naj_sester:
      7             naj_sester = sester

<ipython-input-16-76b10d53dad5> in najvec_sester(ime)
      3     naj_sester, naj_ime = najvec_sester_v_druzini(druzina)
      4     for otrok in druzina:
----> 5         sester, ime = najvec_sester(otrok)
      6         if sester > naj_sester:
      7             naj_sester = sester

ValueError: need more than 0 values to unpack
In [17]:
def najvec_sester(ime):
    druzina = otroci[ime]
    naj_sester, naj_ime = najvec_sester_v_druzini(druzina)
    for otrok in druzina:
        sester, ime = najvec_sester(otrok)
        if sester > naj_sester:
            naj_sester = sester
            naj_ime = ime
    return naj_sester, naj_ime

najvec_sester("Adam")
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-17-5f80fb4e5f6f> in <module>()
      9     return naj_sester, naj_ime
     10 
---> 11 najvec_sester("Adam")

<ipython-input-17-5f80fb4e5f6f> in najvec_sester(ime)
      3     naj_sester, naj_ime = najvec_sester_v_druzini(druzina)
      4     for otrok in druzina:
----> 5         sester, ime = najvec_sester(otrok)
      6         if sester > naj_sester:
      7             naj_sester = sester

<ipython-input-17-5f80fb4e5f6f> in najvec_sester(ime)
      3     naj_sester, naj_ime = najvec_sester_v_druzini(druzina)
      4     for otrok in druzina:
----> 5         sester, ime = najvec_sester(otrok)
      6         if sester > naj_sester:
      7             naj_sester = sester

<ipython-input-17-5f80fb4e5f6f> in najvec_sester(ime)
      3     naj_sester, naj_ime = najvec_sester_v_druzini(druzina)
      4     for otrok in druzina:
----> 5         sester, ime = najvec_sester(otrok)
      6         if sester > naj_sester:
      7             naj_sester = sester

<ipython-input-17-5f80fb4e5f6f> in najvec_sester(ime)
      3     naj_sester, naj_ime = najvec_sester_v_druzini(druzina)
      4     for otrok in druzina:
----> 5         sester, ime = najvec_sester(otrok)
      6         if sester > naj_sester:
      7             naj_sester = sester

<ipython-input-17-5f80fb4e5f6f> in najvec_sester(ime)
      3     naj_sester, naj_ime = najvec_sester_v_druzini(druzina)
      4     for otrok in druzina:
----> 5         sester, ime = najvec_sester(otrok)
      6         if sester > naj_sester:
      7             naj_sester = sester

<ipython-input-17-5f80fb4e5f6f> in najvec_sester(ime)
      3     naj_sester, naj_ime = najvec_sester_v_druzini(druzina)
      4     for otrok in druzina:
----> 5         sester, ime = najvec_sester(otrok)
      6         if sester > naj_sester:
      7             naj_sester = sester

<ipython-input-17-5f80fb4e5f6f> in najvec_sester(ime)
      1 def najvec_sester(ime):
----> 2     druzina = otroci[ime]
      3     naj_sester, naj_ime = najvec_sester_v_druzini(druzina)
      4     for otrok in druzina:
      5         sester, ime = najvec_sester(otrok)

KeyError: 'Urša'
In [18]:
otroci["Aleksander"] = []
In [19]:
def najvec_sester(ime):
    druzina = otroci[ime]
    naj_sester, naj_ime = najvec_sester_v_druzini(druzina)
    for otrok in druzina:
        sester, ime = najvec_sester(otrok)
        if sester > naj_sester:
            naj_sester = sester
            naj_ime = ime
    return naj_sester, naj_ime

najvec_sester("Adam")
Out[19]:
(2, 'Aleksander')
In [20]:
def najvec_sester0(ime):
    druzina = otroci[ime]
    naj_sester, naj_ime = najvec_sester_v_druzini(druzina)
    for otrok in druzina:
        sester, ime = najvec_sester0(otrok)
        if sester > naj_sester:
            naj_sester = sester
            naj_ime = ime
    return naj_sester, naj_ime

def najvec_sester(ime):
    return najvec_sester0(ime)[1]

najvec_sester("Adam")
Out[20]:
'Aleksander'
In [21]:
def najvec_sester_v_druzini(druzina):
    zensk = sum(je_zenska(ime) for ime in druzina)
    return zensk - (zensk == len(druzina))
    
def najvec_sester(ime):
    druzina = otroci[ime]
    naj_sester = najvec_sester_v_druzini(druzina)
    for otrok in druzina:
        sester = najvec_sester(otrok)
        if sester > naj_sester:
            naj_sester = sester
    return naj_sester

najvec_sester("Adam")
Out[21]:
2
In [22]:
def najvec_sester_v_druzini(druzina):
    zensk = sum(je_zenska(ime) for ime in druzina)
    return zensk - (zensk == len(druzina))
    
def najvec_sester(ime):
    druzina = otroci[ime]
    naj_sester = najvec_sester_v_druzini(druzina)
    return max([najvec_sester(otrok) for otrok in druzina] + [naj_sester])

najvec_sester("Adam")
Out[22]:
2
trenutna trenutna.leva, trenutna.desna for soba in [trenutna.leva, trenutna.desna]: rezultat = rekurzivni klic (soba) zbiraš: - seštevaš, unije, preseke - primerjaš ... recimo maksimum - any, all (or, and)
In [23]:
def palindrom(s):
    return len(s) < 2    or    s[0] == s[-1] and palindrom(s[1:-1])
In [24]:
palindrom("abcba")
Out[24]:
True
In [25]:
palindrom("abcb")
Out[25]:
False
In [26]:
palindrom("aa")
Out[26]:
True
In [27]:
palindrom("aaa")
Out[27]:
True
In [28]:
palindrom("a")
Out[28]:
True
In [29]:
palindrom("")
Out[29]:
True
Iz dvojiškega v desetiško: k zadnji števki + 2 x iz dvojiškega v desetiško(vse razen števke)
In [30]:
def decimalno(s):
    return int(s[-1]) + 2 * decimalno(s[:-1])
In [31]:
decimalno("101010")
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-31-9088595fa905> in <module>()
----> 1 decimalno("101010")

<ipython-input-30-3a77a325a4e6> in decimalno(s)
      1 def decimalno(s):
----> 2     return int(s[-1]) + 2 * decimalno(s[:-1])

<ipython-input-30-3a77a325a4e6> in decimalno(s)
      1 def decimalno(s):
----> 2     return int(s[-1]) + 2 * decimalno(s[:-1])

<ipython-input-30-3a77a325a4e6> in decimalno(s)
      1 def decimalno(s):
----> 2     return int(s[-1]) + 2 * decimalno(s[:-1])

<ipython-input-30-3a77a325a4e6> in decimalno(s)
      1 def decimalno(s):
----> 2     return int(s[-1]) + 2 * decimalno(s[:-1])

<ipython-input-30-3a77a325a4e6> in decimalno(s)
      1 def decimalno(s):
----> 2     return int(s[-1]) + 2 * decimalno(s[:-1])

<ipython-input-30-3a77a325a4e6> in decimalno(s)
      1 def decimalno(s):
----> 2     return int(s[-1]) + 2 * decimalno(s[:-1])

<ipython-input-30-3a77a325a4e6> in decimalno(s)
      1 def decimalno(s):
----> 2     return int(s[-1]) + 2 * decimalno(s[:-1])

IndexError: string index out of range
In [35]:
def decimalno(s):
    if not s:
        return 0
    return int(s[-1]) + 2 * decimalno(s[:-1])
In [36]:
decimalno("101010")
Out[36]:
42
In [43]:
def decimalno(s):
    if not s:
        return 0
    r = decimalno(s[:-1])
    bom_vrnil = int(s[-1]) + 2 * r
    print("dobil sem", s)
    print("zadnja: ", s[-1])
    print("klical sem decimalno(", s[:-1], ")")
    print("dobil sem", r)
    print("vrnil bom", bom_vrnil)
    print("-" * 20)
    return bom_vrnil
In [44]:
decimalno("111010")
dobil sem 1
zadnja:  1
klical sem decimalno(  )
dobil sem 0
vrnil bom 1
--------------------
dobil sem 11
zadnja:  1
klical sem decimalno( 1 )
dobil sem 1
vrnil bom 3
--------------------
dobil sem 111
zadnja:  1
klical sem decimalno( 11 )
dobil sem 3
vrnil bom 7
--------------------
dobil sem 1110
zadnja:  0
klical sem decimalno( 111 )
dobil sem 7
vrnil bom 14
--------------------
dobil sem 11101
zadnja:  1
klical sem decimalno( 1110 )
dobil sem 14
vrnil bom 29
--------------------
dobil sem 111010
zadnja:  0
klical sem decimalno( 11101 )
dobil sem 29
vrnil bom 58
--------------------

Out[44]:
58
In [45]:
def binarno(n):
    if n == 0:
        return "0"
    zadnja = str(n % 2)
    pred_tem = binarno(n // 2)
    return (pred_tem + zadnja)
In [46]:
binarno(42)
Out[46]:
'0101010'
In [49]:
def binarno(n):
    if n == 0:
        return "0"
    zadnja = str(n % 2)
    pred_tem = binarno(n // 2)
    return (pred_tem + zadnja)[:-1]
In [50]:
binarno(42)
Out[50]:
'0'
In [51]:
def binarno(n):
    if n == 0:
        return "0"
    zadnja = str(n % 2)
    pred_tem = binarno(n // 2)
    return (pred_tem + zadnja).lstrip("0")
In [52]:
binarno(42)
Out[52]:
'101010'
In [53]:
binarno(1)
Out[53]:
'1'
In [54]:
binarno(0)
Out[54]:
'0'
In [55]:
def binarno(n):
    if n <= 1:
        return str(n)
    zadnja = str(n % 2)
    pred_tem = binarno(n // 2)
    return (pred_tem + zadnja)
In [56]:
binarno(42)
Out[56]:
'101010'
In [57]:
binarno(0)
Out[57]:
'0'
In [58]:
binarno(1)
Out[58]:
'1'
In [59]:
def binarno(n):
    niz = ""
    while n > 0:
        niz = str(n % 2) + niz
        n //= 2
    return niz
    
In [60]:
binarno(42)
Out[60]:
'101010'
In [61]:
binarno(0)
Out[61]:
''
In [62]:
def binarno(n):
    if n == 0:
        return "0"
    niz = ""
    while n > 0:
        niz = str(n % 2) + niz
        n //= 2
    return niz
    
In [63]:
binarno(42)
Out[63]:
'101010'
In [64]:
binarno(0)
Out[64]:
'0'
In [65]:
def palindrom(s):
    for i in range(len(s) // 2):
        if s[i] != s[- i - 1]:
            return False
    return True
In [66]:
def palindrom(s):
    return s == s[::-1]
In [67]:
class Zelva:
    def naprej(self, x):
        pass

Včasih definiraš samo razred in metode. Tu ne bo super.

Včasih dobiš razred in definiraš naslednike ... ali definiraš oboje, razred in naslednike.

In [70]:
class PosebnaZelva(Zelva):
    # Ta zelva zna vse, kar zna zelva
    # Recimo, da gre naprej za dvakrat več kot "običajna" želva
    def naprej(self, x):
        print("hop")
        super().naprej(2 * x) # super zato, da pokličem podedovano, ne svoje
        # self.naprej(2 * x)

S super pokličem to, kar sem povozil.

In [71]:
class PosebnaZelva(Zelva):
    # Ta zelva zna vse, kar zna zelva
    # Recimo, da gre naprej za dvakrat več kot "običajna" želva
    def bolj_naprej(self, x):
        print("hop")
        self.naprej(2 * x) # kličem podedovani naprej
In [72]:
class Blok:
    def __init__(self, nadstropij):
        self.stanovalci = [None] * nadstropij
        
    def vseli(self, nadstropje, ime):
        if self.stanovalci[nadstropje] != None:
            return False
        self.stanovalci[nadstropje] = ime
        return True
    
    def stanovalec(self, nadstropje):
        # if self.stanovalci[nadstropje] != None: ---> Ni potrebno!
        #    return self.stanovalci[nadstropje]
        # else:
        #    return None
        return self.stanovalci[nadstropje]
    
    def izseli(self, nadstropje):
        self.stanovalci[nadstropje] = None
        
    def koliko_nadstropij(self):
        return len(self.stanovalci)
    
    def kamorkoli(self, ime):
        for i in range(len(stanovalci) - 1, -1, -1):
            if self.stanovalci[i] == None:
                self.stanovalci[i] = ime
                return True
        return False
    
In [74]:
# S slovarji - čeprav mi ni prav všeč ;)

class Blok:
    def __init__(self, nadstropij):
        self.stanovalci = {}
        for i in range(nadstropij):
            self.stanovalci[i] = None
        
    def vseli(self, nadstropje, ime):
        if self.stanovalci[nadstropje] != None:
            return False
        self.stanovalci[nadstropje] = ime
        return True
    
    def stanovalec(self, nadstropje):
        # if self.stanovalci[nadstropje] != None: ---> Ni potrebno!
        #    return self.stanovalci[nadstropje]
        # else:
        #    return None
        return self.stanovalci[nadstropje]
    
    def izseli(self, nadstropje):
        self.stanovalci[nadstropje] = None
        
    def koliko_nadstropij(self):
        return len(self.stanovalci)
    
    def kamorkoli(self, ime):
        for i in range(len(stanovalci) - 1, -1, -1):
            if self.stanovalci[i] == None:
                self.stanovalci[i] = ime
                return True
        return False
    
In [77]:
dict.fromkeys(["a", "b", "c"], 42)
Out[77]:
{'b': 42, 'c': 42, 'a': 42}
In [78]:
dict.fromkeys(range(8), None)
Out[78]:
{0: None, 1: None, 2: None, 3: None, 4: None, 5: None, 6: None, 7: None}
In [ ]:
 
Zadnja sprememba: torek, 17. februar 2015, 12.13