講解python參數(shù)和作用域的使用
更新時間:2013年11月01日 15:52:03 作者:
本文會介紹如何將語句組織成函數(shù),還會詳細(xì)介紹參數(shù)和作用域的概念,以及遞歸的概念及其在程序中的用途。
本文會介紹如何將語句組織成函數(shù),還會詳細(xì)介紹參數(shù)和作用域的概念,以及遞歸的概念及其在程序中的用途。
一. 創(chuàng)建函數(shù)
函數(shù)是可以調(diào)用,它執(zhí)行某種行為并且返回一個值。用def語句即可定義一個函數(shù):(并非所有的函數(shù)都會返回一些東西)
def fibs(num):
result = [0,1]
for i in range(num-2):
result.append(result[-2]+result[-1])
return result
記錄函數(shù)
如果想給函數(shù)寫文檔以便讓人理解的話,可以加入注釋(以#開頭)。另一個方式就是直接寫上字符串,它會作為函數(shù)的一部分進(jìn)行存儲,這成為文檔字符串。
def square(x):
'計算x的平方'
return x*x
#文檔字符串可以按如下方式訪問:
>>> square._doc_
'計算x的平方'
二. 參數(shù)魔法
函數(shù)使用起來很簡單,創(chuàng)建起來也不復(fù)雜,但是函數(shù)參數(shù)的用法有時就不可思議了。
2.1 我能改變參數(shù)嗎
在函數(shù)內(nèi)為參數(shù)賦予新值,不會改變外部任何變量的值:
>>> def to_change(n):
n = 's'
>>> name = 'b'
>>> to_change(name)
>>> name
'b'
字符串(以及數(shù)字和元組)是不可變的,即無法被修改。但是如果將可變的數(shù)據(jù)結(jié)構(gòu)如列表用作參數(shù)時,參數(shù)就會被改變了。
>>> def change(n):
n[0] = 'ss'
>>> names = ['aa','zz']
>>> change(names)
>>> names
['ss', 'zz']
2.2 關(guān)鍵字參數(shù)和默認(rèn)值
目前為止,我們所使用的參數(shù)都叫做位置參數(shù)。有時候參數(shù)順序是很難記住的,為了讓事情簡單些,可以提供參數(shù)的名字:
>>> def hello(greeting,name):
print '%s,%name!'
>>> hello(greeting = 'hello',name = 'world')
hello,world!
這樣一來,參數(shù)順序就完全沒影響了,但是參數(shù)名和值一定要對應(yīng)。
這樣使用參數(shù)名提供的參數(shù)叫做關(guān)鍵字參數(shù),主要作用在于可以明確每個參數(shù)的作用。
關(guān)鍵字參數(shù)最厲害的地方在于可以在函數(shù)中給參數(shù)提供默認(rèn)值:
>>> def hello(greeting = 'hello',name = 'world'):
print '%s,%name!'
當(dāng)參數(shù)具有默認(rèn)值時,調(diào)用的時候就不用提供參數(shù)了,可以不提供,提供一些或提供所有的參數(shù)。
>>> hello()
'hello,world!'
>>> hello('greeting')
'greeting,world!'
>>> hello(name = 'universe')
'hello,universe!'
2.3 收集參數(shù)
如果函數(shù)中能存儲多個名字就好了,用戶可以給函數(shù)提供任意多的參數(shù),我們需要這樣做:定義函數(shù)時提供一個參數(shù),在前面加個星號。
>>> def print_para(*paras):
print paras
>>> print_para('ss')
('ss',)
>>> print_para(1,2,3)
(1, 2, 3)
參數(shù)前的星號將所有值放置在同一個元組中,可以說是將這些“其余位置的參數(shù)”收集起來再使用。如果不提供任何收集元素,參數(shù)得到的是一個空元組()。
但是如果需要處理關(guān)鍵字參數(shù)的“收集”操作,我們需要2個星號“**”:
>>> def print_params(x,y,z=3,*pospar,**keypar):
print x,y,z
print pospar
print keypar
>>> print_params(1,2,3,5,6,7,foo=1,bar=2)
1 2 3
(5, 6, 7)
{'foo': 1, 'bar': 2}
>>> print_params(1,2)
1 2 3
()
{}
請仔細(xì)體味上面的例子,前三個參數(shù)是固定的,第四個參數(shù)pospar是位置參數(shù),可以收集多個參數(shù),第五個參數(shù)是關(guān)鍵字參數(shù),可以收集多個關(guān)鍵字參數(shù)。當(dāng)沒有輸入時,默認(rèn)為空元組或者空字典。
2.4 反轉(zhuǎn)過程
剛剛已經(jīng)討論過如何將參數(shù)收集為元組和字典了,如果使用*和**的話,還可以執(zhí)行相反的操作。(1)在調(diào)用的時候使用
>>> def add(x,y):
return x+y
>>> params =(1,2)
>>> add(*params)
3
(2)在定義的時候使用
>>> def with_stars(**kds):
print kds['name'],'is',kds['age'],'years old'
>>> args = {'name':'Mr.Gumby','age':42}
>>> with_stars(**args)
Mr.Gumby is 42 years old
三. 作用域
在執(zhí)行x=1賦值語句后,名稱x引用到值1。這就像用字典一樣,鍵引用值,當(dāng)然,變量和所對應(yīng)的值用的是個‘不可見'的字典。內(nèi)建vars函數(shù)可以返回這個字典:
>>> x=1
>>> scope = vars()
>>> scope['x']
1
>>> scope['x'] += 1
>>> x
2
這個不可見的字典叫做命名空間或者作用域。除了全局作用域外,每個函數(shù)調(diào)用都會創(chuàng)建一個新的作用域。
一般學(xué)過編程的基本都知道什么是作用域了,這里就不細(xì)講了。
四. 遞歸
遞歸的定義包括它們自身定義內(nèi)容的引用。
一個有用的遞歸函數(shù)包含以下幾部分:
(1)當(dāng)函數(shù)直接返回值時有基本實例(最小可能性問題)
(2)遞歸實例,包括一個或者多個問題最小部分的遞歸調(diào)用。
這里的關(guān)鍵是將問題分解為小部分,遞歸不能永遠(yuǎn)繼續(xù)下去,因為它總是以最小可能性問題結(jié)束,而這些問題又存儲在基本實例中。
下面我們來看3個經(jīng)典的遞歸例子:
A.階乘
>>> def factorial(n):
if n == 1:
return 1
else:
return n * factorial(n-1)
[/code]
B.冪
>>> def power(x,n):
if n == 0:
return 1
else:
return x * power(x,n-1)
C.二元查找(假設(shè)number必然在序列sequence中)
>>> def search(sequence,number,lower,upper):
if lower == upper:
assert num == sequence[upper]
return upper
else:
middle = (lower+upper) // 2
if number > sequence[middle]:
return search(sequence,number,middle+1,upper)
else:
return search(sequence,number,lower,middle)
一. 創(chuàng)建函數(shù)
函數(shù)是可以調(diào)用,它執(zhí)行某種行為并且返回一個值。用def語句即可定義一個函數(shù):(并非所有的函數(shù)都會返回一些東西)
復(fù)制代碼 代碼如下:
def fibs(num):
result = [0,1]
for i in range(num-2):
result.append(result[-2]+result[-1])
return result
記錄函數(shù)
如果想給函數(shù)寫文檔以便讓人理解的話,可以加入注釋(以#開頭)。另一個方式就是直接寫上字符串,它會作為函數(shù)的一部分進(jìn)行存儲,這成為文檔字符串。
復(fù)制代碼 代碼如下:
def square(x):
'計算x的平方'
return x*x
#文檔字符串可以按如下方式訪問:
>>> square._doc_
'計算x的平方'
二. 參數(shù)魔法
函數(shù)使用起來很簡單,創(chuàng)建起來也不復(fù)雜,但是函數(shù)參數(shù)的用法有時就不可思議了。
2.1 我能改變參數(shù)嗎
在函數(shù)內(nèi)為參數(shù)賦予新值,不會改變外部任何變量的值:
復(fù)制代碼 代碼如下:
>>> def to_change(n):
n = 's'
>>> name = 'b'
>>> to_change(name)
>>> name
'b'
字符串(以及數(shù)字和元組)是不可變的,即無法被修改。但是如果將可變的數(shù)據(jù)結(jié)構(gòu)如列表用作參數(shù)時,參數(shù)就會被改變了。
復(fù)制代碼 代碼如下:
>>> def change(n):
n[0] = 'ss'
>>> names = ['aa','zz']
>>> change(names)
>>> names
['ss', 'zz']
2.2 關(guān)鍵字參數(shù)和默認(rèn)值
目前為止,我們所使用的參數(shù)都叫做位置參數(shù)。有時候參數(shù)順序是很難記住的,為了讓事情簡單些,可以提供參數(shù)的名字:
復(fù)制代碼 代碼如下:
>>> def hello(greeting,name):
print '%s,%name!'
>>> hello(greeting = 'hello',name = 'world')
hello,world!
這樣一來,參數(shù)順序就完全沒影響了,但是參數(shù)名和值一定要對應(yīng)。
這樣使用參數(shù)名提供的參數(shù)叫做關(guān)鍵字參數(shù),主要作用在于可以明確每個參數(shù)的作用。
關(guān)鍵字參數(shù)最厲害的地方在于可以在函數(shù)中給參數(shù)提供默認(rèn)值:
>>> def hello(greeting = 'hello',name = 'world'):
print '%s,%name!'
當(dāng)參數(shù)具有默認(rèn)值時,調(diào)用的時候就不用提供參數(shù)了,可以不提供,提供一些或提供所有的參數(shù)。
復(fù)制代碼 代碼如下:
>>> hello()
'hello,world!'
>>> hello('greeting')
'greeting,world!'
>>> hello(name = 'universe')
'hello,universe!'
2.3 收集參數(shù)
如果函數(shù)中能存儲多個名字就好了,用戶可以給函數(shù)提供任意多的參數(shù),我們需要這樣做:定義函數(shù)時提供一個參數(shù),在前面加個星號。
復(fù)制代碼 代碼如下:
>>> def print_para(*paras):
print paras
>>> print_para('ss')
('ss',)
>>> print_para(1,2,3)
(1, 2, 3)
參數(shù)前的星號將所有值放置在同一個元組中,可以說是將這些“其余位置的參數(shù)”收集起來再使用。如果不提供任何收集元素,參數(shù)得到的是一個空元組()。
但是如果需要處理關(guān)鍵字參數(shù)的“收集”操作,我們需要2個星號“**”:
復(fù)制代碼 代碼如下:
>>> def print_params(x,y,z=3,*pospar,**keypar):
print x,y,z
print pospar
print keypar
>>> print_params(1,2,3,5,6,7,foo=1,bar=2)
1 2 3
(5, 6, 7)
{'foo': 1, 'bar': 2}
>>> print_params(1,2)
1 2 3
()
{}
請仔細(xì)體味上面的例子,前三個參數(shù)是固定的,第四個參數(shù)pospar是位置參數(shù),可以收集多個參數(shù),第五個參數(shù)是關(guān)鍵字參數(shù),可以收集多個關(guān)鍵字參數(shù)。當(dāng)沒有輸入時,默認(rèn)為空元組或者空字典。
2.4 反轉(zhuǎn)過程
剛剛已經(jīng)討論過如何將參數(shù)收集為元組和字典了,如果使用*和**的話,還可以執(zhí)行相反的操作。(1)在調(diào)用的時候使用
復(fù)制代碼 代碼如下:
>>> def add(x,y):
return x+y
>>> params =(1,2)
>>> add(*params)
3
(2)在定義的時候使用
復(fù)制代碼 代碼如下:
>>> def with_stars(**kds):
print kds['name'],'is',kds['age'],'years old'
>>> args = {'name':'Mr.Gumby','age':42}
>>> with_stars(**args)
Mr.Gumby is 42 years old
三. 作用域
在執(zhí)行x=1賦值語句后,名稱x引用到值1。這就像用字典一樣,鍵引用值,當(dāng)然,變量和所對應(yīng)的值用的是個‘不可見'的字典。內(nèi)建vars函數(shù)可以返回這個字典:
復(fù)制代碼 代碼如下:
>>> x=1
>>> scope = vars()
>>> scope['x']
1
>>> scope['x'] += 1
>>> x
2
這個不可見的字典叫做命名空間或者作用域。除了全局作用域外,每個函數(shù)調(diào)用都會創(chuàng)建一個新的作用域。
一般學(xué)過編程的基本都知道什么是作用域了,這里就不細(xì)講了。
四. 遞歸
遞歸的定義包括它們自身定義內(nèi)容的引用。
一個有用的遞歸函數(shù)包含以下幾部分:
(1)當(dāng)函數(shù)直接返回值時有基本實例(最小可能性問題)
(2)遞歸實例,包括一個或者多個問題最小部分的遞歸調(diào)用。
這里的關(guān)鍵是將問題分解為小部分,遞歸不能永遠(yuǎn)繼續(xù)下去,因為它總是以最小可能性問題結(jié)束,而這些問題又存儲在基本實例中。
下面我們來看3個經(jīng)典的遞歸例子:
A.階乘
>>> def factorial(n):
if n == 1:
return 1
else:
return n * factorial(n-1)
[/code]
B.冪
復(fù)制代碼 代碼如下:
>>> def power(x,n):
if n == 0:
return 1
else:
return x * power(x,n-1)
C.二元查找(假設(shè)number必然在序列sequence中)
復(fù)制代碼 代碼如下:
>>> def search(sequence,number,lower,upper):
if lower == upper:
assert num == sequence[upper]
return upper
else:
middle = (lower+upper) // 2
if number > sequence[middle]:
return search(sequence,number,middle+1,upper)
else:
return search(sequence,number,lower,middle)
您可能感興趣的文章:
- python嵌套函數(shù)使用外部函數(shù)變量的方法(Python2和Python3)
- python編程嵌套函數(shù)實例代碼
- python中嵌套函數(shù)的實操步驟
- 從局部變量和全局變量開始全面解析Python中變量的作用域
- 深入解析Python中函數(shù)的參數(shù)與作用域
- 解讀Python編程中的命名空間與作用域
- 詳解Python函數(shù)作用域的LEGB順序
- Python中的變量和作用域詳解
- 詳細(xì)介紹Python中的偏函數(shù)
- Python使用functools模塊中的partial函數(shù)生成偏函數(shù)
- Python嵌套函數(shù),作用域與偏函數(shù)用法實例分析
相關(guān)文章
詳解mac python+selenium+Chrome 簡單案例
這篇文章主要介紹了詳解mac python+selenium+Chrome 簡單案例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11如何在django里上傳csv文件并進(jìn)行入庫處理的方法
這篇文章主要介紹了如何在django里上傳csv文件并進(jìn)行入庫處理的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-01-01使用python創(chuàng)建Excel工作簿及工作表過程圖解
這篇文章主要介紹了使用python創(chuàng)建Excel工作簿及工作表,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-05-05