Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

conflit entre modules ? surcharge de sqrt

5 réponses
Avatar
Fabrice
Bonjour,

je suis débutant en Python mais pas en programmation (j'ai fait du C++)
J'aimerai calculer la racine carré d'un réel dans un programme utilisant
aussi des complexes.

je fais :

from math import *
from cmath import *
if sqrt(2)<3:
print('oui')

et j'ai une erreur :
TypeError: unorderable types: complex() < int()

pourtant sqrt(2) n'est pas un complexe ! Pourquoi Python me renvoie un
complexe dans ce cas ?
Lors de la surcharge de la fonction, Python n'est pas capable de choisir
la bonne version ?

Merci,
Fabrice.

---
L'absence de virus dans ce courrier électronique a été vérifiée par le logiciel antivirus Avast.
https://www.avast.com/antivirus

5 réponses

Avatar
Benoit Izac
Bonjour,
Le 14/01/2018 à 11:18, Fabrice a écrit dans le message
<5a5b2e78$0$4843$ :
je suis débutant en Python mais pas en programmation (j'ai fait du C++)
J'aimerai calculer la racine carré d'un réel dans un programme
utilisant aussi des complexes.
je fais :
from math import *
from cmath import *
if sqrt(2)<3:
print('oui')
et j'ai une erreur :
TypeError: unorderable types: complex() < int()
pourtant sqrt(2) n'est pas un complexe ! Pourquoi Python me renvoie un
complexe dans ce cas ?

Parce que sqrt() provient du module cmath.
Lors de la surcharge de la fonction, Python n'est pas capable de
choisir la bonne version ?

Il n'y a pas de surcharge de fonction comme en C++ ; la fonction sqrt()
du module math n'est plus accessible car remplacée par celle de cmath.
Trois solutions :
import math
import cmath
if math.sqrt(2) < 3:
print('oui')
--------------------------------------------------
from math import sqrt
from cmath import sqrt as csqrt
if sqrt(2) < 3:
print('oui')
--------------------------------------------------
if 2**0.5 < 3:
print('oui')
--
Benoit Izac
Avatar
Pierre Maurette
Fabrice :
Bonjour,
je suis débutant en Python mais pas en programmation (j'ai fait du C++)
J'aimerai calculer la racine carré d'un réel dans un programme utilisant
aussi des complexes.
je fais :
from math import *
from cmath import *
if sqrt(2)<3:
print('oui')
et j'ai une erreur :
TypeError: unorderable types: complex() < int()
pourtant sqrt(2) n'est pas un complexe ! Pourquoi Python me renvoie un
complexe dans ce cas ?
Lors de la surcharge de la fonction, Python n'est pas capable de choisir la
bonne version ?

Le problème est dans vos import *
sqrt est dans math et dans cmath. (Je suppose que) les import de cmath,
ultérieurs, masquent ceux de math. sqrt(2) devient cmath.sqrt(2) qui
est valide et renvoie un complexe.
L'import * est généralement déconseillé. Je réserve cette notation à
des bibliothèques personnelles pour lesquelles je veille à ce que les
noms importés soient qualifiés (improbables). Ce qui vous arrive est en
quelque sorte une chance. Si vous souhaitez alléger votre code, vous
pourriez :
from math import *
import cmath as c
Mais il me semble que même seul la première ligne peut poser
problèmes. Donc:
import math as M
import cmath as C
Mais je préfère me contenter de
import math
import cmath
et de qualifier les appels. Avec la complétion c'est même plus souple.
--
Pierre Maurette
Avatar
Fabrice
Le 14/01/2018 à 11:46, Benoit Izac a écrit :
Il n'y a pas de surcharge de fonction comme en C++ ; la fonction sqrt()
du module math n'est plus accessible car remplacée par celle de cmath.

Ah ! J'ai cru qu'il y en avait car les opérateurs sont surchargés.
Merci pour votre réponse rapide et très pédagogique.
Fabrice.
---
L'absence de virus dans ce courrier électronique a été vérifiée par le logiciel antivirus Avast.
https://www.avast.com/antivirus
Avatar
Fabrice
Merci Pierre pour votre réponse argumentée et pédagogique.
---
L'absence de virus dans ce courrier électronique a été vérifiée par le logiciel antivirus Avast.
https://www.avast.com/antivirus
Avatar
Benoit Izac
Bonjour,
Le 14/01/2018 à 12:06, Fabrice a écrit dans le message
<5a5b39c0$0$3842$ :
Il n'y a pas de surcharge de fonction comme en C++ ; la fonction sqrt()
du module math n'est plus accessible car remplacée par celle de cmath.

Ah ! J'ai cru qu'il y en avait car les opérateurs sont surchargés.

Il ne sont pas surchargés, ils se comportent différemment selon le type
des objets sur lesquels ils s'appliquent. Tu peux faire la même chose
avec une fonction :
def f(arg):
if isintance(arg, int):
# faire quelque chose avec cet int
elif isinstance(arg, float):
# faire quelque chose avec ce float
elif isinstance(arg, complex):
# faire quelque chose avec ce complex
else:
# faire quelque chose
f() se comporte différemment selon le type de l'argument mais,
contrairement à C++, il n'y a qu'une fonction f(), ce n'est donc pas un
mécanisme de surcharge.
--
Benoit Izac