Szakkörök‎ > ‎Algoritmus szakkör‎ > ‎2014-2015‎ > ‎

5. alkalom

Fehér Gábor: Python minitanfolyam

Miért pont Python?

  • tudományos életben használják
  • egyszerűbb feladatokra hatékony modulokat írtak hozzá
  • interpretált, ezért könnyű elkezdeni a tanulást
  • divatos, ezért sok oktató anyag van hozzá
  • több szabad szoftver szkriptnyelve
  • adatfeldolgozásban elterjedt

Python online

Első lépések

A következő feladatsor azokat a Python elemeket mutatja be, amelyekkel a nagy feladat megoldható.


print u"1.1 Írd ki, hogy hello, world!"

print
print u"1.2. Írd ki, hogy helló, világ!"

print
print u'1.3. Adottak a "hello" és "world!" stringek,'
print u'írd ki, hogy hello, world!'
s1 = "hello"
s2 = "world!"


print
print u'1.4. Írd ki az adott s string első és második'
print u'karakterét, 8-tól 13-ig terjedő részstringjét,'
print u'a 8.-tól a végéig terjedő részstringjét.'


print
print u'1.5. Írd ki az adott s string hosszát'



print
print '2.1. Itt egy lista.'
lista = [1, 4, 9]
print lista
print u'2.2. Írd ki a második elemét.'

print
print u'2.3. Készíts listát az 1900 utáni de 2014 előtti'
print u'5-el osztható évszámokból.'


print
print u'2.4. Készíts két azonos listából egy számpárokból'
print u'álló listát:'
a = [1, 2, 3, 4, 5]
b = [1, 4, 9, 16, 25]


print
print u'3.1. Itt egy hosszú szöveg (recept):'
hosszu_szoveg = u'''
Hozzávalók:
50 dkg liszt
5 dl szénsavas ásványvíz
7 dl tej
4 evőkanál kristálycukor
4 tojás
6 evőkanál olaj
1 csipet só
Elkészítés:
A lisztet, a cukrot, a tojásokat, a sót és a szódavizet keverőtálba tesszük, és simára keverjük, majd hozzáadjuk a tejet és az olajat. Kisütjük a palacsintákat forró serpenyőben, pici olajon.
'''
print hosszu_szoveg
print u'3.2. Alakítsd át a soraiból álló listává.'

print
print u'3.3. Ne legyenek üres elemek a listában:'

print
print u'3.4. Írd ki a recept első sorát, egy listát ami '
print u'a második és harmadik soraiból áll, és a negyedik '
print u'sorát.'

print
print u'3.5. Írd ki a receptet úgy, hogy minden sora *-al '
print u'kezdődjön:'

print
print u'3.6. Írd ki az összes sort, amiben szerepel szám:'


print
print u'3.7. Megy-e ügyesebben?'
import re


print
print u'3.8. Írd ki az összes sorban található számot:'



print
print u'3.9. Írd ki a fenti számok összegét:'

print

Nagy feladat

Elemezzük, hogy évtizedenként hogyan alakult a keresztnevek gyakorisága a berzsenyis diákok körében.

Vázlat:

  1. A honlapról leszedünk mindent (CTRL+C-CTRL+V)
  2. A kapott adatokat egyetlen nagy string-ben tároljuk.
  3. Sorokra daraboljuk.
  4. Kiválogatjuk az évszámot tartalmazó és a névsorokat tartalmazó sorokat.
  5. Végigolvassuk a listát.
  6. Az aktuális évszámot mindig jegyezzük.
  7. A neveket szétdaraboljuk szóközök mentén, az első tagot eldobjuk, a többin számolunk.
  8. A kapott eloszlás listát kirajzoljuk. (codesculptor: simpleplot, "rendes python": matplotlib)

Megoldások

Schwarcz Tamás - Formanek András:

import simpleplot

data = u'''
1901-1909
4., Osztályfőnök:
Bakonyi László, Báron Gyula, 
...
néhány ezer sor kihagyva  
...
Zoltán Ágota'''

data = data.split('\n')
ev = 0
eloszlas = [0] * 12


for sor in data:
    if len(sor) >= 100:
        nevek = sor.split(',')
        for nev in nevek:
            x = nev.strip().split(' ')
            for y in x[1:]:
                if y == u"Béla":
                    eloszlas[(ev-1900)/10] += 1
    if len(sor) == 9:
        ev = int(sor[:4])
        #print ev
        #print '\n'
    if len(sor) == 4:
        ev = int(sor)
        #print ev

lista = range(1900,2020,10)

simpleplot.plot_lines('Nevek', 400, 300, u'évtized', u'előfordulás tíz évente', [zip(lista, eloszlas)], True, [u"Béla"])

Fehér Gábor (a fentieken felül itt még használunk egy asszociatív tömböt és egy lista-kifejezést "list comprehension" is):

data = '''BDG  
Felvételi  
Érettségi
...
néhány ezer sor kihagyva
...
Főoldal | Impresszum | Honlaptérkép | Kapcsolat'''

import re
import simpleplot

def AddName(year, name, name_stats):
    if name not in name_stats:
        name_stats[name] = [0] * 11
    bucket = (year - 1901) / 10
    name_stats[name][bucket] += 1

def CollectStates(data, name_stats):
    year = 0
    for line in data.split('\n'):
        year_match = re.search(r'[0-9][0-9][0-9][0-9]', line)
        if year_match:
            year = int(year_match.group(0))
            continue
        names = line.split(',')
        if len(names) <= 5:
            continue
        for name in names:
            name = name.strip()
            for last_name in name.split(' ')[1:]:
                AddName(year, last_name, name_stats)

name_stats = {}
CollectStates(data, name_stats)
names = [u'Gábor', u'László', u'Péter', u'Judit', u'Bence', u'Erzsébet']
years = range(1900, 2020, 10)
data_sets = [zip(years, name_stats[name]) for name in names]
simpleplot.plot_lines('Nevek', 640, 480, 'nevek', u'előfordulás tíz évente', data_sets, True, names)