Maison  >  Article  >  développement back-end  >  Venez défier ces dix questions Python, y parviendrez-vous ?

Venez défier ces dix questions Python, y parviendrez-vous ?

WBOY
WBOYavant
2023-05-02 11:16:061008parcourir

Bonjour, je suis frère Zheng. Python est facile à démarrer, mais difficile à maîtriser Même pour les ingénieurs expérimentés, certains phénomènes sont contre-intuitifs. Les 10 questions suivantes sont très intéressantes et stimulantes. Les résultats peuvent vous dérouter. voyez combien de réponses correctes vous pouvez obtenir ?

Les questions sont données en premier et les réponses sont données en dernier. Il est recommandé de prendre d'abord un morceau de papier, d'écrire vos réponses, puis de les vérifier à la fin.

Veuillez écrire la sortie du code suivant :

1. Lazy Python

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

2. Arrondi

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

3 Type et objet

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

4.

6. Somme

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

7. Attribut inattendu

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)

8. Sortir une chaîne qui est un multiple d'un nombre négatif

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

Réponse. et explication

Les résultats suivants ont été vérifiés dans la version Python 3.8.5.

1. Lazy Python

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

Le résultat correct est 0:

Ce n'est pas difficile, car la définition de la fonction Python est en fait une instruction exécutable, et la fonction n'existe pas avant d'être appelée. les variables soient liées.

Dans l'exemple ci-dessus, lors de la définition de la fonction, Python autorise les références à des classes ou des fonctions qui n'ont pas encore été définies. Cependant, lors de l'exécution, A est déjà de classe int, ce qui signifie que la méthode fonction renverra une instance int nouvellement créée, dont la valeur par défaut est 0.

S'il n'y a pas de A = int, le résultat est :来挑战下这十个 Python 问题,你会吗?

2

.

Arrondi

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

Le résultat correct est 4 2 2. Vous devez sentir que le tour final (2,5) == 2 est un C'est un peu contraire aux règles mathématiques. Cela est dû au fait que la méthode round de Python implémente l'arrondi du banquier [1], où toutes les demi-valeurs sont arrondies au nombre pair le plus proche. 来挑战下这十个 Python 问题,你会吗?

3

.type et object
max(-0.0, 0.0)

sont tous deux True, je me demande si object et true sont la même chose ?

En Python, tout est un objet, donc toute vérification d'instance sur l'objet retournera True.

>>> x = (1 << 53) + 1
>>> x + 1.0 > x
type représente la métaclasse utilisée pour construire tous les types Python. Par conséquent, tous les types : int, str, object sont des instances de type class, qui est également un objet comme tous les objets en python. Mais le type est le seul objet en Python qui soit une instance de lui-même.
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

Les résultats de tout et de tous sont un peu inattendus lorsque l'argument est une liste vide. Mais après avoir compris sa logique de vérification, cela a du sens :

Les opérateurs logiques en Python sont paresseux. L'algorithme de any consiste à trouver l'élément qui apparaît pour la première fois comme vrai. S'il n'est pas trouvé, il renvoie False. La séquence est vide, donc aucun élément ne peut être vrai, donc any([]) renvoie False.

De même, l'algorithme all recherche le premier élément faux. S'il n'est pas trouvé, il renvoie True. Puisqu'il n'y a pas de faux éléments dans la séquence vide, all([]) renvoie True. un peu vide ?

5

.

Priorité des fonctions internes de classe

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

Le résultat correct est : 16 :

L'ordre de recherche des fonctions d'objet est : niveau d'instance > niveau de classe > niveau de classe parent, ce qui précède le code est lié à l'initialisation. La fonction est au niveau de l'instance et la fonction définie à l'intérieur de la classe est au niveau de la classe.

Mais les fonctions magiques entourées de doubles traits de soulignement ne relèvent pas de cette règle, ce qui signifie que Python recherchera d'abord les fonctions magiques au niveau de la classe.

Si vous supprimez le double trait de soulignement, le résultat est 26 : 来挑战下这十个 Python 问题,你会吗?

6

.

Sum

isinstance(Anything, object) #=> True。

Pour comprendre ce qui se passe ici, nous devons vérifier la signature de la fonction somme : 来挑战下这十个 Python 问题,你会吗?

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

sum from Additionne les éléments de l'itérable en commençant de gauche à droite et renvoie le total. itérable est généralement un nombre et la valeur de départ ne peut pas être une chaîne.

Dans tous les cas ci-dessus, la chaîne vide est traitée comme une séquence vide, donc sum renverra simplement l'argument de départ comme résultat total. Dans le premier cas, la valeur par défaut est zéro, dans les deuxième et troisième cas, cela signifie la liste vide et le dictionnaire transmis comme arguments de départ.

7

.

Attribut inattendu

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

Le code ci-dessus a un attribut imag, mais nous ne l'avons pas défini du tout et aucune erreur n'a été signalée lors de l'exécution ?

C'est parce que tous les types numériques sont présents. Python (int , real, float) hérite tous de la classe d'objets de base, ils prennent tous en charge les attributs real et imag et renvoient respectivement la partie réelle et la partie imaginaire. Cela inclut également Infinity et 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。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer