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

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 )

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 )

Google+ kép

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

Kapcsolódás: %s