Bonjour,

j'ai une fonction qui doit me retourner la puissance d'un nombre et je dois utiliser les listes avec compréhension.
Le test sur les paramètres n'était pas à faire mais j'aimerais comprendre.

C'est le résultat de ma fonction sans prendre le test des paramètres
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
def my_pow(m,b):
  if type(m) != int or type(b) != float:
    return None
  return  [b**m for m in range(0,m)]
 
print("SI type(m) != int OU type(b) != float ALORS on retourne None")
print(" - Pour type(m) != int   => ",my_pow(3.0,4))
print(" - Pour type(b) != float => ",my_pow(3,4))
print("SINON on calcule  b**m pour les valeurs du range")
print(my_pow(3,4.0))
et j'obtiens bien ce qu'il faut :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
SI type(m) != int OU type(b) != float ALORS on retourne None
 - Pour type(m) != int   =>  None
 - Pour type(b) != float =>  None
SINON on calcule  b**m pour les valeurs du range
[1.0, 4.0, 16.0]
j'ai essayé en regardant la fonction ternaire d'inclure les tests mais j'ai plusieurs problèmes et j'aimerais comprendre pourquoi.
J'ai écrit :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
def my_pow2(m,b):
  return  [b**m if isinstance(m, int) and isinstance(b, float) else None for m in range(0,m)]
je ne comprends pas cette erreur quand je fais :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
print("SI type(m) != int OU type(b) != float ALORS on retourne None")
print(" - Pour type(m) != int   => ",my_pow2(3.0,4))
 
Traceback (most recent call last):
  File "main.py", line 19, in <module>
    print(" - Pour type(m) != int   => ",my_pow2(3.0,4))
  File "main.py", line 16, in my_pow2
    return  [b**m if isinstance(m, int) and isinstance(b, float) else None for m in range(0,m)]
TypeError: 'float' object cannot be interpreted as an integer
alors que quand je fais l'appel
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
print("SI type(m) != int OU type(b) != float ALORS on retourne None")
print(" - Pour type(b) != float => ",my_pow2(3,4))
il retourne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
SI type(m) != int OU type(b) != float ALORS on retourne None
 - Pour type(b) != float =>  [None, None, None]
  1. Pourquoi il ne gère pas isinstance du int - paramètre m - mais celui du float - paramètre b - oui ?
  2. Comment faire pour n'avoir qu'un retour et non une liste [None, None, None] ?


Par avance merci pour toutes vos explications, liens qui pourraient me guider.