Heim  >  Artikel  >  Backend-Entwicklung  >  Kommen Sie und stellen Sie diese zehn Python-Fragen. Werden Sie es schaffen?

Kommen Sie und stellen Sie diese zehn Python-Fragen. Werden Sie es schaffen?

WBOY
WBOYnach vorne
2023-05-02 11:16:061005Durchsuche

Hallo, ich bin Bruder Zheng. Der Einstieg in Python ist leicht, aber selbst für erfahrene Ingenieure sind die folgenden 10 Fragen sehr interessant und herausfordernd Sehen Sie, wie viele richtige Antworten Sie bekommen können?

Die Fragen werden zuerst gegeben und die Antworten werden zuletzt gegeben. Es wird empfohlen, zuerst ein Blatt Papier zu besorgen, Ihre Antworten aufzuschreiben und sie dann am Ende zu überprüfen.

Bitte schreiben Sie die Ausgabe des folgenden Codes:

Lazy Python

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

3. Typ und Objekt

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

5. Klasseninterne Funktionspriorität

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

6. Summe

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

7. Unerwartetes Attribut

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. Habe eine negative Zahl

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

10 gesehen und Erklärung

Die folgenden Ergebnisse wurden in der Python-Version 3.8.5 überprüft.

1. Lazy Python

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

Das korrekte Ergebnis ist 0:

Das ist nicht schwierig, da die Funktionsdefinition von Python tatsächlich eine ausführbare Anweisung ist und die Funktion nicht existiert, bevor sie aufgerufen wird Variablen gebunden werden.

Im obigen Beispiel erlaubt Python während der Funktionsdefinition Verweise auf Klassen oder Funktionen, die noch nicht definiert wurden. Während der Ausführung gehört A jedoch bereits zur Klasse int, was bedeutet, dass die Funktionsmethode eine neu erstellte int-Instanz zurückgibt, deren Standardwert 0 ist.

Wenn es kein A = int gibt, ist das Ergebnis:

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

2

.

Rundung

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

Das korrekte Ergebnis ist 4 2 2. Sie müssen das Gefühl haben, dass die letzte Runde (2,5) == 2 a ist Dies liegt daran, dass die Rundungsmethode von Python die Banker-Rundung [1] implementiert, bei der alle halben Werte auf die nächste gerade Zahl gerundet werden.

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

.

type und object
max(-0.0, 0.0)
sind beide True. Ich frage mich, ob Object und True dasselbe sind?

In Python ist alles ein Objekt, daher wird jede Instanzprüfung des Objekts True zurückgeben.

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

type stellt die Metaklasse dar, die zum Erstellen aller Python-Typen verwendet wird. Daher sind alle Typen: int, str, object Instanzen des Typs class, der wie alle Objekte in Python auch ein Objekt ist. Aber Typ ist das einzige Objekt in Python, das eine Instanz von sich selbst ist.
class A:
def function(self):
return A()
a = A()
A = int
print(a.function())
4

.

Empty boolean

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

Die Ergebnisse von „any and all“ sind etwas unerwartet, wenn das Argument eine leere Liste ist. Aber nachdem man die Prüflogik verstanden hat, macht es Sinn:

Logische Operatoren in Python sind faul. Der Algorithmus von any besteht darin, das Element zu finden, das zum ersten Mal als wahr erscheint Die Sequenz ist leer. Daher kann kein Element wahr sein, daher gibt any([]) False zurück.

In ähnlicher Weise sucht der all-Algorithmus nach dem ersten falschen Element. Wenn es nicht gefunden wird, gibt es „True“ zurück. Da es keine falschen Elemente in der leeren Sequenz gibt, gibt „all([])“ nicht das Konzept der Wahrheit zurück ein bisschen leer?5

.

Priorität der klasseninternen Funktionen

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

Das korrekte Ergebnis ist: 16:

Die Suchreihenfolge der Objektfunktionen ist: Instanzebene > Klassenebene > übergeordnete Klassenebene, wie oben Der Code wird bei der Initialisierung gebunden. Die Funktion befindet sich auf Instanzebene und die in der Klasse definierte Funktion befindet sich auf Klassenebene.

Aber in doppelte Unterstriche eingeschlossene magische Funktionen fallen nicht unter diese Regel, was bedeutet, dass Python zuerst nach magischen Funktionen auf Klassenebene sucht.

Wenn Sie den doppelten Unterstrich entfernen, ist das Ergebnis 26:

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

6

.

Sum

isinstance(Anything, object) #=> True。

Um herauszufinden, was hier vor sich geht, müssen wir die Signatur der Summenfunktion überprüfen:

>>> type(1)
<class 'int'>
>>> type(int)
<class 'type'>
>>> type(type)
<class 'type'>
>>> 
来挑战下这十个 Python 问题,你会吗? sum from Summiert die Elemente der Iteration von links nach rechts und gibt die Summe zurück. iterable ist im Allgemeinen eine Zahl und der Startwert darf keine Zeichenfolge sein.

In allen oben genannten Fällen wird die leere Zeichenfolge als leere Sequenz behandelt, sodass sum einfach das Startargument als Gesamtergebnis zurückgibt. Im ersten Fall ist es standardmäßig Null, im zweiten und dritten Fall bedeutet es die leere Liste und das leere Wörterbuch, die als Startargumente übergeben wurden. 7

.

Unerwartetes Attribut

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

Der obige Code hat ein imag-Attribut, aber wir haben es überhaupt nicht definiert und beim Ausführen wurde kein Fehler gemeldet?

Das liegt daran, dass alle numerischen Typen in Python (int, real, float) erbt alle von der Basisobjektklasse, unterstützt alle Real- und Imag-Attribute und gibt den Realteil bzw. den Imaginärteil zurück. Hierzu zählen auch Infinity und 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。

Das obige ist der detaillierte Inhalt vonKommen Sie und stellen Sie diese zehn Python-Fragen. Werden Sie es schaffen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:51cto.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen