Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Datang dan cabar sepuluh soalan Python ini, adakah anda akan melakukannya?

Datang dan cabar sepuluh soalan Python ini, adakah anda akan melakukannya?

WBOY
WBOYke hadapan
2023-05-02 11:16:061048semak imbas

Helo, saya Saudara Zheng mudah untuk dimulakan, tetapi sukar untuk dikuasai Walaupun untuk jurutera yang berpengalaman, beberapa fenomena adalah kontra-intuitif keliru, mari lihat berapa banyak jawapan yang betul yang anda boleh dapatkan?

Sila tulis output kod berikut:

1. Lazy Python

class A:
def function(self):
return A()
a = A()
A = int
print(a.function())

2
>>> round(7 / 2)
>>> round(3 / 2)
>>> round(5 / 2)

4. Nilai Boolean Kosong

>>> isinstance(type, object)
>>> isinstance(object, type)
>>> isinstance(object, object)
>>> isinstance(type, type)

5. Keutamaan fungsi dalaman kelas

>>> any([])
>>> all([])

6 >8. Keluarkan rentetan yang merupakan gandaan nombor negatif

class A:
answer = 42
def __init__(self):
self.answer = 21
self.__add__ = lambda x, y: x.answer + y
def __add__(self, y):
return self.answer - y
print(A() + 5)

9 telah melihat negatif 0

>>> sum("")
>>> sum("", [])
>>> sum("", {})

10 Melanggar peraturan matematik

>>> sum([
el.imag 
for el in [
0, 5, 10e9, float('inf'), float('nan')
]
])

Jawapan dan penjelasan

Keputusan berikut telah disahkan dalam versi Python 3.8.5.

1. Lazy Python

>>> "this is a very long string" * (-1)

Hasil yang betul ialah 0:

Ini tidak sukar, kerana definisi fungsi Python sebenarnya Boleh Dilaksana penyataan dan fungsi tidak wujud sebelum ia dipanggil, dan pembolehubah terikat hanya apabila ia benar-benar dipanggil.

Dalam contoh di atas, semasa definisi fungsi, Python membenarkan rujukan kepada kelas atau fungsi yang belum ditakrifkan. Walau bagaimanapun, semasa pelaksanaan, A sudah berada dalam kelas int, yang bermaksud bahawa kaedah fungsi akan mengembalikan contoh int yang baru dibuat, yang nilai lalainya ialah 0.

Jika tiada A = int, hasilnya ialah:

来挑战下这十个 Python 问题,你会吗?

2

.

Membulat

max(-0.0, 0.0)

The keputusan yang betul ialah 4 2 2, anda mesti merasakan bahawa pusingan akhir(2.5) == 2 adalah sedikit bertentangan dengan peraturan matematik Ini kerana kaedah pusingan Python melaksanakan pembundaran jurubank [1], di mana semua nilai separuh akan. dibundarkan kepada nombor genap terdekat.

3来挑战下这十个 Python 问题,你会吗?.

jenis dan objek

>>> x = (1 << 53) + 1
>>> x + 1.0 > x
kedua-duanya Benar Saya tertanya-tanya sama ada objek dan benar adalah perkara yang sama?

Dalam Python, semuanya adalah ialah objek, jadi sebarang semakan contoh pada objek akan mengembalikan Benar.

class A:
def function(self):
return A()
a = A()
A = int
print(a.function())

jenis mewakili metaclass yang digunakan untuk membina semua jenis Python. Oleh itu, semua jenis: int, str, objek adalah contoh kelas jenis, yang juga merupakan objek seperti semua objek dalam python. Tetapi jenis adalah satu-satunya objek dalam Python yang merupakan contoh sendiri.

>>> round(7/2)
4
>>> round(3/2)
2
>>> round(5/2)
2
4.

Nilai Boolean Kosong

>>> isinstance(type, object)
True
>>> isinstance(object, type)
True
>>> isinstance(object, object)
True
>>> isinstance(type, type)
True
>>>

Keputusan mana-mana dan semua agak tidak dijangka apabila hujah adalah senarai kosong. Tetapi selepas memahami logik semakannya, ia masuk akal:

Pengendali logik dalam Python malas untuk mencari elemen yang kelihatan benar untuk kali pertama. Jika ia tidak ditemui, ia akan mengembalikan False . Urutan itu kosong, jadi tiada unsur boleh benar, jadi mana-mana([]) mengembalikan Palsu.

Begitu juga, semua algoritma mencari elemen palsu yang pertama Jika ia tidak dijumpai, ia mengembalikan Benar Memandangkan tiada unsur palsu dalam urutan kosong, semua([]) mengembalikan Benar ini sedikit konsep kebenaran yang kosong?

5.

Keutamaan fungsi dalaman kelas

isinstance(Anything, object) #=> True。

Hasil yang betul ialah: 16:

Susunan carian fungsi objek ialah: peringkat contoh > peringkat kelas > peringkat kelas induk Dalam kod di atas, fungsi terikat semasa pemulaan ialah peringkat contoh, dan fungsi yang ditakrifkan di dalam kelas ialah peringkat kelas. Tetapi fungsi ajaib yang dibalut dengan garis bawah berganda tidak berada dalam peraturan ini, yang bermaksud bahawa Python akan terlebih dahulu mencari fungsi sihir peringkat kelas.

Jika anda mengalih keluar garis bawah berganda, hasilnya ialah 26:

来挑战下这十个 Python 问题,你会吗?

6

.

Jumlah

>>> type(1)
<class 'int'>
>>> type(int)
<class 'type'>
>>> type(type)
<class 'type'>
>>> 

Kepada mengetahui apa yang berlaku di sini, kita perlu menyemak tandatangan fungsi jumlah:

>>> any([])
False
>>> all([])
True
>>> any([True,False])
True
>>> all([True,False])
False
>>> 

jumlah menjumlahkan item yang boleh lelar bermula dari kiri ke kanan dan mengembalikan jumlahnya. iterable biasanya nombor, dan nilai permulaan tidak dibenarkan menjadi rentetan. 来挑战下这十个 Python 问题,你会吗?

Dalam semua kes di atas, rentetan kosong dianggap sebagai urutan kosong, jadi sum hanya akan mengembalikan argumen permulaan sebagai hasil keseluruhan. Dalam kes pertama ia lalai kepada sifar, untuk kes kedua dan ketiga ia bermakna senarai kosong dan kamus diluluskan sebagai hujah permulaan.

7.

Atribut tidak dijangka

class A:
answer = 42
def __init__(self):
self.answer = 21
self.__add__ = lambda x, y: x.answer + y
def __add__(self, y):
return self.answer - y
print(A() + 5)

Kod di atas mempunyai atribut imag, tetapi kami tidak mentakrifkannya sama sekali dan tiada ralat dilaporkan semasa menjalankan What's berterusan?

Ini kerana semua jenis berangka dalam Python (int, real, float) mewarisi daripada kelas objek asas, dan kesemuanya menyokong atribut real dan imag, yang masing-masing mengembalikan bahagian sebenar dan khayalan. Ini juga termasuk Infinity dan NaN.

8.输出负数倍的字符串

>>> "this is a very long string" * (-1)
''
>>>

正确的结果是 '',所有的负数倍的字符串,都当作 0 倍,返回 ''。

9.见过负数的 0.0

max(-0.0, 0.0)

为什么会这样?出现这种情况是由于两个原因。负零和零在 Python 中被视为相等。max 的逻辑是,如果多个最大值,返回遇到的第一个。因此 max 函数返回第一次出现的零,它恰好是负数。

10.违反数学规则

>>> x = (1 << 53) + 1
>>> x + 1.0 > x
False

正确的结果是 False,这违反了数学规则啊,为什么呢?

这种违反直觉的行为归咎于三件事:长算术、浮点精度限制和数值比较。

Python 可以支持非常大的整数,如果隐式超过限制则切换计算模式,但 Python 中的浮点精度是有限的。

2⁵³ + 1 = 9007199254740993

是不能完全表示为 Python 浮点数的最小整数。因此,为了执行加 1.0,Python 将 9007199254740993 转换为 float,将其四舍五入为 Python 可以表示的 9007199254740992.0,然后向其添加 1.0,但由于相同的表示限制,它将其设置回 9007199254740992.0:

>>> float(9007199254740993)
9007199254740992.0
>>> 9007199254740992.0 + 1.0
9007199254740992.0
>>>

此外 Python 在 float 与 int 比较时并不会抛出错误,也不会尝试将两个操作数转换为相同的类型。相反,他们比较实际的数值。因为 9007199254740992.0 比 9007199254740993 小,因此 Python 返回 False。

Atas ialah kandungan terperinci Datang dan cabar sepuluh soalan Python ini, adakah anda akan melakukannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:51cto.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam