Projekt Pronal Projekt Pronal

Kazalo:
Sofinasiranje projekta
Starejši - učbenik...
Tekmovanja...
Tekmovanja - dopolni...
Tekmovanja - Parsons...
Tekmovanja - popravi...
Starejši - zbirka nalog
Funkcije
If stavek
Izpisi
Množice
Nizi
Pisanje in popravljanje programa
Seznami in nizi
Slovarji
Spoznajmo Python
Uvod v funkcije
Zanka for
Zanka while
Nizi

Nizi


Brez? Brez!

1. podnaloga

Napišite funkcijo brez(niz), ki sestavi nov niz, pri katerem spustimo prvi in zadnji znak niza niz.

Uradna rešitev

def brez(niz):
    """sestavi nov niz, pri katerem spustimo prvi in zadnji znak niza"""
    nov_niz = ''
    ind = 1
    while ind < len(niz) - 1: # spustimo prvega in zadnjega
       nov_niz += niz[ind]
       ind += 1
    return nov_niz

# Še ena možnost

def brez(niz):
    """vrne niz brez prvega in zadnjega znaka"""
    return niz[1:-1]

2. podnaloga

Napišite funkcijo brez_stevk(niz), ki sestavi nov niz, pri katerem spustimo vse števke, ki nastopajo v nizu niz. Ali je v spremenljivki znak števka, lahko preverimo z

     if '0' <= znak <= '9': # v znak je števka

Uradna rešitev

def brez_stevk(niz):
    """sestavi nov niz, pri katerem spustimo števke"""
    nov_niz = ''
    ind = 0
    while ind < len(niz):
        nek_znak = niz[ind]
        if not ('0' <= nek_znak <= '9'): # v nek_znak ni števke
            nov_niz += nek_znak # dodamo k novemu nizu
        ind += 1
    return nov_niz

3. podnaloga

Napišite funkcijo brez_sredine(niz), ki nizu spusti srednji znak. Če je niz sode dolžine, naj ohrani vse znake.

     >>> brez_sredine('matematika')
     matematika
     >>> brez_sredine('fizik')
     fiik

Uradna rešitev

def brez_sredine(niz):
    """V nizu spusti srednji znak
       če pa srednjega znaka ni, niz ohrani """
    dol_niza = len(niz)
    if dol_niza % 2 == 0:  # niz je sode dolžine
        return niz
    # niz je lihe dolžine
    nov_niz = ''
    ind = 0
    # prepišemo prvo polovico
    while ind < dol_niza // 2:
        nek_znak = niz[ind]
        nov_niz += nek_znak # dodamo k novemu nizu
        ind += 1
    # in še drugo
    ind += 1
    while ind < dol_niza:
        nek_znak = niz[ind]
        nov_niz += nek_znak # dodamo k novemu nizu
        ind += 1
    return nov_niz

#ali pa tako

def brez_sredine(niz):
    """V nizu spusti srednji znak
       če pa srednjega znaka ni, niz ohrani """
    dolzina = len(niz)
    if dolzina % 2 == 0:
        return niz
    else:
        sredina = dolzina // 2
        nov_niz = niz[:sredina] + niz[sredina+1:]
        return nov_niz

Črkojedka

Nekoč je živela ptica Črkojedka, ki je imela še posebej rada samoglasnike. Še posebej od takrat, ko se je naučila, da v Pythonu lahko preverimo, ali je nek znak samoglasnik s pomočjo operatorja in:

      >>> 'a' in 'aeiouAEIOU'
      True
      >>> 't' in 'aeiouAEIOU'
      False

Kadar je pojedla samoglasnik, je na tistem mestu pustila *.

1. podnaloga

Sestavite funkcijo crkojedka(niz), ki bo za dani niz vrnila nov niz z * na mestu, kjer je bil samoglasnik.
Na primer:

   >>> crkojedka('beseda')
   b*s*d*

Uradna rešitev

def crkojedka(niz):
    """ funkcija v dani besedi samoglasnike zamenja z *"""
    samoglasniki ='aeiouAEIOU'
    nov_niz=''
    i = 0
    while i < len(niz):
        znak = niz[i]
        if znak in samoglasniki:
            # pogleda ali je posamezen znak v nizu samoglasnik
            # in če je, potem ga nadomesti z *
            nov_niz += '*'
        else: # sicer ga le prepiše
            nov_niz += znak
        i += 1
    return nov_niz

2. podnaloga

Določene besede so bile bolj kalorične (vsebovale več samoglasnikov), določene manj. Ker je Črkojedka na dieti, ji sestavite funkcijo, ki ji bo pomagala izbirati ustrezno hrano. Funkcija crkojedka_hujsa(niz) naj za dani niz vrne njegovo kalorično vrednost, torej število samoglasnikov
Na primer:

   >>> crkojedka_hujsa('črmlj')
   0
   >>> crkojedka_hujsa('Kako debeeeeeeeeeeela sem!')
   16

Uradna rešitev

def crkojedka_hujsa(niz):
    ''' funkcija prešteje samoglasnike *'''
    samoglasniki ='aeiouAEIOU'
    kaloricna_vrednost = 0
    i = 0
    while i < len(niz):
        znak = niz[i]
        if znak in samoglasniki:
            # pogleda ali je posamezen znak v nizu samoglasnik
                kaloricna_vrednost += 1
        i += 1
    return kaloricna_vrednost

3. podnaloga

Po neki precej "živahni" zabavi se je Črkojedka odmajala domov. Zjutraj se je zbudila s hudim ... (hm, verjetno ne mačkom, kaj menite?). In opazila je, da so se sedaj njene prehrambene navade spremenile. Sedaj ni več samoglasnikov nadomeščala z *, ampak z ničemer več. Poleg tega pa se je vrstni red preostalih znakov obrnil! Sestavite funkcijo crkojedka_ne_pij(niz), ki vrne niz, kakor ga predela Črkojedka z mačk... Na primer:

   >>> crkojedka_ne_pij('beseda')
   dsb

Uradna rešitev

def crkojedka_ne_pij(niz):
    """ funkcija v dani besedi izloči samoglasnike in obrne vrstni red znakov"""
    samoglasniki ='aeiouAEIOU'
    nov_niz=''
    i = 0
    while i < len(niz):
        znak = niz[i]
        if not znak in samoglasniki: # če znak ni samoglasnik
            nov_niz = znak + nov_niz # ga doda na konec
        i += 1
    return nov_niz

Naloga 1 (stran 97)

http://lusy.fri.uni-lj.si/ucbenik/book/1206/index8.html

1. podnaloga

Naslednja funkcija dobi kot parameter niz s in naj bi vrnila niz, ki ostane, če v s pobrišemo vse, kar je v oklepajih. Primer: pobrisi_oklepaje("ena(dve)tri(stiri) pet") mora vrniti "enatri pet". Pri tem smete predpostaviti, da oklepaji nikjer niso vgnezdeni eni v drugih (na ((primer) takole)). Vendar ima funkcija nekaj napak; poiščite jih in jih odpravite.

def pobrisi_oklepaje(s):
   v_oklepaju = False
   t = " " # izhodni niz
   for znak in s:
      if znak == "(":
         v_oklepaju = True
      if znak == ")":
         v_oklepaju = False
      if not v_oklepaju:
         s += znak
      return t

Uradna rešitev

def pobrisi_oklepaje(s):
    """Iz niza odstrani oklepaje (in tisto, kar je vmes)"""
    v_oklepaju = False
    niz_brez_ok = "" # izhodni niz
    for znak in s:
        if znak == "(":
            v_oklepaju = True
        elif znak == ")":
            v_oklepaju = False
        elif not v_oklepaju:
            niz_brez_ok += znak
        # če pa smo v oklepaju, znak spustimo!
    return niz_brez_ok

2. podnaloga

Kaj se zgodi, če tej funkciji damo niz z ugnezdenimi oklepaji, na primer pobrisi_oklepaje("ena(dve(tri)stiri)pet")? Predelajte funkcijo iz prejšnje podnaloge v funkcijo pobrisi_gnezdene_oklepaje(s), ki bo pravilno delovala tudi v takih primerih.

Uradna rešitev

def pobrisi_gnezdene_oklepaje(s):
    '''Iz niza odstrani oklepaje (in tisto, kar je vmes)
       in dela tudi z gnezdenimi oklepaji
    '''
    v_oklepaju = 0 # štejemo, kako "globoko" smo
    t = "" # izhodni niz
    for c in s:
        if c == "(":
            v_oklepaju += 1 # eno globlje
        elif c == ")":
            v_oklepaju -= 1 # ven iz enega gnezdenja
        elif v_oklepaju == 0: # če smo povsem ven
            t += c
        # še vedno smo znotraj oklepajev
    return t

Velike in male

1. podnaloga

Teta Helga je pisala pismo svojemu prijatelju Hansu. Teta Helga je tako zelo spretna z računalniki, da lahko tipka pismo, ne da bi spremljala na ekranu kaj se dogaja. Ko je vsa zadovoljna napisala pismo, jo je zadel šok ko ga je pogledala. Nevede je imela ves čas pritisnjeno tipko caps lock in so se vse velike in male črke ravno zamenjale.

Pomagajte teti Helgi in sestavite funkcijo obrni(niz), ki vrne nov niz enak vhodnemu, vendar male črke zamenja z velikimi in velike z malimi. Pomagajte si s kakšno metodo, ki jo lahko uporabimo na nizih. Na primer:

>>> obrni('z LJUBEZNIJO!')
'Z ljubeznijo!'
>>> obrni('SIN pETER IN SIN jANEZ')
'sin Peter in sin Janez'

Uradna rešitev

def obrni(niz):
    """Sprejme niz in vrne nov niz, v katerem so velike črke zamenjane z malimi in obratno"""
    nov_niz = ''
    for znak in niz:
        if znak.islower():
            znak = znak.upper()
        else:
            znak = znak.lower()
        nov_niz += znak
    return nov_niz
Mesto objave ob koncu projekta 15.9.2018