欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

跟老齊學(xué)Python之變量和參數(shù)

 更新時間:2014年10月10日 09:35:17   投稿:hebedich  
對于變量和參數(shù),不管是已經(jīng)敲代碼多年的老鳥,還是剛剛接觸編程的小白,都會有時候清楚,有時候又有點模糊。因為,在實際應(yīng)用中,它們之間分分離離,比如,敲代碼都知道,x=3中x是變量,它不是參數(shù),但是在函數(shù)y=3x+4中,x是變量,也是參數(shù)。

那么什么這兩個到底有什么區(qū)別和聯(lián)系呢?我在網(wǎng)上搜了一下,發(fā)現(xiàn)很多說法,雖然大同小異,但是似乎只有下面這一段來自微軟網(wǎng)站的比較高度抽象,而且意義涵蓋深遠(yuǎn)。我摘抄過來,看官讀一讀,是否理解,雖然是針對VB而言的,一樣有啟發(fā)。

復(fù)制代碼 代碼如下:

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

多數(shù)情況下,過程必須包含有關(guān)調(diào)用環(huán)境的一些信息。執(zhí)行重復(fù)或共享任務(wù)的過程對每次調(diào)用使用不同的信息。此信息包含每次調(diào)用過程時傳遞給它的變量、常量和表達(dá)式。

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

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

當(dāng)您定義 Function 或 Sub 過程時,需要在緊跟過程名稱的括號內(nèi)指定形參列表。對于每個形參,您可以指定名稱、數(shù)據(jù)類型和傳入機(jī)制(ByVal (Visual Basic) 或 ByRef (Visual Basic))。您還可以指示某個形參是可選的。這意味著調(diào)用代碼不必傳遞它的值。

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

實參表示在您調(diào)用過程時傳遞給過程形參的值。調(diào)用代碼在調(diào)用過程時提供參數(shù)。

調(diào)用 Function 或 Sub 過程時,需要在緊跟過程名稱的括號內(nèi)包括實參列表。每個實參均與此列表中位于相同位置的那個形參相對應(yīng)。
 
與形參定義不同,實參沒有名稱。每個實參就是一個表達(dá)式,它包含零或多個變量、常數(shù)和文本。求值的表達(dá)式的數(shù)據(jù)類型通常應(yīng)與為相應(yīng)形參定義的數(shù)據(jù)類型相匹配,并且在任何情況下,該表達(dá)式值都必須可轉(zhuǎn)換為此形參類型。

看官如果硬著頭皮看完這段引文,發(fā)現(xiàn)里面有幾個關(guān)鍵詞:參數(shù)、變量、形參、實參。本來想弄清楚參數(shù)和變量,結(jié)果又冒出另外兩個東東,更混亂了。請稍安勿躁,本來這段引文就是有點多余,但是,之所以引用,就是讓列位開闊一下眼界,在編程業(yè)界,類似的東西有很多名詞。下次聽到有人說這些,不用害怕啦,反正自己聽過了。

在Python中,沒有這么復(fù)雜。

看完上面讓人暈頭轉(zhuǎn)向的引文之后,再看下面的代碼,就會豁然開朗了。

復(fù)制代碼 代碼如下:

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

 至此,看官是否清楚了一點點。當(dāng)然,我所表述不正確之處或者理解錯誤之處,也請看官不吝賜教,小可作揖感謝。

全局變量和局部變量

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

復(fù)制代碼 代碼如下:

x = 2

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

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

 那么,這段代碼輸出的結(jié)果是什么呢?看:

復(fù)制代碼 代碼如下:

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

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

特別要關(guān)注的是,前一個x輸出的是函數(shù)內(nèi)部的變量x;后一個x輸出的是函數(shù)外面的變量x。兩個變量彼此沒有互相影響,雖然都是x。從這里看出,兩個X各自在各自的領(lǐng)域內(nèi)起到作用,那么這樣的變量稱之為局部變量。

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

復(fù)制代碼 代碼如下:

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

 以上兩段代碼的不同之處在于,后者在函數(shù)內(nèi)多了一個global x,這句話的意思是在聲明x是全局變量,也就是說這個x跟函數(shù)外面的那個x同一個,接下來通過x=9將x的引用對象變成了9。所以,就出現(xiàn)了下面的結(jié)果。
this x is in the funcx:--> 9
--------------------------
this x is out of funcx:--> 9

 好似全局變量能力很強(qiáng)悍,能夠統(tǒng)帥函數(shù)內(nèi)外。但是,要注意,這個東西要慎重使用,因為往往容易帶來變量的換亂。內(nèi)外有別,在程序中一定要注意的。

不確定參數(shù)的數(shù)量

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

然而,這個世界不總是這么簡單的,也不總是這么確定的,反而不確定性是這個世界常常存在的。如果看官了解量子力學(xué)這個好多人聽都沒有聽過的東西,那就理解真正的不確定性了。當(dāng)然,不用研究量子力學(xué)也一樣能夠體會到,世界充滿里了不確定性。不是嗎?塞翁失馬焉知非福,這不就是不確定性嗎?

既然有很多不確定性,那么函數(shù)的參數(shù)的個數(shù),也當(dāng)然有不確定性,函數(shù)怎么解決這個問題呢?python用這樣的方式解決參數(shù)個數(shù)的不確定性:

復(fù)制代碼 代碼如下:

def add(x,*arg):
    print x         #輸出參數(shù)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)    #賦給函數(shù)的參數(shù)個數(shù)不僅僅是2個

 運行此代碼后,得到如下結(jié)果:
1                       #這是函數(shù)體內(nèi)的第一個print,參數(shù)x得到的值是1
(2, 3, 4, 5, 6, 7, 8, 9) #這是函數(shù)內(nèi)的第二個print,參數(shù)arg得到的是一個元組
45                      #最后的計算結(jié)果

 上面這個輸出的結(jié)果表現(xiàn)相當(dāng)不界面友好,如果不對照著原函數(shù),根本不知道每行打印的是什么東西。自責(zé)呀。

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

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

復(fù)制代碼 代碼如下:

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

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

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

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

 不管是什么,都一股腦地塞進(jìn)了tuple中。

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

復(fù)制代碼 代碼如下:

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

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

復(fù)制代碼 代碼如下:

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

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

復(fù)制代碼 代碼如下:

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

 很good了,這樣就能夠足以應(yīng)付各種各樣的參數(shù)要求了。

相關(guān)文章

最新評論