Tupel bernama pada dasarnya mudah dibuat, jenis objek yang ringan. Contoh tuple yang dinamai dapat dirujuk menggunakan dereferencing variabel seperti objek atau sintaks tuple standar. Mereka dapat digunakan serupa dengan struct
atau jenis rekaman umum lainnya, kecuali bahwa mereka tidak berubah. Mereka ditambahkan dalam Python 2.6 dan Python 3.0, meskipun ada resep untuk implementasi di Python 2.4 .
Sebagai contoh, itu umum untuk mewakili titik sebagai tupel (x, y)
. Ini mengarah ke kode seperti berikut:
pt1 = (1.0, 5.0)
pt2 = (2.5, 1.5)
from math import sqrt
line_length = sqrt((pt1[0]-pt2[0])**2 + (pt1[1]-pt2[1])**2)
Menggunakan tuple bernama itu menjadi lebih mudah dibaca:
from collections import namedtuple
Point = namedtuple('Point', 'x y')
pt1 = Point(1.0, 5.0)
pt2 = Point(2.5, 1.5)
from math import sqrt
line_length = sqrt((pt1.x-pt2.x)**2 + (pt1.y-pt2.y)**2)
Namun, tupel bernama masih kompatibel dengan tupel normal, sehingga yang berikut masih berfungsi:
Point = namedtuple('Point', 'x y')
pt1 = Point(1.0, 5.0)
pt2 = Point(2.5, 1.5)
from math import sqrt
# use index referencing
line_length = sqrt((pt1[0]-pt2[0])**2 + (pt1[1]-pt2[1])**2)
# use tuple unpacking
x1, y1 = pt1
Dengan demikian, Anda harus menggunakan nama tuple daripada tuple di mana saja Anda pikir notasi objek akan membuat kode Anda lebih pythonic dan lebih mudah dibaca . Saya pribadi sudah mulai menggunakannya untuk mewakili tipe nilai yang sangat sederhana, terutama ketika meneruskannya sebagai parameter untuk fungsi. Itu membuat fungsi lebih mudah dibaca, tanpa melihat konteks pengemasan tuple.
Selain itu, Anda juga dapat mengganti kelas abadi biasa yang tidak memiliki fungsi , hanya bidang dengan mereka. Anda bahkan dapat menggunakan tipe tuple bernama Anda sebagai kelas dasar:
class Point(namedtuple('Point', 'x y')):
[...]
Namun, seperti halnya tupel, atribut dalam tupel bernama tidak dapat diubah:
>>> Point = namedtuple('Point', 'x y')
>>> pt1 = Point(1.0, 5.0)
>>> pt1.x = 2.0
AttributeError: can't set attribute
Jika Anda ingin dapat mengubah nilai, Anda perlu tipe lain. Ada resep praktis untuk recordtypable yang bisa diubah yang memungkinkan Anda untuk menetapkan nilai baru ke atribut.
>>> from rcdtype import *
>>> Point = recordtype('Point', 'x y')
>>> pt1 = Point(1.0, 5.0)
>>> pt1 = Point(1.0, 5.0)
>>> pt1.x = 2.0
>>> print(pt1[0])
2.0
Namun, saya tidak mengetahui adanya "daftar nama" yang memungkinkan Anda menambahkan bidang baru. Anda mungkin hanya ingin menggunakan kamus dalam situasi ini. Tupel yang diberi nama dapat dikonversi ke kamus menggunakan pt1._asdict()
yang mengembalikan {'x': 1.0, 'y': 5.0}
dan dapat dioperasikan dengan semua fungsi kamus yang biasa.
Seperti yang sudah disebutkan, Anda harus memeriksa dokumentasi untuk informasi lebih lanjut dari mana contoh-contoh ini dibangun.
__slots__
typing.NamedTuple
yang memungkinkan untuk mengetik petunjuk dan sangat nyaman untuk subkelas.namedtuple adalah fungsi pabrik untuk membuat kelas tuple. Dengan kelas itu kita bisa membuat tupel yang bisa dipanggil dengan nama juga.
sumber
namedtuple is a factory function for making a tuple class.
itu mungkin satu-satunya jawaban yang benar di sini: PSebuah tuple bernama adalah tuple.
Itu melakukan semua yang bisa dilakukan oleh tuple.
Tapi itu lebih dari sekadar tuple.
Ini adalah subkelas spesifik dari tupel yang secara pemrograman dibuat sesuai spesifikasi Anda, dengan bidang bernama dan panjang tetap.
Ini, misalnya, membuat subkelas tupel, dan selain memiliki panjang tetap (dalam hal ini, tiga), ia dapat digunakan di mana pun tupel digunakan tanpa putus. Ini dikenal sebagai substitusi Liskov.
Baru di Python 3.6 , kita bisa menggunakan definisi kelas dengan
typing.NamedTuple
untuk membuat nameserupup:Di atas sama dengan yang di bawah, kecuali yang di atas juga memiliki jenis anotasi dan dokumentasi. Di bawah ini tersedia dalam Python 2+:
Ini instantiate itu:
Kami dapat memeriksanya dan menggunakan atributnya:
Penjelasan lebih dalam
Untuk memahami tupel bernama, Anda harus terlebih dahulu tahu apa tupel itu. Sebuah tuple pada dasarnya adalah daftar yang tidak dapat diubah (tidak dapat diubah di tempat dalam memori).
Inilah cara Anda menggunakan tuple biasa:
Anda dapat memperluas tuple dengan membongkar iterable:
Named tuple adalah tuple yang memungkinkan elemen-elemennya diakses dengan nama alih-alih hanya indeks!
Anda membuat nama bernama seperti ini:
Anda juga dapat menggunakan string tunggal dengan nama yang dipisahkan oleh spasi, penggunaan API yang sedikit lebih mudah dibaca:
Anda dapat melakukan semua hal yang dapat dilakukan oleh tuple (lihat di atas) dan juga melakukan hal berikut:
Seorang komentator bertanya:
Jenis yang Anda buat
namedtuple
pada dasarnya adalah kelas yang dapat Anda buat dengan singkatan yang mudah. Perlakukan mereka seperti kelas. Tentukan mereka di tingkat modul, sehingga acar dan pengguna lain dapat menemukannya.Contoh kerja, pada tingkat modul global:
Dan ini menunjukkan kegagalan untuk mencari definisi:
Gunakan mereka ketika meningkatkan kode Anda untuk memiliki semantik elemen tuple yang dinyatakan dalam kode Anda.
Anda dapat menggunakannya sebagai ganti objek jika Anda akan menggunakan objek dengan atribut data yang tidak berubah dan tidak ada fungsi.
Anda juga dapat mensubklasifikasikan mereka untuk menambahkan fungsionalitas, misalnya :
Mungkin akan menjadi regresi untuk beralih dari menggunakan nama tupel ke tupel. Keputusan desain dimuka berpusat di sekitar apakah biaya dari kode tambahan yang terlibat layak dibaca lebih baik ketika tuple digunakan.
Tidak ada memori tambahan yang digunakan oleh nama tuple versus tuple.
Anda sedang mencari objek yang ditempatkan yang mengimplementasikan semua fungsi dari daftar berukuran statis atau daftar subkelas yang bekerja seperti tuple bernama (dan yang entah bagaimana memblokir daftar dari perubahan ukuran.)
A sekarang diperluas, dan mungkin bahkan Liskov yang dapat diganti, contoh yang pertama:
Dan untuk digunakan, cukup subkelas dan tentukan
__slots__
:sumber
namedtuples adalah fitur yang hebat, mereka wadah yang sempurna untuk data. Saat Anda harus "menyimpan" data, Anda akan menggunakan tuple atau kamus, seperti:
atau:
Pendekatan kamus luar biasa, karena dikt dapat berubah dan lebih lambat dari tupel. Di sisi lain, tupel tidak berubah dan ringan tetapi kurang mudah dibaca untuk sejumlah besar entri di bidang data.
Bernamaup adalah kompromi yang sempurna untuk dua pendekatan, memiliki keterbacaan yang hebat, ringan dan kekekalan (ditambah mereka polimorfik!).
sumber
ntuple.foo
vsntuple[1]
yang terakhir jauh lebih cepat. Lebih lanjut tentang itu: stackoverflow.com/questions/2646157/…beri nama tuple memungkinkan kompatibilitas dengan kode yang memeriksa versi seperti ini
sementara memungkinkan kode masa depan menjadi lebih eksplisit dengan menggunakan sintaks ini
sumber
namedtuple
adalah salah satu cara termudah untuk membersihkan kode Anda dan membuatnya lebih mudah dibaca. Ini mendokumentasikan apa yang terjadi di tuple. Contoh Namedtuples sama efisiennya dengan memori dengan tupel biasa karena mereka tidak memiliki kamus per-instance, menjadikannya lebih cepat daripada kamus.
Tanpa menyebutkan setiap elemen dalam tuple, akan berbunyi seperti ini:
Jauh lebih sulit untuk memahami apa yang terjadi dalam contoh pertama. Dengan nama yang dinamai, setiap bidang memiliki nama. Dan Anda mengaksesnya dengan nama daripada posisi atau indeks. Alih-alih
p[1]
, kita bisa menyebutnya p.saturation. Lebih mudah dimengerti. Dan itu terlihat lebih bersih.Membuat instance dari namesuple lebih mudah daripada membuat kamus.
Kapan mungkin Anda menggunakan namesuple
p.hue
bukannyap['hue']
.Sintaksnya
['x', 'y', 'z']
atau stringx y z
(tanpa koma, hanya spasi putih) ataux, y, z
.True
, nama field yang tidak valid secara otomatis diganti dengan nama posisional. Misalnya,['abc', 'def', 'ghi','abc']
dikonversi menjadi['abc', '_1', 'ghi', '_3']
, menghilangkan kata kunci'def'
(karena itu adalah kata yang disediakan untuk mendefinisikan fungsi) dan fieldname duplikat'abc'
.True
, definisi kelas dicetak sesaat sebelum dibangun.Anda masih dapat mengakses namesuple dengan posisi mereka, jika Anda mau.
p[1] == p.saturation
. Itu masih membongkar seperti tuple biasa.Metode
Semua metode tuple reguler didukung. Mis: min (), maks (), len (), dalam, bukan dalam, gabungan (+), indeks, slice, dll. Dan ada beberapa yang tambahan untuk namedtuple. Catatan: ini semua dimulai dengan garis bawah.
_replace
,_make
,_asdict
._replace
Mengembalikan instance baru dari tuple bernama menggantikan bidang yang ditentukan dengan nilai-nilai baru.Sintaksnya
Contoh
Perhatikan : Nama bidang tidak ada dalam tanda kutip; mereka adalah kata kunci di sini. Ingat : Tuple tidak dapat diubah - bahkan jika mereka diberi nama Tupel dan memiliki
_replace
metode. The_replace
menghasilkannew
contoh; itu tidak mengubah yang asli atau mengganti nilai yang lama. Anda tentu saja dapat menyimpan hasil baru ke variabel.p = p._replace(hue=169)
_make
Membuat instance baru dari urutan yang ada atau iterable.
Sintaksnya
Contoh
Apa yang terjadi dengan yang terakhir? Item di dalam kurung harus iterable. Jadi daftar atau tuple di dalam tanda kurung bekerja, tetapi urutan nilai tanpa melampirkan sebagai iterable mengembalikan kesalahan.
_asdict
Mengembalikan OrderedDict baru yang memetakan nama bidang ke nilai yang sesuai.
Sintaksnya
Contoh
Referensi : https://www.reddit.com/r/Python/comments/38ee9d/intro_to_namedtuple/
Ada juga daftar bernama yang mirip dengan nama tuple tetapi dapat diubah https://pypi.python.org/pypi/namedlist
sumber
_
!Apa yang disebuttuple?
Seperti namanya, namesuple adalah tuple dengan nama. Dalam tuple standar, kami mengakses elemen menggunakan indeks, sedangkan namupuple memungkinkan pengguna untuk menentukan nama untuk elemen. Ini sangat berguna terutama memproses file csv (comma separated value) dan bekerja dengan dataset yang kompleks dan besar, di mana kode menjadi berantakan dengan penggunaan indeks (tidak terlalu pythonic).
Bagaimana cara menggunakannya?
Bacaan
Skenario Menarik dalam Pemrosesan CSV:
sumber
Dalam Python di dalamnya ada penggunaan wadah yang baik bernama tuple bernama, itu dapat digunakan untuk membuat definisi kelas dan memiliki semua fitur tuple asli.
Menggunakan tuple bernama akan langsung diterapkan ke templat kelas default untuk menghasilkan kelas sederhana, metode ini memungkinkan banyak kode untuk meningkatkan keterbacaan dan juga sangat nyaman saat mendefinisikan kelas.
sumber
Cara lain (cara baru) untuk menggunakan nama tuple adalah dengan menggunakan NamedTuple dari mengetik paket: Ketik petunjuk dalam namedtuple
Mari kita gunakan contoh jawaban teratas di posting ini untuk melihat bagaimana menggunakannya.
(1) Sebelum menggunakan tuple bernama, kodenya seperti ini:
(2) Sekarang kita menggunakan tuple bernama
mewarisi kelas NamedTuple dan mendefinisikan nama variabel di kelas baru. test adalah nama kelas.
buat instance dari kelas dan berikan nilai kepada mereka
gunakan variabel dari instance untuk menghitung
sumber
Coba ini:
Pada dasarnya,
namedtuples
mudah dibuat, jenis objek yang ringan. Mereka mengubah tuple menjadi wadah yang nyaman untuk tugas-tugas sederhana. Dengannamedtuples
, Anda tidak harus menggunakan indeks integer untuk mengakses anggota tuple.Contoh:
Kode 1:
Kode 2:
sumber
Semua orang sudah menjawabnya, tapi saya pikir saya masih punya sesuatu untuk ditambahkan.
Namedtuple dapat secara intuitif dianggap sebagai jalan pintas untuk mendefinisikan kelas.
Lihat cara rumit dan konvensional untuk mendefinisikan a
class
.Untuk
namedtuple
sumber
red_duck[0]
ataulen(red_duck)
ataufor x in red_duck: print(x)
. Selain itu, tupel bernama tidak dapat diubah, sehingga operasi ini akan gagal:red_duck[0] = 2
,red_duck.foo = 'bar'
. Karena tidak dapat diubah, tupel bernama dapat digunakan sebagaidict
kunci.