Cover

Régles du jeu¶

  • 🥊 2 équipes

  • ❔ 10 questions - 5 questions par équipe

  • 🥇 2 points par question : 1 point pour la bonne réponse et 1 point pour l'explication

❔ Question N°1 🎃¶

Que contient la variable var ?

var = [3, 4] * 3

🕸️ Réponse A :¶

[9, 12]

🕷️ Réponse B :¶

[3, 4, 3, 4, 3, 4]

👻 Réponse C :¶

[3, 4], [3, 4], [3, 4]

🏚️ Réponse D :¶

[[3, 4], [3, 4], [3, 4]]

✅ Réponse B :¶

[3, 4, 3, 4, 3, 4]

La multiplication d'une liste par un nombre en Python duplique les éléments de la liste. Par contre, les tableaux Numpy (Numpy ndarrays) ont un comportement plus classique :

import numpy as np

var = np.array([3, 4])
print(var*3)

>>> [ 9 12]

📚 Ressources :¶

  • Stackoverflow - How to multiply individual elements of a list with a number?

  • Numpy - Broadcasting

❔ Question N°2 🎃¶

Que contient la variable var_1 ?

var_1 = [[3, 4, 5]]
var_2 = var_1[:]
var_2[0].append(6)

🕸️ Réponse A :¶

[[3, 4, 5, 6]]

🕷️ Réponse B :¶

[[3, 4, 5]]

👻 Réponse C :¶

[[3, 4, 5], 6]

🏚️ Réponse D :¶

[3, 4, 5, 6]

✅ Réponse A :¶

[[3, 4, 5, 6]]

La copie réalisée à l'aide du code var_1[:] est une copie superficielle. Pour effectuer une copie récursive, il faut utiliser la fonction deepcopy() du module copy de la bibliothèque standard.

📚 Ressources :¶

  • Python - Module copy

❔ Question N°3 🎃¶

Que renvoie le code Python suivant ?

print(
    (1==1) in [1],
    1 <= 0 <= 1,
    1 <= (0 <= 1)
)

🕸️ Réponse A :¶

True True True

🕷️ Réponse B :¶

True False True

👻 Réponse C :¶

True False False

🏚️ Réponse D :¶

False True True

✅ Réponse B :¶

True False True

Pour le code print((1==1) in [1]), la condition 1==1 est vraie donc on a print(True in [1]). Comme le booléen True est équivalent à 1, la première ligne renvoie True.

Le code print(1 <= 0 <= 1) est équivalent à print(1 <= 0 and 0 <= 1) donc à print(False and True). La seconde ligne renvoie donc False.

Pour le code print(1 <= (0 <= 1)), la condition 0 <= 1 est vraie donc on a print(1 <= True). Comme le booléen True est équivalent à 1, la troisième ligne renvoie True.

📚 Ressources :¶

  • Python - Comparaisons

  • What the f*ck Python!

❔ Question N°4 🎃¶

Que contient la variable dico ?

dico = {}
dico[True] = "var_1"
dico[1] = "var_2"
dico[1.0] = "var_3"

🕸️ Réponse A :¶

{True: 'var_1', 1: 'var_2', 1.0: 'var_3'}

🕷️ Réponse B :¶

{True: 'var_1', 1: 'var_2'}

👻 Réponse C :¶

{1.0: 'var_3'}

🏚️ Réponse D :¶

{True: 'var_3'}

✅ Réponse D :¶

{True: 'var_3'}

Les dictionnaires en Python utilisent une fonction de hashage pour gérer les clés. Comme True, 1 et 1.0 ont le même hash, il s'agit donc de la même clé de dictionnaire.

hash(True)==hash(1)==hash(1.0)

>>> True

La première clé du dictionnaire est enregistrée avec son hash. Par contre, les valeurs sont toutes enregistrées et elle écrase la valeur précédente donc c'est la dernière valeur qui est conservée.

📚 Ressources :¶

  • Python - Hash

  • What the f*ck Python!

❔ Question N°5 🎃¶

Que renvoie le code Python suivant ?

print(
    all([]),
    all([[]]),
    all([[[]]]),
    all([[[[]]]]),
)

🕸️ Réponse A :¶

True True True True

🕷️ Réponse B :¶

False False False False

👻 Réponse C :¶

True False True True

🏚️ Réponse D :¶

False True False True

✅ Réponse C :¶

True False True True

La fonction all() est implémentée de la façon suivante en Python :

def all(iterable):
    for element in iterable:
        if not element:
            return False
    return True

La liste vide [] renvoie True car il n'y a pas d'élèments dans l'itérable. La liste 2 [[]] contient un élèment mais il s'agit de la liste vide [] qui est considérée comme False. Pour les listes 3 et 4, elles contiennent des listes qui ne sont pas vides.

📚 Ressources :¶

  • Python - All
  • What the f*ck Python!

❔ Question N°6 🎃¶

Que renvoie le code Python suivant ?

a = "".join(["s", "a", "l", "u", "t"])
b = "s" + "a" + "l" + "u" + "t"
c = 'salut'
print(a is b, a is c, b is c)

🕸️ Réponse A :¶

True True True

🕷️ Réponse B :¶

False False False

👻 Réponse C :¶

False False True

🏚️ Réponse D :¶

False True True

✅ Réponse C :¶

False False True

L'interpréteur Python arrive à détecter que les chaines de caractères b et c sont identiques et la même adresse mémoire est allouée. Pour la variable a, la méthode join() est appelée plus tard par l'interpréteur et donc une autre adresse mémoire est allouée.

📚 Ressources :¶

  • Python - Intern

  • What the f*ck Python!

❔ Question N°7 🎃¶

Que renvoie le code Python suivant ?

print(
    0 == False,
    0+0j == False,
    0.0000000000000000000000000000000001 == False,
    9e-500 == False,
)

🕸️ Réponse A :¶

True True True True

🕷️ Réponse B :¶

False False False False

👻 Réponse C :¶

True True True False

🏚️ Réponse D :¶

True True False True

✅ Réponse D :¶

True True False True

Le nombre zéro sous forme d'un entier, d'un nombre complexe ou d'un nombre à virgule flottante est assimilé au booléen False. Etant donné la précision des nombres à virgule flottante, les nombres trop petits sont assimilés à 0.

📚 Ressources :¶

  • Python - Booléens

❔ Question N°8 🎃¶

Comment expliquer ce comportement de Python ?

value = 10
valuе = None
valuе= 1010
print(value)

>>> 10

🕸️ Réponse A :¶

Dans certains cas, les espaces dans les variables sont pris en compte dans le nom de la variable

🕷️ Réponse B :¶

Le nom des variables semble être le même mais en réalité ce n'est pas le cas

👻 Réponse C :¶

Comme 1010 en binaire correspond à 10 en décimal, il n'y a pas de modification de la valeur

🏚️ Réponse D :¶

Le fait de réaffecter la variable à None ne modifie pas la valeur de la variable

✅ Réponse B :¶

Le nom des variables semble être le même mais en réalité ce n'est pas le cas

Le caractère e (latin) et le caractère е (cyrillic) sont affichés de la même façon donc les deux variables ont bien des noms différents.

📚 Ressources :¶

  • Python - ord()

  • What the f*ck Python!

❔ Question N°9 🎃¶

Que renvoie le code Python suivant ?

def t(a,b):
    return (b,a)[a<b]
print(t(5, 8), t(8, 5))

🕸️ Réponse A :¶

5 5

🕷️ Réponse B :¶

8 5

👻 Réponse C :¶

8 8

🏚️ Réponse D :¶

5 8

✅ Réponse A :¶

5 5

La fonction renvoie le minimum des deux valeurs a et b. Le booléen de la condition a<b est transformé en indice de position dans le tuple (b,a).

📚 Ressources :¶

  • Python - n-uplets et séquences

❔ Question N°10 🎃¶

Que renvoie le code Python suivant ?

print(
    re.search(
        '^#?([a-f0-9]{6}|[a-f0-9]{3})$',
        '12f1'
    )
)

🕸️ Réponse A :¶

<re.Match object; span=(0, 3), match='12f'>

🕷️ Réponse B :¶

<re.Match object; span=(0, 4), match='12f1'>

👻 Réponse C :¶

None

🏚️ Réponse D :¶

<re.Match object; span=(0, 2), match='12'>

✅ Réponse : C¶

None

L'expression régulière détecte une chaine hexadécimale sur 3 ou 6 caractères pour définir une couleur par exemple.

📚 Ressources :¶

  • Python - Guide des expressions régulières

🎃 Merci pour votre participation active à ce meetup 👻¶