2017-05-13 29 views
-1

我写了一个python脚本,它根据速度和角度显示抛射体的覆盖距离。功能无法识别全局变量

但是,它不会读取用户返回的另一个函数(ask_values())的那两个变量。

什么阻止了cover_distance()函数读取用户在ask_values()中输入的2个变量(θ和速度)?

这里是程序的输出:

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

Distance covered: 0.0 

这里是程序本身:

# 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

你可以用'全球some_global_variabe'访问功能全局变量 –

+0

@NipunGarg我会强烈建议不要使用'全球'在你的所有功能。上面的函数本质上是好的,输出只需要分配给正确的名称。 –

+0

@ juanpa.arrivillaga在这种情况下,使用全局变量在这里完全没用。 –

回答

1

你必须捕捉你的功能main返回的值,否则他们将被丢弃,并永远不要进入名字空间。当您访问该名称时,它在本地找不到任何东西,并查看参数的全局值。因此,而不是这样的:

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

务必:

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

要不然thetavelocity值将对应于您在此处定义的那些:

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

在全局命名空间。如果你想继续使用用户输入,为这些变量赋值是无用的。 Python不是具有变量声明概念的静态类型语言。变量在被分配时“弹簧化”。

此外,你可能会想print你的最后结果:

print(covered_distance(theta, velocity, covered_distance_var))