Garis bawahi dengan Python

Saya baru-baru ini memiliki kesempatan untuk mendengarkan ceramah tentang praktik pemrograman C yang baik dan buruk. Di dalamnya, khususnya, topik decoding kode program yang tampak lucu ( emotikon dalam C) tersentuh. Kemudian ada perdebatan tentang kelayakan menggunakan kode membingungkan tersebut untuk menguji keterampilan calon untuk posisi programmer selama wawancara. Perselisihan tidak menghasilkan konsensus.

Pertimbangkan pertanyaan yang mungkin tentang emotikon selama wawancara untuk posisi yang menyiratkan pengetahuan tentang bahasa pemrograman Python.

Tantangan


Ada dua ungkapan:

  1. _+_ 
  2.  _|_ 

Manakah dari dua ungkapan ini yang lebih cenderung menyebabkan kesalahan dan mengapa?

Catatan Ekspresi
Perlu dicatat bahwa ekspresi ini kurang dibaca, ekspresi seperti itu tidak disarankan untuk digunakan dalam kode kerja, tetapi hanya dapat digunakan sebagai teka-teki.
Anda juga harus ingat bahwa emotikon dalam tugas tidak ditulis secara python (tidak mematuhi standar gaya PEP 8 ).

Solusi


Dalam Python, garis bawah bukanlah kata kunci , oleh karena itu, secara umum, dapat digunakan untuk menetapkan nilai tertentu ke variabel.

Tugas dikurangi menjadi pertimbangan kasus kesalahan selama penambahan dan dengan "bitwise atau" (untuk singkatnya, hanya "atau") satu variabel. Yaitu untuk mencari tipe built-in Python (kelas) yang satu operasi diimplementasikan dan untuk mencari tipe built-in di mana operasi lain diimplementasikan.

Di konsol Python, mudah untuk memverifikasi bahwa ada nilai garis bawah sehingga:

  1. Tidak ada kesalahan dalam mengevaluasi setiap ekspresi
     >>> _ = 10 >>> _+_ 20 >>> _ = 10 >>> _|_ 10 
  2. Tidak ada kesalahan dalam mengevaluasi ekspresi pertama
     >>> _ = '10' >>> _+_ '1010' >>> _ = '10' >>> _|_ Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for |: 'str' and 'str' 
  3. Tidak ada kesalahan dalam menghitung ekspresi kedua
     >>> _ = {1, 0} >>> _+_ Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for +: 'set' and 'set' >>> _|_ {0, 1} 
  4. Ada kesalahan dalam perhitungan setiap ekspresi
     >>> _ = {1: 0} >>> _+_ Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for +: 'dict' and 'dict' >>> _|_ Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for |: 'dict' and 'dict' 

Keajaiban Python adalah bahwa implementasi penambahan, dan "atau", dan operator lain dalam apa yang disebut "metode ajaib" yang dijelaskan untuk kelas yang diperlukan.
Sebagai tambahan, ini adalah metode

 __add__ 

Untuk "atau," ini adalah metode

 __or__ 

Nama setiap metode ajaib berisi garis bawah, dua di awal dan di akhir kata yang sesuai.

Menemukan informasi tentang kelas bawaan Python.
Anda dapat mencoba menemukan informasi yang diperlukan dalam dokumentasi untuk tipe bawaan di situs web resmi Python: https://docs.python.org/3.7/library/stdtypes.html .
Anda dapat mengeksekusi di terminal Python

 >>> import builtins >>> help(builtins) 

Saya lebih suka menggunakan dokumentasi versi Python yang saya gunakan saat ini, merujuk pada antarmuka web modul pydoc.

Untuk melakukan ini, pada prompt perintah, masukkan, misalnya:

 python3 -m pydoc -p 3344 

dan buka modul dokumentasi peramban http: // localhost: 3344 / builtins.html .

Kelas bawaan yang menerapkan metode kami:
__add____atau__
boolbool
bytearrayfrozenset
byteint
kompleksdiatur
mengapung
int
daftar
str
tuple

Sembilan kelas built-in mengimplementasikan operasi penjumlahan dan empat mengimplementasikan "atau".
Selain itu, Anda dapat mencoba untuk berspekulasi tentang frekuensi penggunaan kelas dasar dalam proyek nyata, tentang kelas non-dasar dan penerapan metode di atas untuk mereka. Ini kemungkinan akan dihargai secara positif selama wawancara.

Jawaban 1.
Ekspresi kedua akan sering menyebabkan kesalahan.



Kemungkinan pertanyaan tambahan tentang garis bawah wawancara


Apa peran garis bawah dalam penamaan objek?


Jawaban 2.
Garis bawah dapat digunakan untuk memisahkan kata-kata dengan gaya penamaan entitas yang berbeda dengan Python :

  1. Saat memberi nama dalam huruf kecil

     lower_case_with_underscores 
  2. Saat memberi nama dalam huruf besar

     UPPER_CASE_WITH_UNDERSCORES 

Beberapa nama terbatas pada garis bawah dicadangkan :

  1. Dengan garis bawah pada awal nama, itu tidak diimpor selama impor umum

     from module import * 
  2. Dengan dua garis bawah pada kedua sisi nama dianggap sistemik, tidak disarankan untuk menggunakan nama tersebut untuk tujuan lain
  3. Dengan dua garis bawah pada awal nama, itu dianggap pribadi (bukan publik) untuk kelas


Apa peran garis bawah tunggal?


Jawaban 3.
Dalam juru bahasa, jika garis bawah tidak secara eksplisit digunakan sebagai variabel, itu akan menyimpan hasil dari tindakan bebas kesalahan terakhir yang ditampilkan di layar.

 $ python3 Python 3.6.8 (default, Feb 14 2019, 22:09:48) [GCC 7.4.0] on cygwin Type "help", "copyright", "credits" or "license" for more information. >>> _ Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name '_' is not defined >>> 2 * 5 10 >>> _ 10 >>> _ = 1 >>> _ 1 >>> 2 * 5 10 >>> _ 1 

Ini karena sys.stdout lolos dengan displayhook . Ambil contoh dari dokumentasi resmi :

 def displayhook(value): if value is None: return # Set '_' to None to avoid recursion builtins._ = None text = repr(value) try: sys.stdout.write(text) except UnicodeEncodeError: bytes = text.encode(sys.stdout.encoding, 'backslashreplace') if hasattr(sys.stdout, 'buffer'): sys.stdout.buffer.write(bytes) else: text = bytes.decode(sys.stdout.encoding, 'strict') sys.stdout.write(text) sys.stdout.write("\n") builtins._ = value 

Selain itu, satu garis bawah biasanya digunakan untuk kenyamanan internalisasi .

Source: https://habr.com/ru/post/id459672/


All Articles