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 /

20170514c

namedtuple

A namedtuple a tuple osztály leszármazottja, s abban tér el a sima tuple-től, hogy itt a mezőkhöz nevet tudunk rendelni. Egy namedtuple szintén immutable, azaz létrehozása után nem módosítható. Ha egy tuple-t rekordként kezelünk, aminek több mezője is van, akkor jó ötlet lehet a namedtuple használata. Ha egy olyan saját osztályt definiálunk, amiben csak adatokat tárolunk, azaz csak példányváltozói vannak, akkor azt valószínűleg ki tudjuk váltani egy namedtuple-lel.

Egy tuple esetén a mezőkre csakis az indexek segítségével tudunk hivatkozni. Sok mező esetében ez már nyűgös lehet. Egy namedtuple esetén egy mezőre hivatkozhatunk a 1) nevével, vagy 2) az indexével (csakúgy, mint a sima tuple esetén).

Egy namedtuple nem foglal több memóriát! Használjuk bátran!

Példa

Egy játékról a következőkat szeretnénk tárolni: cím, értékelés (százalékban), ill. ár (USD-ben).

#!/usr/bin/env python3

from collections import namedtuple

Game = namedtuple('Game', ['title', 'rating', 'price'])    # It's a class, not an instance!

def main():
    games = []
    g1 = Game('Alan Wake', 91, 2.99)
    g2 = Game(title='Furi', price=11.99, rating=92)
    g3 = Game('DOOM', rating=92, price=19.79)
    games.append(g1)
    games.append(g2)
    games.append(g3)
    print(games)
    print("-" * 20)
    print(sorted(games, key=lambda g: g.title))

main()

Kimenet:

[Game(title='Alan Wake', rating=91, price=2.99), Game(title='Furi', rating=92, price=11.99), 
Game(title='DOOM', rating=92, price=19.79)]
--------------------
[Game(title='Alan Wake', rating=91, price=2.99), Game(title='DOOM', rating=92, price=19.79), 
Game(title='Furi', rating=92, price=11.99)]

Speciális metódusok

def main():
    g = Game('DOOM', rating=92, price=19.79)
    print(g._asdict())              # returns an OrderedDict
    print(dict(g._asdict()))        # normal dict
    print("-" * 20)
    print(g)
    print(id(g))
    print("-" * 20)
    g = g._replace(title='doom')    # returns a new namedtuple instance
    print(g)
    print(id(g))

Ha egy metódus neve '_' jellel kezdődik, az általában privát metódust jelöl. Itt a fenti két metódus neve azért kezdődik így, hogy ne ütközzenek a felhasználó által megadott mezőnevekkel.

Kimenet:

OrderedDict([('title', 'DOOM'), ('rating', 92), ('price', 19.79)])
{'title': 'DOOM', 'rating': 92, 'price': 19.79}
--------------------
Game(title='DOOM', rating=92, price=19.79)
140520697049160
--------------------
Game(title='doom', rating=92, price=19.79)
140520697049400

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 17, 13:19