Véletlenül utoljára gondolok egy számra

Mostanra jó régen fejlesztjük a számkitalálós programunkat:

  1. először megtanultunk elágazásokat készíteni
  2. másodszor megismertük a while-ciklust
  3. harmadszor összetett feltételt adtunk meg a ciklus belépési feltételéül
Micimackó gondolj-gondolj

Kezdő programozó véletlenszámot generál (kattints a képre)

Mostanra egész jó ez a program, csak még egyet nem tud: gondolni egy számra. Nos, ma megtanítjuk erre.

A szám, amire a program “gondolni” fog, egy véletlen szám lesz. A véletlenszámokat a programozási nyelvek jó szokás szerint a saját véletlenszám-generátorukkal (véletlenszám-előállítójukkal) állítják elő. Minthogy egy számítógép – természetesen – nem tud igazán véletlen számot előállítani, ezért úgy is hívjuk az ilyen számokat, hogy pszeudo-véletlen (ál-véletlen) számok. Attól pszeudo-véletlen, hogy idővel ismétlődik a véletlenszámok sora. Az ismétlődés a Python 3 esetében 2**19937-1 elemenként következik (a két csillag a hatványozás, tudod). Ez egy viszonylag nagyobb szám, amit részint írass ki magadnak, de ha lusta volnál, ideírom:

43154247973881626480552355163379198390539350432267115051652505414033306801376580911304513629318584665545269938257648835317902217334584413909528269154609168019007875343741396296801920114486480902661414318443276980300066728104984095451588176077132969843762134621790396391341285205627619600513106646376648615994236675486537480241964350295935168662363909047948347692313978301377820785712419054474332844529183172973242310888265081321626469451077707812282829444775022680488057820028764659399164766265200900561495800344054353690389862894061792872011120833614808447482913547328367277879565648307846909116945866230169702401260240187028746650033445774570315431292996025187780790119375902863171084149642473378986267503308961374905766340905289572290016038000571630875191373979555047468154333253474991046248132504516341796551470575481459200859472614836213875557116864445789750886277996487304308450484223420629266518556024339339190844368921018424844677042727664601852914925277280922697538426770257333928954401205465895610347658855386633902546289962132643282425748035786233580608154696546932563833327670769899439774888526687278527451002963059146963875715425735534475979734463100678367393327402149930968778296741391514599602374213629898720611431410402147238998090962818915890645693934483330994169632295877995848993366747014871763494805549996163051541225403465297007721146231355704081493098663065733677191172853987095748167816256084212823380168625334586431254034670806135273543270714478876861861983320777280644806691125713197262581763151313596429547763576367837019349835178462144294960757190918054625114143666384189433852576452289347652454631535740468786228945885654608562058042468987372436921445092315377698407168198376538237748614196207041548106379365123192817999006621766467167113471632715481795877005382694393400403061700457691135349187874888923429349340145170571716181125795888889277495426977149914549623916394014822985025331651511431278802009056808456506818877266609831636883884905621822262933986548645669080672191704740408891349835685662428063231198520436826329415290752972798343429446509992206368781367154091702655772727391329424277529349082600585884766523150957417077831910016168475685658673192860882070179760307269849987354836042371734660257694347235506301744118874141292438958141549100609752216882230887611431996472330842380137110927449483557815037586849644585749917772869926744218369621137675101083278543794081749094091043084096774144708436324279476892056200427227961638669149805489831121244676399931955371484012886360748706479568669048574782855217054740113945929622177502575565811067452201448981991968635965361551681273982740760138899638820318776303668762730157584640042798880691862640268612686180883874939573818125022279689930267446255773959542469831637863000171279227151406034129902181570659650532600775823677398182129087394449859182749999007223592423334567850671186568839186747704960016277540625331440619019129983789914712515365200336057993508601678807687568562377857095255541304902927192220184172502357124449911870210642694565061384919373474324503966267799038402386781686809962015879090586549423504699190743519551043722544515740967829084336025938225780730880273855261551972044075620326780624448803490998232161231687794715613405793249545509528052518010123087258778974115817048245588971438596754408081313438375502988726739523375296641615501406091607983229239827240614783252892479716519936989519187808681221191641747710902480633491091704827441228281186632445907145787138351234842261380074621914004818152386666043133344875067903582838283562688083236575482068479639546383819532174522502682372441363275765875609119783653298312066708217149316773564340379289724393986744139891855416612295739356668612658271234696438377122838998040199739078061443675415671078463404673702403777653478173367084844734702056866636158138003692253382209909466469591930161626097920508742175670306505139542860750806159835357541032147095084278461056701367739794932024202998707731017692582046210702212514120429322530431789616267047776115123597935404147084870985465426502772057300900333847905334250604119503030001704002887892941404603345869926367501355094942750552591581639980523190679610784993580896683299297681262442314008657033421868094551740506448829039207316711307695131892296593509018623094810557519560305240787163809219164433754514863301000915916985856242176563624771328981678548246297376249530251360363412768366456175077031977457534912806433176539995994343308118470147158712816149394421276614228262909950055746981053206610001560295784656616193252269412026831159508949671513845195883217147982748879261851417819979034417285598607727220866677680426090308754823803345446566305619241308374452754668143015487710877728011086004325892262259413968285283497045571062757701421761565262725153407407625405149931989494459106414660534305378576709862520049864880961144869258603473714363659194013962706366851389299692869491805172556818508298824954954815796063169517658741420159798754273428026723452481263569157307213153739781041627653715078598504154797287663122946711348158529418816432825044466692781137474494898385064375787507376496345148625306383391555145690087891955315994462944493235248817599907119135755933382121706191477185054936632211157222920331148502487563303118018805685073569841580518118710778653953571296014372940865270407021924383167290323231567912289419486240594039074452321678019381871219092155460768444573578559513613304242206151356457513937270939009707237827101245853837678338161023397586854894230696091540249987907453461311923963852950754758058205625956600817743007191746812655955021747670922460866747744520875607859062334750627098328593480067789456169602494392813763495657599847485773553990957557313200809040830036446492219409934096948730547494301216165686750735749555882340303989874672975455060957736921559195480815514035915707129930057027117286252843197413312307617886797506784260195436760305990340708481464607278955495487742140753570621217198252192978869786916734625618430175454903864111585429504569920905636741539030968041471

A Python tehát elvileg ennyi különböző véletlen számot tud előállítani. Nem vicc. Meg az sem, hogy a Python 3 meglepően nagy számokkal képes számolni:) Először gondoltam, hogy letesztelem, hogy tényleg ennyinként ismétlődik-e a véletlenszámok sora de lemondtam róla. Nevezhetsz puhánynak.

Modulok

A Python véletlenszám-generátora, illetve a hozzá kapcsolódó utasítások egy külön modulban kapott helyet. A modult (minden modult, nem csak ezt) úgy képzeld el, hogy a program elején betöltjük, és utána a Pythonunk egy rakat újabb utasítást tud. Ezek az utasítások a modulban vannak meghatározva. A modul nem egyéb, mint egy Python-program, amit nem arra terveztek, hogy önmagában futtassuk, hanem arra, hogy más programok kölcsönvehessék az utasításaikat.

A használni kívánt modult a program elején szokás betölteni az import utasítással. Az alábbi programban a véletlenszám-előállítással kapcsolatos modult töltjük be és vesszük használatba:


import random

véletlenszám = random.randint(1, 6)
print(véletlenszám)

Az import random parancs kiadása után már használhatjuk a random modul utasításait (igen, több is van benne). Mindegyik utasítás neve a modul nevével, most ugye random-mal kezdődik, és maga az utasítás egy ponttal kapcsolódik a modul nevéhez. A modul egyik utasítása a randint, ami véletlenszerű egész számot ad vissza, esetünkben 1 és 6 közöttit. (A véletlenszám-generátorok alapesetben 0 és 1 közötti törtet adnak vissza, úgy, hogy a 0 benne lehet, az 1 nem. A randint elvégzi nekünk azt a melót, hogy ebből a számból a megadott határok közötti egészet csinál.)

Egy jóféle hiba

Egy alkalommal az egyik diákom érdekes hibaüzenetet mutatott (főként az utolsó sort figyeld!):

random-hibaüzenet

Mondom “Mi van már?!, rosszul van telepítve a Python? Kimaradt a random modulból a randint utasítás?” És bizony idő volt, mire rájöttem, hogy a hibát az okozza, hogy a diákom a mintaprogramot random.py-nak nevezte el. Ugye azt mondtam, hogy a Python moduljai (többnyire) tulajdonképp maguk is Python-programok. Az import utasítás (kis ferdítéssel) egy olyan .py-kiterjesztésű fájlt keres, amit az import utasításban megadtunk. És hol keresi ezt a fájlt? Több helyen, de először abban a mappában, ahol a főprogram van.

Azaz most annyi történt, hogy a random.py program import utasítása örömmel betöltötte magát a programot. És abban nem volt randint utasítás, és ezt el is panaszolta nekünk. Tanulság: ne nevezzük el úgy a programot, ahogy modul is van elnevezve. És hogy hol az “igazi” random.py?

Windows-on úgy deríthető ki, hogy felmész annak a a meghajtónak a gyökérkönyvtárába (azaz legfelső könyvtárába), amelyikre a Python-t telepítetted (ez alighanem a C: meghajtó, és úgy tudsz odamenni, ha kiadod a C: parancsot, majd felmész a gyökérkönyvtárba egy cd \ utasítással) utána a dir /S random.py utasítással megtalálod (én a példán csak oktatási céllal adtam ki a c: parancsot, ugyanis már eleve a C: meghajtón voltam, és minthogy nincs is másik meghajtó a gépben, nem mentem át másikra a példa kedvéért):

A random.py Windows-on
Linuxon egyszerűbb a helyzet, lévén nincsenek meghajtók (azért talál kettőt is, mert a Python-ból van 2-es és 3-as is telepítve a rendszeremen):

random.py Linuxon

És akkor vissza a programunkhoz

Egyetlen sor módosítása a dolgunk:

Na, jól egy sor lett…


ALSÓ_HATÁR = 1
FELSŐ_HATÁR = 5

import random

gondolt_szám = random.randint(ALSÓ_HATÁR, FELSŐ_HATÁR)

kitalálta = False
elhasznált_lehetőségek = 0

while not kitalálta and elhasznált_lehetőségek < 3:
    tipp = input('Melyik számra gondoltam ' + str(ALSÓ_HATÁR) + ' és ' + str(FELSŐ_HATÁR) + ' között? ')
    tipp = int(tipp)
    elhasznált_lehetőségek += 1
    if tipp == gondolt_szám:
        kitalálta = True
        print('ügyes!')

print('Pápá!')

A random.randint() függvény a 6. sorban szerepel, és ezzel már nem is tanulunk újat. De mással igen:

Konstansok használata

Konstansoknak az olyan “változókat” hívjuk, amiknek az értéke nem változik. Na de ki a péknek kell ilyen változó? Hát nekünk. Alapvetően három dologra jók (meg még egy csomó másikra):

  1. Ha sok helyen szerepel egy bizonyos érték a programunkban, amit nem nagyon változtatunk, de mivan, ha mégis… Ilyenkor megesik, hogy a nyolcvanharmadik helyen elfelejtjük átírni. Sokkal egyszerűbb, ha a program elején megadunk egy konstanst, és mindenhol azt használjuk, és ha mégis változtatni kell, a konstanst írjuk át. Mi is ilyen céllal használtunk konstanst a videóban.
  2. Vannak olyan esetek, amikor egy szám nem mond semmit, de egy konstans könnyebben olvashatóvá teszi a programot. Például el tudsz nevezni vele színeket. Mondjuk a kedvenc lilád színkódja az A512EF tizenhatos számrendszerű szám, és mennyivel klasszabb és olvashatóbb, ha azt írhatod a programod ablaknak kirajzolásakor, hogy Window.background(LILA) a Window.background(A512EF) helyett.
  3. Ha könnyen akarod lefordíthatóvá – mármint ezúttal más emberi nyelvre lefordíthatóvá – tenni a programodat: Az elején megadod, hogy ÜDVÖZLÉS=’Szia!’ és később írhatod, hogy print(ÜDVÖZLÉS). A fordításkor pedig csak a program elején lévő konstansokat kell átültetni a másik nyelvre, mondjuk olaszra.

A Pythonban nincsenek konstansok. Vannak nyelek, amikben vannak, de a Pythonban nincs ilyesmi. A konstans szerepben használt változók nevét CSUPA_NAGYBETŰVEL szokás – érted, nem kötelező, csak szokás – írni, és akkor a Pythonban programozó tudja, hogy azzal nem kell babrálni. De lehet, mert attól ez még nem konstans, hanem változó. Csak nem szokás. De lehet. Csak nem szokás. De lehet. Ehh, végtelen ciklus.

Az input() egyetlen paramétere és az str()

A videóban kicsit megijedtem, hogy még erről sem volt szó, de tévedtem, mert az F0005c feladat megoldásvideójában már beszéltem erről. A print()-ben a vesszővel elválasztva  szokás egymás mellé pakolni a kiírandó cuccot. De ilyet az input() nem tud – egyetlen sztringet vár. Az egyetlen szrtinget itt helyben állítjuk neki elő, mégpedig úgy, hogy a pluszjelekkel “összeadjuk” neki a karakterlánc-darabokat. Figyeld meg, hogy a pluszjel mást csinál, ha más az operandusainak típusa:

  • szám (eddig csak az int számokkal foglalkoztunk, de más számoknál is ez van, majd látjuk) típusú adatokat összead
  • karakterláncokat (str) összefűz. Az összefűzés neve programozóul konkatenáció. A belőle képzett ige: konkatenál. Nem vicc, akármilyen hülyén is hangzik.

A számokból nem csinál csak úgy puszira karakterláncot a Python, szólni kell neki. Ezt az str() függvénnyel tehetjük meg.

Uff, ez nem gyengén anyagerős lecke lett, pedig az elején még gondolkodtam, hogy ugyan mivel fogom kitölteni.

Feladatok

F0012a: Írd át úgy a számkitalálós programot, hogy szidjon is össze, ha nem sikerült kitalálni! (Megoldás itt.)

F0012b: Írd át úgy az előző programot, hogy a kitalálás végeztével (akár sikerült kitalálni, akár nem), mindig kérdezze meg, hogy játszanánk-e még egyet! Súgok: az egész programot be kell tenni egy ciklusba, aminek a belépési feltétele egy logikai változó, de ezt a végén a felhasználónak van lehetősége hamissá tenni. (Megoldás itt.)

F0012c: Írd át úgy az előző programot, hogy induláskor kérdezze meg, hogy melyik két szám között “gondoljon” a számítógép! (Megoldás itt.)

F0012d: Írd át úgy az előző programot, hogy vezessen statisztikát: írja ki, hogy hány sikeres és hány sikeretlen kitalálás volt a futtatás során! (Megoldás itt.)

 

A múltkor egymásba ágyazott while-ciklusokkal ügyködtünk. Legközelebb megtudjuk, mi az a lista.

Reklámok

Véletlenül utoljára gondolok egy számra” bejegyzéshez ozzászólás

  1. Sziasztok! 🙂

    Az ‘and’ utasitás nem kellene, hogy összekosse a feltételeket?
    ” while kerdes is not ‘n’ or kerdes is not ‘i’: ” (tudom, hogy ‘and’ kell…)
    mert így nem működik…
    de elméletileg – vagy legalábbis nekem úgy egyértelmű – hogy az ‘or’ utasitásnál kell VALAMELYIKNEK teljesülnie, az ‘and’ – nél pedig MIND A KETTŐNEK EGYSZERRE…
    Valamiért nem értem, hogy miért nem úgy van ahogy gondoltam…. 😀
    Tudnátok segíteni felfogni ezt?

    Kedvelés

      • Te ‘and’ el fogalmaztad meg a ciklusba való belépés feltételét.
        A feltétel abba a while ciklusba léptet be(vagy nem), ahol megkérdezzük a felhasználótól(F0012b), hogy játszana-e mégegyet.
        Ezt te igy irtad a videoban nem pontosan, de lényegében így(és így is jó):
        ” while kerdes is not ‘n’ and kerdes is not ‘i’: ”
        Én pedig úgy értelmezem, hogy ez azt jelenti, igaznak IS kell lennie meg hamisnak IS.
        (Ha ‘or’ – al írom akkor addig kérdezgeti amig nem a Ctrl + C -t adom válasznak.)
        Tehát felfogásom szerint, ha az idézett ciklus a feltétel alapján nem kapja meg az ‘i’ ÉS az ‘n’ – betűt egyszerre, akkor nem szabadna a ciklusba lépnie.
        Csak akkor finom, ha mindkettő van:
        Amíg a pizzán van sajt AND sonka:
        print(‘finom’)
        Itt ha csak az egyik is van már finom.
        Amig a pizzán van sajt OR sonka:
        print(‘finom’)

        Szólj ha nem érthetően írtam.! 🙂

        Kedvelés

      • NR: ide válaszolok, mert a wordpress nem enged már a tiedre válaszolni:
        Olvasd ezt szó szerint:
        ” while kerdes is not ‘n’ and kerdes is not ‘i’: ”
        Te ezt így fordítod: Amíg a kérdés nem “i” és “n”
        Pedig így jó: Amíg a kérdés nem “i” és nem is “n” – azaz amíg nem válaszol olyat, amivel tudunk mit kezdeni.

        Ha a “kérdés” helyett “választ” gondolsz – mint az eredetiben is
        Újra feltesszük a kérdést, ha igaz, hogy ((a válasz nem i) és (a válasz nem n)), azaz sem i, sem n. Egyik sem.

        Így érted? Ha nem, kérdezz bátran újra:)

        Kedvelés

  2. Üdv!

    Itt az én verzióm:
    https://pastebin.com/3QRnAVAd
    Végig úgy csináltam meg a feladatokat, hogy nem néztem meg a megoldásokat az egyes részek után, csak a legvégén az összeset együtt. Ezért is maradt benne nagybetűvel a két határérték. Természetesen azt azért javítom magamnak, hogy a jó megoldás maradjon meg, ha újra előveszem.
    Bár a videóidat elnézve ez valami nagyon könnyű dolog, nekem azért elég sok kísérletezésbe és próbálkozásba került míg úgy működött, ahogy elképzeltem. 🙂
    Megint csak köszönöm a munkádat. Nagyszerű ez a sorozatod, még ha nekem nem is megy olyan gyorsan és magától értetődően mint szeretném.

    Üdv!
    meoindil

    Kedvelik 1 személy

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