Recent Changes - Search:

Oktatás

* Programozás 1
  + feladatsor
  + GitHub oldal

* Szkriptnyelvek
  + feladatsor
  + quick link

Teaching

* Programming 1 (BI)
  ◇ exercises
  ◇ quick link

* Scripting Languages
  ◇ exercises
  ◇ quick link

teaching assets


Félévek

* aktuális (2023/24/2)
* archívum


Linkek

* kalendárium
   - munkaszüneti napok '20
* tételsorok
* jegyzetek
* szakdolgozat / PhD
* ösztöndíjak
* certificates
* C lang.
* C++
* C#
* Clojure
* D lang.
* Java
* Nim
* Scala


[ edit | logout ]
[ sandbox | passwd ]

Py /

20170516e

itertools #1

Az itertools modul számos iterátort tartalmaz, amik a szekvenciák feldolgozását könnyítik meg. A modul függvényei olyan műveleteket tesznek lehetővé, amik ismerősek lehetnek a funkcionális programozási nyelvekből. Ezen iterátorok gyorsak és a memóriát is hatékonyan használják. Ha nagyméretű listákat építünk fel, hogy aztán bejárjuk őket, akkor lehet, hogy az iterools függvényeivel hatékonyabb kódot tudnánk írni.

Egy modulból nem szép dolog mindent beimportálni, de most az egyszerűség kedvéért minden példa elejére képzeljük oda az alábbi sort:

from itertools import *

Végtelen iterátorok

A count(), a cycle() és a repeat() tartozik ide. A végtelenségig mennek, tehát ha ciklusban használjuk őket, akkor pl. break-kel tudunk kitörni a végtelen ciklusból.

count(start=0, step=1)

def main():
    for i in count(11):
        if i > 15:
            break
        #
        print(i)

Indul a 11-es kezdőértékről (a lépésköz az alapértelmezett 1 lesz), majd generálja a rákövetkező egészeket: 12, 13, 14, …

11
12
13
14
15

Hasonló hatást érhetünk el az itertools.islice iterátorral is. Ez egy iterátort ad vissza, ami az input iterátor megadott számú elemein megy végig.

def main():
    for i in islice(count(11), 5):
        print(i)

A count indul a 11-ről, s menne a végtelenségig, de az islice 5 iteráció után leállítja. A kimenet:

11
12
13
14
15

cycle(iterable)

def main():
    cnt = 0
    for c in cycle('ABCD'):
        cnt += 1
        if cnt > 10:
            break
        #
        print(c, end=" ")
A B C D A B C D A B

A cycle a paraméterül kapott iterálható objektumon megy végig ciklikusan, a végtelenségig.

repeat(object[, times])

Ha a times nincs megadva, akkor az adott objektumot adogatja vissza a végtelenégig. Ha a times paraméter meg van adva, akkor az adott objektumot ennyiszer adja vissza.

def main():
    for c in repeat('X', 5):
        print(c, end=" ")
X X X X X

Gyakran a map és a zip függvényekkel együtt szokták használni.


Néhány használati eset

Kezdőérték konstansoknak

RED, GREEN, BLUE = range(3)    # RED is 0, GREEN is 1, BLUE is 2

De mi van, ha mondjuk az 5, 6, 7 értékeket akarjuk hozzájuk rendelni?

RED, GREEN, BLUE = range(5, 5+3)    # RED is 5, GREEN is 6, BLUE is 7

Viszont ez elég furán néz ki. Így talán szebb:

RED, GREEN, BLUE = islice(count(5), 3)    # RED is 5, GREEN is 6, BLUE is 7

Persze a triviális esetről se felejtkezzünk el:

RED, GREEN, BLUE = (5, 6, 7)

Linkek

Cloud City

  

Blogjaim, hobbi projektjeim

* The Ubuntu Incident
* Python Adventures
* @GitHub
* heroku
* extra
* haladó Python
* YouTube listák


Debrecen | la France


[ edit ]

Edit - History - Print *** Report - Recent Changes - Search
Page last modified on 2017 May 21, 20:49