-3
votes

Le programme ne peut pas voir un objet dans une méthode "si"

J'ai créé un programme qui résout une fonction avec des paramètres. Nous entrons d'abord nos valeurs et utilisons une méthode if pour donner la valeur de l'objet à s . Après cela, nous devons le donner à notre instruction z = 1 - s et afficher le résultat. Je vais mettre une image avec ma fonction. Le problème est que mon programme ne peut pas voir s objet. z = 1 - s NameError: name 's' is not defined . Que devrais-je faire? Notre fonction

import math
x, l, r, a, c = float(input('x: ')), float(input('l: ')), float(input('r: ')), float(input('a: ')), 
float(input('c: '))

if x <= 1:
    s = 0
elif l < x < (l + r) / 2:
    s = 2 * math.pow(( x - l) / (r - l), 2)
elif x > r:
    s = 1
elif (l + r) / 2 < x <= r:
    s = 1 - 2 * math.pow((r - x) / (r - l), 2)


z = 1 - s

if x <= c:
    print(s)
elif x > c:
    print(z)


7 commentaires

définir la variable s comme vide au démarrage, il n'y a pas de s dans la portée de départ, donc les s disponibles localement ne sont pas disponibles En dehors de la portée !! Ecrire au début du code s = 0


Votre construction if ... elif manque d'un else à la fin. Etes-vous sûr que vos cas sont exhaustifs?


Si s n'a pas été défini, cela signifie qu'aucun de vos if elif ou elif n'est évalué à True . Essayez d'utiliser un débogueur pour confirmer que vos calculs (à la main) correspondent à ceux que vous avez codés.


Je le parcourirais pour voir la sortie de chaque variable. Ma première pensée est que s est indéfini car il est local à chaque instruction if. J'utiliserais au moins des méthodes. Essayez de définir S = 0 au début de votre logique.


La formule dit x <= l , pas x <= 1 comme dans votre code.


@Agent_Orange, @Paul_Jay - la portée est bonne; en Python, if les blocs ne présentent pas leur propre portée, donc s seront disponibles à l' extérieur, à condition au moins un des if / elif conditions assorties (ou il y avait une else clause qui a également défini s ).


@sabik bien, de nouvelles connaissances tous les jours, merci d'avoir clarifié


4 Réponses :


1
votes

Apparemment, il y a des cas qui ne donnent la valeur True dans aucune des quatre instructions if.

En particulier, je pense que la première déclaration if est fausse, au lieu de <= 1 l'image semble indiquer <= l .


1 commentaires

Bonne prise avec le 1 vs l . Preuve supplémentaire que c'est presque toujours une mauvaise idée d'utiliser l comme variable



2
votes
  • Le if / elif / elif déclaration n'a pas d' else clause; si aucune des conditions ne correspond, aucune des branches ne sera prise.

    Pour voir si c'est un problème, ajoutez une clause else (peut-être une clause simple pour signaler une erreur).

  • Dans votre première condition, vous écrivez x <= 1 (eks inférieur ou égal à un), mais je pense que la formule est x <= l (eks inférieur ou égal à ell).

  • Essayez-le comme ceci:

    if x <= l:  # changed 1 to l
        s = 0
    elif l < x < (l + r) / 2:
        s = 2 * math.pow(( x - l) / (r - l), 2)
    elif x > r:
        s = 1
    elif (l + r) / 2 < x <= r:
        s = 1 - 2 * math.pow((r - x) / (r - l), 2)
    else:  # added else clause
        raise ValueError(f"Unexpected values: x={x}, l={l}, r={r}")
    

0 commentaires

0
votes

s est créé dans les blocs conditionnels. Si s n'existe pas après votre premier bloc de clauses if , alors aucune de ses conditions évaluée à vrai et par la suite s n'a été initialisée.

Soit ajouter une else déclaration à la fin du premier if le bloc ou assurez - vous que votre entrée toujours conduit à l' un des if / elif conditions correspondant.


0 commentaires

0
votes

s est défini dans la première boucle conditionnelle, donc s'il n'est pas défini, c'est parce que l'algorithme n'a pas trouvé de condition vraie. Sur la base de la boucle actuelle, si x> 1 & x <l, alors s n'est pas défini.


1 commentaires

Aussi si x> r alors s n'est pas défini.