Pertanyaan Fitur tersembunyi dari Python [tertutup]


Apa saja fitur yang kurang diketahui tetapi berguna dari bahasa pemrograman Python?

  • Coba batasi jawaban atas inti Python.
  • Satu fitur per jawaban.
  • Berikan contoh dan deskripsi singkat tentang fitur, bukan hanya tautan ke dokumentasi.
  • Label fitur menggunakan judul sebagai baris pertama.

Tautan cepat ke jawaban:


1420


asal


Jawaban:


Operator perbandingan Chaining:

>>> x = 5
>>> 1 < x < 10
True
>>> 10 < x < 20 
False
>>> x < 10 < x*10 < 100
True
>>> 10 > x <= 9
True
>>> 5 == x > 4
True

Jika Anda berpikir itu lakukan 1 < x, yang keluar sebagai True, lalu membandingkan True < 10, yang juga True, maka tidak, itu benar-benar bukan apa yang terjadi (lihat contoh terakhir.) Ini benar-benar diterjemahkan ke dalam 1 < x and x < 10, dan x < 10 and 10 < x * 10 and x*10 < 100, tetapi dengan lebih sedikit mengetik dan setiap istilah hanya dievaluasi sekali.


741



Dapatkan pohon regex python regex untuk debug regex Anda.

Ekspresi reguler adalah fitur hebat dari python, tetapi debugging mereka dapat menyulitkan, dan itu terlalu mudah untuk mendapatkan regex yang salah.

Untungnya, python dapat mencetak pohon parse regex, dengan melewati bendera yang tidak terdokumentasi, eksperimental, dan tersembunyi re.DEBUG (sebenarnya, 128) untuk re.compile.

>>> re.compile("^\[font(?:=(?P<size>[-+][0-9]{1,2}))?\](.*?)[/font]",
    re.DEBUG)
at at_beginning
literal 91
literal 102
literal 111
literal 110
literal 116
max_repeat 0 1
  subpattern None
    literal 61
    subpattern 1
      in
        literal 45
        literal 43
      max_repeat 1 2
        in
          range (48, 57)
literal 93
subpattern 2
  min_repeat 0 65535
    any None
in
  literal 47
  literal 102
  literal 111
  literal 110
  literal 116

Setelah Anda memahami sintaksnya, Anda dapat menemukan kesalahan Anda. Di sana kita dapat melihat bahwa saya lupa untuk melarikan diri [] di [/font].

Tentu saja Anda dapat menggabungkannya dengan bendera apa pun yang Anda inginkan, seperti komentar regexe:

>>> re.compile("""
 ^              # start of a line
 \[font         # the font tag
 (?:=(?P<size>  # optional [font=+size]
 [-+][0-9]{1,2} # size specification
 ))?
 \]             # end of tag
 (.*?)          # text between the tags
 \[/font\]      # end of the tag
 """, re.DEBUG|re.VERBOSE|re.DOTALL)

512



menghitung

Bungkus iterable dengan enumerate dan itu akan menghasilkan item beserta indeksnya.

Sebagai contoh:


>>> a = ['a', 'b', 'c', 'd', 'e']
>>> for index, item in enumerate(a): print index, item
...
0 a
1 b
2 c
3 d
4 e
>>>

Referensi:


460



Menciptakan objek generator

Jika Anda menulis

x=(n for n in foo if bar(n))

Anda bisa mengeluarkan generator dan menetapkannya ke x. Sekarang itu berarti Anda bisa melakukannya

for n in x:

Keuntungan dari ini adalah bahwa Anda tidak perlu penyimpanan antara, yang Anda perlukan jika Anda melakukannya

x = [n for n in foo if bar(n)]

Dalam beberapa kasus, hal ini dapat menyebabkan peningkatan yang signifikan.

Anda dapat menambahkan banyak pernyataan jika ke ujung generator, pada dasarnya mereplikasi nested for loop:

>>> n = ((a,b) for a in range(0,2) for b in range(4,6))
>>> for i in n:
...   print i 

(0, 4)
(0, 5)
(1, 4)
(1, 5)

419



iter () dapat mengambil argumen yang bisa dipanggil

Contohnya:

def seek_next_line(f):
    for c in iter(lambda: f.read(1),'\n'):
        pass

Itu iter(callable, until_value) fungsi panggilan berulang kali callable dan menghasilkan hasilnya sampai until_value dikembalikan.


353



Hati-hati dengan argumen default yang bisa berubah

>>> def foo(x=[]):
...     x.append(1)
...     print x
... 
>>> foo()
[1]
>>> foo()
[1, 1]
>>> foo()
[1, 1, 1]

Sebagai gantinya, Anda harus menggunakan nilai sentinel yang menunjukkan "tidak diberikan" dan ganti dengan yang dapat diubah yang Anda inginkan sebagai default:

>>> def foo(x=None):
...     if x is None:
...         x = []
...     x.append(1)
...     print x
>>> foo()
[1]
>>> foo()
[1]

339



Mengirim nilai ke fungsi generator. Misalnya memiliki fungsi ini:

def mygen():
    """Yield 5 until something else is passed back via send()"""
    a = 5
    while True:
        f = (yield a) #yield a and possibly get f in return
        if f is not None: 
            a = f  #store the new value

Kamu bisa:

>>> g = mygen()
>>> g.next()
5
>>> g.next()
5
>>> g.send(7)  #we send this back to the generator
7
>>> g.next() #now it will yield 7 until we send something else
7

317