Eldöntés

Az előző alkalommal láttuk életünk első programozási tételét. Már rém okosak vagyunk, és tudjuk, hogy a programozási tétel valójában nem is tétel, hanem egy jól bejáratott, kipróbált módszer egy típusprobléma megoldására.

A mai alkalommal eldöntünk dolgokat.

Eldőlt a szék

Aztakurva…

Az eldöntés úgy értendő, hogy eldöntjük, hogy egy adott gyűjteményes adatszerkezetben – azaz például listában – van-e adott tulajdonságú elem. Ez az a programozási tétel, amit Pythonban nagyon másképp csinál az ember, mint sok más elterjedt nyelvben. Ennek sok oka van, de lássuk a videót!

Azt láttuk hát, hogy az eldöntés programozási tétel általánosan:

sorozat = valamilyen lista, range, vagy más bejárható objektum

ciklus sorozat minden elem-ére
    ha az elem keresett tulajdonságú:
        kiírjuk, vagy egy változóban jelezzük, hogy van
        break
    elágazás vége
ciklus vége

Valójában ez az egy algoritmus kétféleképp használatos. Az egyik esetben a bejárható objektumot a szokásos módon, érték szerint járjuk be:


vanilyen = False
for elem in bejárható_objektum:
    if elem olyan_amilyet_keresünk:
        vanilyen = True
        break

A másik esetben indexek szerint járjuk végig a sorozatot (emlékszel még? indexnek hívtuk azt a számot, ami megmondja, hogy a lista eleme hányadik a listában.) Ez olyankor kell, amikor az előző vagy következő elemekhez akarjuk hasonlítgatni az épp vizsgált elemet. Először a len() függvénnyel meghatározzuk a bejárható objektum elemszámát, majd ezt betoljuk a range() függvénybe. Ugye egy tízelemű lista elemszáma tíz, de a range(10) csak 0-tól 9-ig adja vissza a számokat. Ami viszont nem baj, mert a tízelemű lista pont indexei pont nullától kilencig terjednek. Annak idején ígértem, hogy egy napon megbeszéljük, hogy miért jó, hogy a range() függvény a felső határig nem jut el soha. Hát ezért, hogy tudjunk ilyet írni:


for index in range(len(bejárható_objektum)):
    if bejárható_objektum[index] olyan_amilyet_keresünk:
        print(bejárható_objektum[index])
        break

A videóban említettem, hogy a break miatt többen, például tanárkollégáim közül is esetleg mérgesek lesznek. Ha nézik ezt a videót. Nem gond, ha meg érteni akarod, hogy mi ennek az oka, hát majd a feladatok után visszatérek rá.

A Python egyszerűsítése:

  • ha az eldöntés csak arról szól, hogy megvan-e egy elem egy gyűjteményes adatszerkezetben, akkor használható az if keresett_elem in adatszerkezet utasításforma is. Az in egy operátor, azt vizsgálja, hogy benne van-e egy elem például egy listában Lehet olyat is írni, hogy if keresett_elem not in adatszerkezet.

Feladatok

F0022a: Adott a hét napjainak listája. Döntsd el, hogy a felhasználó rendes napnevet adott-e meg! (Megoldás itt.)

F0022b: Döntsd el, hogy a lottó kihúzott számai közül mind 40 és 60 közé esik-e! (Segítség: Van-e olyan szám, amelyik nem ilyen?) (Megoldás itt.)

F0022c: Döntsd el egy számról, hogy prímszám-e! (Segítség: Mit is kell itt eldönteni? Azt, hogy van-e….) (Megoldás itt.)

F0022d: Az elmúlt hónapokban minden nap feljegyeztük két kedvenc részvényünk árfolyamát: [34, 35, 37, 39, 40, 42, 44, 45] és [31, 32, 34, 35, 35, 35, 40, 41]. Döntsd el, hogy folyamatosan emelkedett-e az árfolyam! (Segítség: Itt kell az indexes-bejárós változata a tételnek. Hasonlítsuk össze az előző elemmel a lista aktuális elemét, és ha nem nagyobb…) (Megoldás itt.)

F0022e: Hozz létre 10-30 közötti véletlenszámokból egy 30 elemű listát! Ez a vendéglőd elmúlt hónapjának forgalma, ennyi vendéged volt az egyes napokon. Ha van benne legalább egyetlen alkalommal 30 vendég, akkor rájössz, hogy szükséged van a vendéglő bővítésére. Ha van három egymás utáni nap, amikor legfeljebb 12-en voltak, akkor reklámozni kell. Írd ki, hogy melyik teendőt kell ellátnod! (Segítség: Igen, ez két külön feladat. Az első pofonegyszerű, a második meg majdnem olyan, mint az előző, a 22d.) (Megoldás itt.)

F0022f: Ha még nem menne fejből: vágd be az eldöntés tételét!

A gonosz break és a strukturált programozás

(majd)

Legutóbb a sorozatszámítás tételét néztük meg. Legközelebb a kiválasztás tétele következik.

Az eleső krapek: http://cliparts.co/clipart/2861049

Reklámok

Eldöntés” bejegyzéshez ozzászólás

  1. Ez így jó? (Nagy előnye, hogy piszok gyors).

    szam =int (input(‘Adj egy szamot, megmondom prim-e: ‘))
    if szam == 0 or szam == 1 or szam%2 == 0 or szam%3 == 0 or szam%5 == 0 or szam%7 == 0:
    print(‘Nem prim’)
    else:
    print(‘Prim’)

    Kedvelés

  2. Én az F0022b feladatot így oldottam meg, az if feltételt máshogy írtam:

    if szam not in range(40, 61):

    Teszteltem, működött, én nem találtam hibát. Lehet ezt így is? Ez így Pythonosabb? Vagy esetleg tudsz olyan kivételt mondani amikor ez nem működik?

    köszi

    Kedvelés

    • Teljesen jó, mondhatni remek:) Ügyesen kihasználtad, hogy egy előállítható sorozaton belül vizsgálódunk. És igen, ez így Pythonosabb.

      Kedvelés

  3. Szia raerek!

    Adódott egy kis problémám:

    days = [‘Monday’, ‘Tuesday’, ‘Wednesday’, ‘Thursday’, ‘Friday’, ‘Saturday’, ‘Sunday’]

    correct = input(‘What day is today? ‘)

    for day in days:
    if day is correct:
    print(‘There is a’, correct, ‘in the list.’)
    break
    else:
    print(‘Sorry, I can\’t find this day in the list: ‘, correct, ‘.’, sep=”)

    Lehet, hogy a gond borzasztó egyszerű, de sajnos eddig még nem sikerült rájönnöm.
    Van másik megoldásom is, ami sokkal Pythonosabb, azért született mert ez nem működött, nem ez a baj.
    De piszkál, hogy vajon miért nem ismeri fel az inputot.
    Értelemszerűen kis kezdőbetűvel nem: ‘monday’, de helyesen naggyal sem: ‘Monday’.

    Kedvelés

    • if day == correct

      Az is operátor másra való, azt nézi meg, hogy a két string ugyanaz az objektum-e.

      Nézd:

      lista = [‘a’, ‘b’, ‘c’, ‘d’]

      egyik = lista[1] #itt most ugyanaz az objektum lesz

      for elem in lista:
      if elem is egyik:
      print(elem)

      Kiegészítés: nézd meg az “Objektumhivatkozások, hatókör’ részt.

      Kedvelés

  4. Nézd, közben még gondolkoztam, keresgéltem aztán találtam ezt:

    Python id( ), =, is, == operátor:

    Azonosság, egyenlőség(0:58-tól):

    Ha valakinek esetleg, nem sikerülne az istenért sem megérteni az azonosság és az egyenlőség közti különbséget, ezek a videók segítenek!! 🙂 😀

    Kedvelés

  5. Közben itt egy megoldás a F0022C – re, de nem for ciklussal, hanem while-al…
    Valahogy nehezen áll át az agyam, vagy nem tudom.
    De annyira elkeseredtem, hogy hogy a francba fogom ezt megoldani, hogy megírtam így, csak ne kelljen megnézni a megoldásvideót mielőtt nem állok elő valamivel. 😀
    tesztelgettem, úgy tűnik nem hibás.

    https://pastebin.com/85r9M1WK

    Kedvelés

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés /  Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés /  Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés /  Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés /  Módosítás )

w

Kapcsolódás: %s