python 變量和參數

對於變量和參數, x=3中x是變量,它不是參數,但是在函數y=3x+4中,x是變量,也是參數。下面這一段來自微軟網站的比較高度抽象,而且意義涵蓋深遠。

參數和變量之間的差異 (Visual Basic)

多數情況下,過程必須包含有關調用環境的一些信息。執行重複或共享任務的過程對每次調用使用不同的信息。此信息包含每次調用過程時傳遞給它的變量、常量和表達式。

若要將此信息傳遞給過程,過程先要定義一個形參,然後調用代碼將一個實參傳遞給所定義的形參。 您可以將形參當作一個停車位,而將實參當作一輛汽車。 就像一個停車位可以在不同時間停放不同的汽車一樣,調用代碼在每次調用過程時可以將不同的實參傳遞給同一個形參。

形參表示一個值,過程希望您在調用它時傳遞該值。

當您定義 Function 或 Sub 過程時,需要在緊跟過程名稱的括號內指定形參列表。對於每個形參,您可以指定名稱、數據類型和傳入機制(ByVal (Visual Basic) 或 ByRef (Visual Basic))。您還可以指示某個形參是可選的。這意味着調用代碼不必傳遞它的值。

每個形參的名稱均可作爲過程內的局部變量。形參名稱的使用方法與其他任何變量的使用方法相同。

實參表示在您調用過程時傳遞給過程形參的值。調用代碼在調用過程時提供參數。

調用 Function 或 Sub 過程時,需要在緊跟過程名稱的括號內包括實參列表。每個實參均與此列表中位於相同位置的那個形參相對應。

與形參定義不同,實參沒有名稱。每個實參就是一個表達式,它包含零或多個變量、常數和文本。求值的表達式的數據類型通常應與爲相應形參定義的數據類型相匹配,並且在任何情況下,該表達式值都必須可轉換爲此形參類型。

這段引文,發現裏面有幾個關鍵詞:參數、變量、形參、實參。本來想弄清楚參數和變量,結果又冒出另外兩個東東,更混亂了。
在Python中,沒有這麼複雜。

看完上面讓人暈頭轉向的引文之後,再看下面的代碼,就會豁然開朗了。

>>> def add(x):     #x是參數
...     a = 10      #a是變量
...     return a+x
... 
>>> x = 3           #x是變量,只不過在函數之外
>>> add(x)          #這裏的x是參數,但是它由前面的變量x傳遞對象3
13
>>> add(3)          #把上面的過程合併了
13

全局變量和局部變量

下面是一段代碼,注意這段代碼中有一個函數funcx(),這個函數裏面有一個變量x=9,在函數的前面也有一個變量x=2

x = 2

def funcx():
    x = 9
    print "this x is in the funcx:-->",x

funcx()
print "--------------------------"
print "this x is out of funcx:-->",x

那麼,這段代碼輸出的結果是什麼呢?看:

this x is in the funcx:--> 9
--------------------------
this x is out of funcx:--> 2

從輸出看出,運行funcx(),輸出了funcx()裏面的變量x=9;然後執行代碼中的最後一行,print "this x is out of funcx:-->",x

特別要關注的是,前一個x輸出的是函數內部的變量x;後一個x輸出的是函數外面的變量x。兩個變量彼此沒有互相影響,雖然都是x。從這裏看出,兩個X各自在各自的領域內起到作用,那麼這樣的變量稱之爲局部變量

有局部,就有對應的全部,在漢語中,全部變量,似乎有歧義,幸虧漢語豐富,於是又取了一個名詞:全局變量

x = 2
def funcx():
    global x
    x = 9
    print "this x is in the funcx:-->",x

funcx()
print "--------------------------"
print "this x is out of funcx:-->",x

以上兩段代碼的不同之處在於,後者在函數內多了一個global x,這句話的意思是在聲明x是全局變量,也就是說這個x跟函數外面的那個x同一個,接下來通過x=9將x的引用對象變成了9。所以,就出現了下面的結果。

this x is in the funcx:--> 9
--------------------------
this x is out of funcx:--> 9

好似全局變量能力很強悍,能夠統帥函數內外。但是,要注意,這個東西要慎重使用,因爲往往容易帶來變量的換亂。內外有別,在程序中一定要注意的。

不確定參數的數量

在設計函數的時候,有時候我們能夠確認參數的個數,比如一個用來計算圓面積的函數,它所需要的參數就是半徑(πr^2),這個函數的參數是確定的。

然而,有很多不確定性,那麼函數的參數的個數,也當然有不確定性,函數怎麼解決這個問題呢?python用這樣的方式解決參數個數的不確定性:

def add(x,*arg):
    print x         #輸出參數x的值
    result = x
    print arg       #輸出通過*arg方式得到的值
    for i in arg:
        result +=i
    return result

print add(1,2,3,4,5,6,7,8,9)    #賦給函數的參數個數不僅僅是2個

運行此代碼後,得到如下結果:

1                       #這是函數體內的第一個print,參數x得到的值是1
(2, 3, 4, 5, 6, 7, 8, 9) #這是函數內的第二個print,參數arg得到的是一個元組
45                      #最後的計算結果

上面這個輸出的結果表現相當不界面友好,如果不對照着原函數,根本不知道每行打印的是什麼東西。

從上面例子可以看出,如果輸入的參數過多,其它參數全部通過*arg,以元組的形式傳給了參數(變量)arg。這裏用了一個模糊的詞語:參數(變量),這樣的表述意思是,在傳入數據的前,arg在函數頭部是參數,當在函數語句中,又用到了它,就是變量。也就是在很多時候,函數中的參數和變量是不用那麼太區分較真的,只要知道對象是通過什麼渠道、那個東西傳到了什麼目標即可。

爲了能夠更明顯地看出args(名稱可以不一樣,但是符號必須要有),可以用下面的一個簡單函數來演示:

>>> def foo(*args):
...     print args      #打印通過這個參數得到的對象
... 
>>> #下面演示分別傳入不同的值,通過參數*args得到的結果

>>> foo(1,2,3)
(1, 2, 3)

>>> foo("hiekay","hiekay.github.io","python")
('hiekay', 'hiekay.github.io', 'python')

>>> foo("hiekay",307,["hiekay",2],{"name":"hiekay","lang":"python"})
('hiekay', 307, ['hiekay', 2], {'lang': 'python', 'name': 'hiekay'})

不管是什麼,都一股腦地塞進了tuple中。

除了用args這種形式的參數接收多個值之外,還可以用*kargs的形式接收數值,不過這次有點不一樣:

>>> def foo(**kargs):
...     print kargs
...
>>> foo(a=1,b=2,c=3)    #注意觀察這次賦值的方式和打印的結果
{'a': 1, 'c': 3, 'b': 2}

如果這次還用foo(1,2,3)的方式,會有什麼結果呢?

>>> foo(1,2,3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: foo() takes exactly 0 arguments (3 given)

到這裏可能想了,不是不確定性嗎?我也不知道參數到底會可能用什麼樣的方式傳值呀,這好辦,把上面的都綜合起來。

>>> def foo(x,y,z,*args,**kargs):
...     print x   
...     print y
...     print z
...     print args
...     print kargs        
... 
>>> foo('hiekay',2,"python")
hiekay
2
python
()
{}
>>> foo(1,2,3,4,5)
1
2
3
(4, 5)
{}
>>> foo(1,2,3,4,5,name="hiekay")
1
2
3
(4, 5)
{'name': 'hiekay'}

很good了,這樣就能夠足以應付各種各樣的參數要求了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章