2012-11-01 93 views
0

對於你們大多數人來說,這可能是常識,但我發現它非常非常難以掌握。如果你創建一個函數,如Python定義函數參數傳遞

def one(): 
    x=1 
    y=2 
    z=3 
    h=33 
    j=454 
    l=353 
    m=898 

那麼可以說我有另一個功能,高清兩():和我想使用一個高清()中的變量爲DEF兩個,我還創建了兩個新def two()中的變量。我將如何去做這件事。然後,假設我有第三個函數def three(),我將如何使用def 1和def 2中的變量到def 3中?我使用的方法效率非常低,可能做得比需要的要多。我所做的是在def two中,將def one中的所有變量添加到def two的參數中,然後我還在函數2的def中調用函數1.我知道這裏有很多線程,並且我看過通過他們中的許多人,他們不只是它。他們使用非常特定和先進的代碼,我不熟悉,因此不理解。我的例子非常簡單直接,我敢肯定如果回答它會幫助很多新手。謝謝!

編輯:我不想要一個「簡單」的方式,最終使用我不熟悉的高級代碼。我想要一個簡單易懂的「高效」方法。

+1

也許你應該把它包裝在一個類中,並使用'self'。檢查http://stackoverflow.com/q/6236032/1031900 –

+0

一個類似乎是最合適的。儘管如此,你可能希望通過python教程。 – monkut

+0

我不理解你的「簡單」,「高級」或「高效」的隱含概念。我懷疑他們被誤導了。我投票決定關閉它,因爲我認爲它過於寬泛,實際上它甚至不是Python特有的。 –

回答

0

如果我理解你需要什麼,然後我想,蟒蛇爲您帶來最簡單的方法是下一個 - >

class Helper:pass 

# use name space 
def one(a): 
    a.x=1 
    a.y=2 
    a.z=3 
    a.h=33 
    a.j=454 
    a.l=353 
    a.m=898 

def two(a): 
    a.y=7 

a=Helper() 

one(a) 
print(a.x,a.y) 
two(a) 
print(a.x,a.y) 

#------------------------------------------------------------------- 
# I think you have solution and dont need to read next lines :) 
# next lines are just bonus ;) 
#------------------------------------------------------------------- 

# you could use more independent "namespaces" 
b=Helper() 
one(b) 
print(b.y) 
print(a.y) # "namespace a" is unchanged 

# if you like to see which attributes are defined you could use funciton dir 
# (under python3 it is a little more complicated) 
print(dir(a)) 
print(dir(b)) 

# please dont do next lines at home!!! :P:P:P (__builtins__ is special you could get unwanted results!) 
one(__builtins__) 

print(x) # 
+0

非常感謝,這很有用 – SeesSound

3

我認爲最好的解決方案是採用代碼(類,方法和繼承)的OO範例。

使用簡單的函數,您可以選擇使用全局變量和局部作用域。

+0

嗯...不知道那些人甚至還沒有...我希望有一個更簡單的解決方案 – SeesSound

2

數據作爲參數傳遞給函數,並作爲返回值傳遞給函數。函數的理想情況是當你不需要訪問函數範圍外的變量時。

如果你有很多數字,也許你應該將它們聲明爲一個列表(更易於管理),然後將它們作爲參數傳遞到函數中,作爲轉換後的結果作爲返回值傳遞給函數?

+0

如果不使用列表,那麼如果我在函數1的定義中使用了一個返回值,那麼我調用函數一個在function2的定義中,現在所有的變量值是function2定義的一部分嗎? – SeesSound

+0

@ user1716168沒有什麼會奇蹟般地成爲「功能2的定義的一部分」;調用返回值的函數的要點是在某個表達式中使用它,例如,變量賦值:'val = 1(param1,param2)'。現在'val'擁有所有返回的'one'。所有這些都可以在另一個功能中。 –

1

可以使用global關鍵字這樣的創建和修改全局變量:

In [1]: def one(): 
    ...:  global a 
    ...:  a = 1 
    ...: 

In [2]: one() 

In [3]: a 
Out[3]: 1 

然而,有許多(或者甚至任何)全局變量不被認爲是一個很好的做法。你可以聲明一個全局的list並保留所有這些值,這將是更清潔的;儘管你應該儘量堅持使用函數參數並返回Andrew的答案中概述的值。

0

,而不在你正在試圖做什麼都清楚,這裏有一個簡單的方法,你可以這樣做:

class One(object): 
    x=1 
    y=2 
    z=3 
    h=33 
    j=454 
    l=353 
    m=898 


class Two(One): 
    n=42 
    o=1337 

print Two.x, Two.n # 1, 42