Apa saja fitur yang kurang diketahui tetapi berguna dari bahasa pemrograman Python?
- Cobalah untuk membatasi jawaban ke inti Python.
- Satu fitur per jawaban.
- Berikan contoh dan deskripsi singkat tentang fitur ini, bukan hanya tautan ke dokumentasi.
- Beri label fitur menggunakan judul sebagai baris pertama.
Tautan cepat ke jawaban:
- Argumen Membongkar
- Kawat gigi
- Operator Perbandingan Chaining
- Dekorator
- Argumen Default Gotchas / Bahaya Mutable, Argumen Default
- Penjelas
.get
Nilai default kamus- Tes Dokumentasi
- Ellipsis Slicing Syntax
- Pencacahan
- Untuk / lainnya
- Berfungsi sebagai argumen iter ()
- Ekspresi generator
import this
- Swapping Nilai Di Tempat
- Daftar loncatan
__missing__
barang- Multi-line Regex
- Memformat string bernama
- Pemahaman daftar / generator bersarang
- Jenis baru saat runtime
.pth
file- Pengodean ROT13
- Regex Debugging
- Mengirim ke Generator
- Penyelesaian Tab dalam Interpreter Interaktif
- Ekspresi Ternary
try/except/else
- Membongkar
print()
fungsi + with
pernyataan
python
hidden-features
compie
sumber
sumber
(< 1 x 10)
. Anda bahkan dapat menerapkannya pada argumen tunggal, seperti(= 10)
: cs.cmu.edu/Groups/AI/html/hyperspec/HyperSpec/Body/…Dapatkan pohon parse regex python untuk men-debug regex Anda.
Ekspresi reguler adalah fitur hebat dari python, tetapi men-debug-nya bisa sangat menyebalkan, dan terlalu mudah untuk membuat kesalahan regex.
Untungnya, python dapat mencetak pohon parse regex, dengan melewatkan flag yang tidak didokumentasikan, eksperimental, dan disembunyikan
re.DEBUG
(sebenarnya, 128) kere.compile
.Setelah Anda memahami sintaks, Anda dapat menemukan kesalahan Anda. Di sana kita bisa melihat bahwa saya lupa untuk melarikan diri
[]
di[/font]
.Tentu saja Anda dapat menggabungkannya dengan bendera apa pun yang Anda inginkan, seperti regex yang dikomentari:
sumber
menghitung
Bungkus iterable dengan enumerate dan itu akan menghasilkan item beserta indeksnya.
Sebagai contoh:
Referensi:
enumerate
sumber
Membuat objek generator
Jika kamu menulis
Anda bisa mengeluarkan generator dan menugaskannya ke x. Sekarang berarti Anda bisa melakukannya
Keuntungan dari hal ini adalah Anda tidak perlu penyimpanan perantara, yang akan Anda perlukan jika memang perlu
Dalam beberapa kasus, ini dapat mempercepat secara signifikan.
Anda dapat menambahkan banyak pernyataan if ke akhir generator, yang pada dasarnya mereplikasi nested for loop:
sumber
iter () dapat mengambil argumen yang bisa dipanggil
Contohnya:
The
iter(callable, until_value)
fungsi berulang kali memanggilcallable
dan menghasilkan hasilnya sampaiuntil_value
dikembalikan.sumber
lambda
kata kunci diperlukan di sini?Hati-hati dengan argumen default yang bisa berubah
Alih-alih, Anda harus menggunakan nilai sentinel yang menunjukkan "tidak diberikan" dan ganti dengan yang dapat diubah yang Anda inginkan sebagai default:
sumber
foo.func_defaults
. Yang, sebagai tuple, tidak berubah.Mengirim nilai ke fungsi generator . Misalnya memiliki fungsi ini:
Kamu bisa:
sumber
Jika Anda tidak suka menggunakan spasi untuk menunjukkan cakupan, Anda dapat menggunakan gaya-C {} dengan mengeluarkan:
sumber
Argumen langkah dalam operator slice. Sebagai contoh:
Kasus khusus
x[::-1]
adalah ungkapan yang berguna untuk 'x terbalik'.sumber
Dekorator
Dekorator memungkinkan untuk membungkus fungsi atau metode dalam fungsi lain yang dapat menambah fungsionalitas, memodifikasi argumen atau hasil, dll. Anda menulis dekorator satu baris di atas definisi fungsi, dimulai dengan tanda "at" (@).
Contoh menunjukkan
print_args
dekorator yang mencetak argumen fungsi yang didekorasi sebelum memanggilnya:sumber
Sintaks untuk ... else (lihat http://docs.python.org/ref/for.html )
Blok "lain" biasanya akan dieksekusi pada akhir dari for loop, kecuali jika break disebut.
Kode di atas dapat ditiru sebagai berikut:
sumber
Dari 2,5 dan seterusnya dikte memiliki metode khusus
__missing__
yang dipanggil untuk item yang hilang:Ada juga subkelas dict yang
collections
disebutnyadefaultdict
yang melakukan hampir sama tetapi memanggil fungsi tanpa argumen untuk item yang tidak ada:Saya sarankan untuk mengubah dikte tersebut menjadi dikte biasa sebelum meneruskannya ke fungsi yang tidak diharapkan subkelas tersebut. Banyak kode menggunakan
d[a_key]
dan menangkap KeyErrors untuk memeriksa apakah ada item yang akan menambahkan item baru ke dikt.sumber
m={}; m.setdefault('foo', []).append(1)
.defaultdict
juga lebih kuat daripadasetdefault
metode dalam kasus lain. Sebagai contoh, untuk kontradd = collections.defaultdict(int) ... dd[k] += 1
vsd.setdefault(k, 0) += 1
.Penukaran nilai di tempat
Sisi kanan penugasan adalah ekspresi yang membuat tuple baru. Sisi kiri penugasan segera membongkar bahwa (tidak direferensikan) tuple ke nama
a
danb
.Setelah penugasan, tuple baru tidak direferensikan dan ditandai untuk pengumpulan sampah, dan nilai-nilai terikat
a
danb
telah ditukar.Seperti yang disebutkan di bagian tutorial Python tentang struktur data ,
sumber
Ekspresi reguler yang dapat dibaca
Dengan Python Anda dapat membagi ekspresi reguler menjadi beberapa baris, beri nama kecocokan Anda dan masukkan komentar.
Contoh sintaksis verbose (dari Menyelam ke Python ):
Contoh penamaan yang cocok (dari Regular Expression HOWTO )
Anda juga dapat secara tertulis menulis regex tanpa menggunakan
re.VERBOSE
terima kasih kepada string literal.sumber
Argumen fungsi membongkar
Anda dapat membongkar daftar atau kamus sebagai argumen fungsi menggunakan
*
dan**
.Sebagai contoh:
Jalan pintas yang sangat berguna karena daftar, tupel dan dikte banyak digunakan sebagai wadah.
sumber
ROT13 adalah pengodean yang valid untuk kode sumber, ketika Anda menggunakan deklarasi pengkodean yang tepat di bagian atas file kode:
sumber
cevag h"Uryyb fgnpxbiresybj!"
Membuat tipe baru dengan cara yang sepenuhnya dinamis
yang persis sama dengan
Mungkin bukan hal yang paling berguna, tapi menyenangkan untuk diketahui.
Sunting : Nama tetap tipe baru, harus
NewType
sama persis denganclass
pernyataan.Sunting : Menyesuaikan judul untuk menjelaskan fitur dengan lebih akurat.
sumber
Manajer konteks dan pernyataan "
with
"Diperkenalkan dalam PEP 343 , manajer konteks adalah objek yang bertindak sebagai konteks run-time untuk serangkaian pernyataan.
Karena fitur ini menggunakan kata kunci baru, diperkenalkan secara bertahap: ini tersedia dalam Python 2.5 melalui
__future__
arahan. Python 2.6 dan di atasnya (termasuk Python 3) telah tersedia secara default.Saya sering menggunakan pernyataan "with" karena saya pikir ini adalah konstruk yang sangat berguna, berikut adalah demo singkatnya:
Apa yang terjadi di sini di belakang layar, adalah bahwa pernyataan "with" memanggil spesial
__enter__
dan__exit__
pada objek file. Detail pengecualian juga diteruskan ke__exit__
jika ada pengecualian yang diajukan dari badan pernyataan with, yang memungkinkan penanganan pengecualian terjadi di sana.Apa yang ini lakukan untuk Anda dalam kasus khusus ini adalah bahwa ia menjamin bahwa file ditutup ketika eksekusi keluar dari ruang lingkup
with
suite, terlepas dari apakah itu terjadi secara normal atau apakah pengecualian dilemparkan. Ini pada dasarnya adalah cara untuk mengabstraksi kode penanganan pengecualian yang umum.Kasing penggunaan umum lainnya untuk ini termasuk penguncian dengan utas dan transaksi basis data.
sumber
withs
:)with open('filea') as filea and open('fileb') as fileb: ...
with open('filea') as filea, open('fileb') as fileb: ...
Kamus memiliki metode get ()
Kamus memiliki metode 'get ()'. Jika Anda melakukan d ['kunci'] dan kunci tidak ada di sana, Anda akan mendapatkan pengecualian. Jika Anda melakukannya d.get ('kunci'), Anda mendapatkan kembali Tidak ada jika 'kunci' tidak ada. Anda dapat menambahkan argumen kedua untuk mendapatkan item itu kembali sebagai ganti None, mis .: d.get ('key', 0).
Ini bagus untuk hal-hal seperti menambahkan angka:
sum[value] = sum.get(value, 0) + 1
sumber
get(key, None)
. Tidak punya ide yangNone
disediakan secara default.Penjelas
Mereka adalah keajaiban di balik sejumlah fitur inti Python.
Ketika Anda menggunakan akses bertitik untuk mencari anggota (misalnya, xy), Python pertama mencari anggota dalam kamus contoh. Jika tidak ditemukan, akan dicari di kamus kelas. Jika menemukannya di kamus kelas, dan objek mengimplementasikan protokol deskriptor, alih-alih mengembalikannya, Python menjalankannya. Sebuah descriptor adalah setiap kelas yang mengimplementasikan
__get__
,__set__
atau__delete__
metode.Inilah cara Anda akan menerapkan versi properti Anda (hanya baca) menggunakan deskriptor:
dan Anda akan menggunakannya seperti properti bawaan ():
Penjelas digunakan dalam Python untuk mengimplementasikan properti, metode terikat, metode statis, metode kelas, dan slot, di antara hal-hal lainnya. Memahami mereka membuatnya mudah untuk melihat mengapa banyak hal yang sebelumnya tampak seperti 'quirks' Python adalah cara mereka.
Raymond Hettinger memiliki tutorial yang sangat baik yang melakukan pekerjaan yang jauh lebih baik dalam menggambarkan mereka daripada saya.
sumber
foo = property(lambda self: self.__foo)
property
itu sendiri diimplementasikan dengan deskriptor, yang merupakan titik posting saya.Tugas Bersyarat
Itu tidak persis seperti apa terdengar: "tetapkan 3 ke x jika y adalah 1, jika tidak tetapkan 2 ke x". Perhatikan bahwa parens tidak diperlukan, tetapi saya suka agar mudah dibaca. Anda juga dapat mengaitkannya jika memiliki sesuatu yang lebih rumit:
Meskipun pada titik tertentu, itu agak terlalu jauh.
Perhatikan bahwa Anda dapat menggunakan if ... else dalam ekspresi apa pun. Sebagai contoh:
Di sini func1 akan dipanggil jika y adalah 1 dan func2, jika tidak. Dalam kedua kasus fungsi yang sesuai akan dipanggil dengan argumen arg1 dan arg2.
Secara analog, yang berikut ini juga valid:
dimana class1 dan class2 adalah dua kelas.
sumber
x = ((y == 1) ? 3 : 2)
lebih masuk akal bagi sayaDoctest : dokumentasi dan pengujian unit pada saat bersamaan.
Contoh diekstrak dari dokumentasi Python:
sumber
locals()
kemudian di Anda doctest lakukanlocals().update(setUp())
= DPemformatan yang diberi nama
% -formatting mengambil kamus (juga berlaku validasi% i /% s dll.)
Dan karena penduduk lokal () juga merupakan kamus, Anda dapat dengan mudah menyampaikannya sebagai dict dan memiliki% -substitions dari variabel lokal Anda. Saya pikir ini disukai, tetapi menyederhanakan hal-hal ..
Pemformatan Gaya Baru
sumber
Untuk menambahkan lebih banyak modul python (terutama yang pihak ke-3), kebanyakan orang tampaknya menggunakan variabel lingkungan PYTHONPATH atau mereka menambahkan symlink atau direktori di direktori paket-situs mereka. Cara lain, adalah dengan menggunakan file * .pth. Berikut penjelasan resmi python doc:
sumber
Klausa pengecualian lain :
Penggunaan klausa lain lebih baik daripada menambahkan kode tambahan ke klausa coba karena menghindari secara tidak sengaja menangkap pengecualian yang tidak dimunculkan oleh kode yang dilindungi oleh percobaan ... kecuali pernyataan.
Lihat http://docs.python.org/tut/node10.html
sumber
Memunculkan kembali pengecualian :
Pernyataan 'naikkan' tanpa argumen di dalam penangan kesalahan memberitahu Python untuk menaikkan kembali pengecualian dengan traceback asli yang utuh , memungkinkan Anda untuk mengatakan "oh, maaf, maaf, saya tidak bermaksud menangkap itu, maaf, maaf. "
Jika Anda ingin mencetak, menyimpan, atau mengutak-atik traceback asli, Anda bisa mendapatkannya dengan sys.exc_info (), dan mencetaknya seperti yang dilakukan Python dilakukan dengan modul 'traceback'.
sumber
raise e
, yang tidak mempertahankan traceback aslinya.exc_info = sys.exc_info(); raise exc_info[0], exc_info[1], exc_info[2]
setara dengan ini, tetapi Anda dapat mengubah nilai-nilai itu di sekitar (misalnya, mengubah jenis pengecualian atau pesan)Pesan utama :)
Di-cyphered :
sumber
print s.translate("".join(chr(64<i<91 and 65+(i-52)%26 or 96<i<123 and 97+(i-84)%26 or i) for i in range(256)))
dan terlihat jauh lebih baik sekarang !! :-DPenyelesaian Tab Interpreter Interaktif
Anda juga harus menetapkan variabel lingkungan PYTHONSTARTUP.
sumber
easy_install ipdb
- maka Anda dapat menggunakanimport ipdb; ipdb.set_trace()
readline.parse_and_bind ("bind ^I rl_complete")
Pemahaman daftar bersarang dan ekspresi generator:
Ini dapat menggantikan potongan besar kode nested-loop.
sumber
for
pernyataan harus ditulis dalam urutan yang Anda harapkan ditulis dalam standar untuk-loop, dari luar ke dalam.for
s danif
s denganyield x
di dalamnya. Untuk mengonversinya menjadi ekspresi generator, pindahkanx
dulu, hapus semua titik dua (danyield
), dan mengelilingi semuanya dalam tanda kurung. Untuk membuat daftar pemahaman sebagai gantinya, ganti parens luar dengan tanda kurung.Overloading operator untuk
set
builtin:Lebih detail dari referensi pustaka standar: Set Type
sumber