2017-05-13 4 views
-1

J'ai écrit un script python qui affiche la distance parcourue d'un projectile en fonction de sa vitesse et de son angle.La fonction ne peut pas reconnaître la variable globale

Cependant, il ne lit pas ces deux variables qu'une autre fonction (ask_values ​​()) renvoyée par l'utilisateur. Qu'est-ce qui empêche la fonction covered_distance() de lire les 2 variables (theta et velocity) que l'utilisateur a saisies dans ask_values ​​()?

Voici la sortie du programme:

Projectile angle: 10 
Velocity:  10 
Angle: 10.0 Speed: 10.0 
Angle: 0.0 Speed: 0.0 

Distance covered: 0.0 

Et voici le programme lui-même:

# IMPORT MODULES 
from math import *   # Import all methods/attributes from math module 
import sys     # Import sys.exit() 

# DECLARE VARIABLES 
theta = 0.0     # theta = angle at which the projectile is launched 
velocity = 0.0    # velocity = speed of the projectile 
percent_distance_var = 0.0 # percent_distance_var = percentage of the covered distance 
max_distance_var = 0.0  # max_distance_var = maximum distance 
covered_distance_var = 0.0 # covered_distance_var = covered distance 

# Covered distance 
def covered_distance(theta_, velocity_, covered_distance_var_): # Arguments: (theta, speed, covered_distance_var) 
    covered_distance_var_ = 0.2041*((velocity_)**2)*sin(theta_)*cos(theta_) # Calculate 0.2041*((velocity)**2)*sin(theta)*cos(theta) 
    data = dict(angle=theta_, speed=velocity_, distance=covered_distance_var_) 
    print("Angle: {angle} Speed: {speed} \n \nDistance covered_: {distance}".format(**data)) # Doesn't print out the correct variables 
    return covered_distance_var_   # Return covered_distance_var 

# Ask user for values 
def ask_values(theta, velocity): 
    theta = float(input("Projectile angle: \t")) 
    velocity = float(input("Velocity: \t \t")) 
    print("Angle: {} Speed: {}".format(theta, velocity)) # Prints out the correct variables 
    return(theta, velocity) 


def main():# Main method 
    ask_values(theta, velocity) # Ask for values 
    covered_distance(theta, velocity, covered_distance_var) 

# EXECUTE CODE 
if __name__ == "__main__": # If "__main__" statement 
    main() # Main() method 
+0

Vous pouvez utiliser 'some_global_variabe' globale pour accéder à la variable globale en fonction –

+0

@NipunGarg Je déconseille vivement l'utilisation de' global' Dans toutes vos fonctions. Les fonctions ci-dessus sont essentiellement bonnes, la sortie doit simplement être affectée aux noms corrects. –

+0

@ juanpa.arrivillaga Dans ce cas, l'utilisation de variables globales est tout à fait inutile ici. –

Répondre

1

Vous devez saisir les valeurs renvoyées par vos fonctions main, ou bien ils sont mis au rebut et n'entrer jamais dans l'espace de noms. Lorsque vous accédez au nom, il ne trouve rien localement et examine les valeurs globales des arguments. Ainsi, au lieu de cela:

def main():# Main method 
    ask_values(theta, velocity) # Ask for values 
    covered_distance(theta, velocity, covered_distance_var) 

Do:

def main():# Main method 
    theta, velocity = ask_values(theta, velocity) # Ask for values 
    covered_distance(theta, velocity, covered_distance_var) 

Ou bien les valeurs theta et velocity correspondent à ceux que vous définissez ici:

# DECLARE VARIABLES 
theta = 0.0     # theta = angle at which the projectile is launched 
velocity = 0.0    # velocity = speed of the projectile 

Dans l'espace de noms global. Assigner des valeurs à ces variables est assez inutile ici si vous voulez prendre l'entrée de l'utilisateur de toute façon. Python n'est pas un langage typé statiquement avec une notion de déclaration de variable. Les variables "jaillissent" quand elles sont assignées.

De plus, vous allez probablement vouloir print vos résultats finaux:

print(covered_distance(theta, velocity, covered_distance_var))