2017-05-13 149 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))