cerhu > comp.lang.* > comp.lang.python

Fabrice (14/01/2018, 12h18)
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.
Benoit Izac (14/01/2018, 12h46)
Bonjour,

Le 14/01/2018 à 11:18, Fabrice a écrit dans le message
<5a5b2e78$0$4843$426a74cc> :

[..]
> 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')
Pierre Maurette (14/01/2018, 12h53)
Fabrice :
[..]
> 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.
Fabrice (14/01/2018, 13h06)
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.

Fabrice (14/01/2018, 13h07)
Merci Pierre pour votre réponse argumentée et pédagogique.

Benoit Izac (14/01/2018, 13h18)
Bonjour,

Le 14/01/2018 à 12:06, Fabrice a écrit dans le message
<5a5b39c0$0$3842$426a74cc> :

>> 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.
Discussions similaires
sqrt(a)+sqrt(b) démonstration synthèse etc ..

[Théorème] sqrt(a)+sqrt(b)

Partie réelle de (1 + i)*(sqrt(1 - i*z) - i*sqrt(1 + i*z)))

Conflit de modules


Fuseau horaire GMT +2. Il est actuellement 09h27. | Privacy Policy