Liste en compréhension avec condition IF ELSE
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:
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:
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:
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:
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:
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:
1 2
| SI type(m) != int OU type(b) != float ALORS on retourne None
- Pour type(b) != float => [None, None, None] |
- Pourquoi il ne gère pas isinstance du int - paramètre m - mais celui du float - paramètre b - oui ?
- 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.
Un grand merci à vous tous
Tout d'abord mille excuses de ne pas vous avoir répondu plus tôt, un peu obligée d'avancer dans la formation.
Effectivement c'était une contrainte de l'exercice d'avoir b comme float ainsi que le retour None.
Merci encore pour ces aides supplémentaires, il faudra que je refasse plus d'exercices