Python kezdőknek kurzus 5. lecke

A Ubuwiki wikiből

Végtelen ciklusok, modulus és véletlen számok

A mai lecke néhány független témáról szól, melyek hasznosak lehetnek a későbbiekben.

while ciklusok

Már írtunk korábban for ciklust, de nem említettük, hogy Pythonban van másfajta ciklus is: a while ciklus. Így néz ki:

while feltetelek :
  do parancsok

A feltételek ugyanazok lehetnek, mint amit az if-nél is láttunk. Lehet például a feltétel x < 3 vagy len(s) > 0.

Ennél bonyolultabb feltételeket is írhatunk and (és) illetve or (vagy) műveletek segítségével:

while x < 3 and len(s) > 0 :
while (x > 0 and x < 3) or len(s) > 0 :

Mindig használjuk a kettőspontokat, amikor elég bonyolult feltételeink vannak, mert a feltételkiértékelés elbonyolódhat. Bár az esetek nagy részében nem lesz szükség bonyolult dolgokra.

A végtelen while ciklust meglepően gyakran fogod látni Pythonban:

while True :
  print "Ismételd ezt örökké!"

(Ha kipróbálnád, Control-C segítségével megszakíthatod a ciklust.)

A while True (amíg igaz) használata nem feltétlenül jelenti, hogy a programunkat örökké szeretnénk futtatni (sőt!). A break parancs használatával kiléphetünk a ciklusból. Például beolvastatunk egy parancsnevet a felhasználótól és ha az a 'kilepes' volt, kilépünk a ciklusból:

while True :
  cmd = raw_input("Parancs? ")
  if cmd == "kilepes" :
    print "Viszlat"
    break      # ha a felhasznalo 'kilepes'-t gepelt, itt az ido a tavozasra
  print "Kiadott parancs ", cmd

Matematika és kerekítés

Természetesen tudunk egyszerű matematikai műveleteket végezni, mint a 23 + 52, speciális függvénykönyvtárak nélkül. De ha bonyolultabb dolgokat is szeretnénk használni, mint a logaritmus vagy koszinusz, szükség lesz a math modulra. Használata egyszerű:

import math
print "log(42) is", math.log(42)

A modul tartalmaz pár állandót, mint a math.pi vagy a math.e.

Az alábbi linken erről részletesebb információ található: http://docs.python.org/library/math.htm Van még számos egyéb matematikai művelet, melyek nem igényelnek semmilyen (függvény)könyvtárat.

Elsőként nézzük az átalakításokat.

Néhány esetben tört értéket kaphatunk számolás során, ilyenkor több módszerrel is átalakíthatjuk egésszé. Levághatjuk a tizedesjegyeket (lefelé kerekítünk) az int() segítségével

>>> int(45.6)
45

Vagy kerekíthetjük a számot a legközelebbi egészre a round()dal:

>>> round(45.6)
46.0

Fontos megjegyezni, hogy az utóbbi esetben lebegőpontos értéket kapunk (ott a tizedes pont). Tehát, ha valóban egészre van szükségünk, akkor használjuk a int(round(45.6)) parancsot. Ez utóbbi formára van szükségünk, ha az alábbi üzenetet kapjuk

TypeError: list indices must be integers, not float

Modulus (maradékos osztás)

Egy kevésbé elterjedt művelet, amit középiskolákban nem szoktak tanítani viszont programozás során mindig előkerül: a modulus művelet (más néven maradékos osztás). Ez az osztási maradékot adja meg. Pythonban (mint a legtöbb modern programozási nyelvben) a % jel reprezentálja

>>> 11 % 9   
2
>>> 7 % 3   # "het modulo harom"
1

A 11 9-el osztva 1 és 2 a maradék; 7 3-mal osztva 2 és 1 a maradék.

Miért olyan hasznos ez? Miért fontosabb a maradék, mint maga az osztás eredménye?

Egyik dolog, amiért hasznos lehet a modulus: megállapítható vele, hogy egy adott szám osztója-e egy másiknak. Például, ha szeretnénk egy olyan programot írni, melybe egy hosszabb elválasztó vonalat teszünk minden 10. sorba és egy rövidebbet minden 5.-be, akkor ahhoz nagyon hasznos a % művelet:

for i in range(0, 21) :
  if i % 10 == 0 :
    print "-----"
  elif i % 5 == 0 :
    print "--"
  else :
    print "-"

A legfontosabb dolog, amire emlékeznünk kell még a modulussal kapcsolatban, hogy az x % y eredménye mindig 0 és y-1 közé eső szám.

Véletlen (random)

Lehet, hogy meglepő az, hogy a véletlen számokról beszéljünk ebben a bevezető kurzusban, de számos esetben hasznos lehet ismerni őket. Emellett Pythonban rendkívül egyszerű őket használni.

Az előző leckében megtanultuk hogyan importáljunk modulokat. Ahhoz, hogy használhassuk a véletlen számokat, adjuk ki az

import random

parancsot, valahol a fájlunk elején. Ezután pedig használjuk a random.akarmi formát.

A két leghasznosabb véletlen függvény a randint() és a choice().

A randint() egy véletlen számot ad két érték közt, beleértve a megadott határokat is: random.randint(0, 1) adhat 0-t és 1-et is eredményül. random.randint(0, 255) egy számot ad 0 és 255 közt, beleértve e két számot is.

A random.choice() talán még hasznosabb: megadhatunk neki egy listát és a lista egy véletlen elemét adja. Tehát ha van egy listánk, például

igek = [ "programozik", "var", "buborekot fuj", "csal", "Makarenat tancol" ]
random.choice(igek)

kiválaszt egyet a fenti igék közül

További részletek: http://docs.python.org/library/random.html

Házi feladatok

1. Tegyük fel, van egy listánk színekről. Például

szinek = [ "piros", "narancs", "citromsarga", "zold", "kek" ]

és van sok tárgyunk (pl. 20), amit szükséges ismétlés nélkül színekhez rendelni. Hogy használnád a % operátort, hogy a színeket sorrendben járd végig, egymás után úgy, hogy a kék után a piros jöjjön?

Tipp: x % y mindig egy 0 és y-1 közti számot ad (beleértve a 0-t és y-1-et is). Minek kell y-nak lennie, hogy a listát index-szelhessük vele?

2. Hogy írnál olyan programot, ami egy adott könyvtárból véletlenszerűen kiválaszt egy fájlt? Tegyük fel, hogy a könyvtár egy fix helyen van, például /usr/share/backgrounds vagy /home/yourname/Backgrounds.

Tipp: os.listdir(konyvtarnev) megadja az adott könyvtárban levő fájlok listáját. Szükséges hozzá kiadni a import os parancsot.

Kérdés miért is szeretnél ilyesmit csinálni? Én például rengeteg háttérképet tárolok egyik könyvtáramban és minden alkalommal, mikor bejelentkezek egy script választ ki véletlenszerűen hátteret, így minden alkalommal más hátterem van. Vicces mikor meglátom, hogy aznap milyen hátterem lesz.

Egy ideig ugyanezt csináltam a sipoló hanggal is, néha emiatt farkas vagy varjúkárogás volt a sipoló hang (beep). De ez a férjemet az őrületbe kergette, úgyhogy abbahagytam :-)

3. Készítsünk egy listát főnevekkel és egyet igékkel, majd egy programot, ami véletlen mondatokat gyárt úgy, hogy kiválaszt egy főnevet majd egy igét (véletlenszerűen).

További leckék

Személyes eszközök