# 斐波那契數函式
deffibs
(num)
: result =[0
,1]for i in
range
(num-2)
: -2]
+ result[-1
])return result
6.3.1 給函式編寫文件
文件字串(docstring)
下面的**演示了如何給函式新增文
檔字串:
def
square
(x):
'calculates the square of the number x.'
return x * x
可以像下面這樣訪問文件字串:
>>
> square.__doc__
'calculates the square of the number x.'
注意__doc__是函式的乙個屬性。屬性將在第7章詳細介紹。屬性名中的雙下劃線表示這是乙個特殊的屬性。特殊(「魔法」)屬性將在第9章討論。
注意引數儲存在區域性作用域內。
6.4.3 關鍵字引數和預設值
關鍵字引數最大的優點在於,可以指定預設值。
6.4.4 收集引數
允許提供任意數量的引數
def
print_paras
(*argv)
:print
(argvs)
>>
>
defin_the_middle
(x,*y, z):.
..print
(x, y, z)..
.>>
> in_the_middle(1,
2,3,
4,5, z=7)
1(2,
3,4,
5)7>>
> in_the_middle(1,
2,3,
4,5,
7) traceback (most recent call last)
: file ""
, line 1,in
typeerror: in_the_middle(
) missing 1 required keyword-only argument:
'z'
>>
> print_params_2(
'hmm...'
, something=
42)
traceback (most recent call last)
: file ""
, line 1,in
typeerror: print_params_2(
) got an unexpected keyword argument 'something'
>>
>
defprint_params_3
(**params):.
..print
(params)..
.>>
> print_params_3(x=
1, y=
2, z=3)
這樣得到的是乙個字典而不是元組。可結合使用這些技術。
6.4.5 分配引數
同樣用(』* 『和』'),通過在呼叫函式時使用運算子實現。這種做法也可用於引數列表的一部分,條件是這部分位於引數列表末尾。通過使用運算子 **,可將字典中的值分配給關鍵字引數。
如果在定義和呼叫函式時都使用或,將只傳遞元組或字典。還不如不使用它們,還可省卻些麻煩。
>>
>
defwith_stars
(**kwds):.
..print
(kwds[
'name'],
'is'
, kwds[
'age'],
'years old').
..>>
>
defwithout_stars
(kwds):.
..print
(kwds[
'name'],
'is'
, kwds[
'age'],
'years old').
..>>
> args =
>>
> with_stars(
**args)
mr. gumby is
42 years old
>>
> without_stars(args)
mr. gumby is
42 years old
對於函式with_stars,在定義和呼叫它時都使用了星號,而對於函式without_stars,我在定義和呼叫它時都沒有使用,但這兩種做法的效果相同。因此,只有在定義函式(允許可變數量的引數)或呼叫函式(拆分字典或序列)時使用,星號才能發揮作用。
命名空間或作用域
作用域巢狀(閉包)
python函式可以巢狀,即可將乙個函式放在另乙個函式內,巢狀通常用處不大,但有乙個很突出的用途:使用乙個函式來建立另乙個函式。
def
multiplier
(factor)
:def
multiplybyfactor
(number)
:return number * factor
return multiplybyfactor
在這裡,乙個函式位於另乙個函式中,且外面的函式返回裡面的函式。也就是返回乙個函式,而不是呼叫它。重要的是,返回的函式能夠訪問其定義所在的作用域。換而言之,它攜帶著自己所在的環境(和相關的區域性變數)!
每當外部函式被呼叫時,都將重新定義內部的函式,而變數factor的值也可能不同。由於python的巢狀作用域,可在內部函式中訪問這個來自外部區域性作用域(multiplier)的變數,如下所示:
>>
> double = multiplier(2)
>>
> double(5)
10>>
> triple = multiplier(3)
>>
> triple(3)
9>>
> multiplier(5)
(4)20
像multiplybyfactor這樣儲存其所在作用域的函式稱為閉包。
通常,不能給外部作用域內的變數賦值,但如果一定要這樣做,可使用關鍵字nonlocal。這個關鍵字的用法與global很像,讓你能夠給外部作用域(非全域性作用域)內的變數賦值。
python提供了一些有助於進行這種函式式程式設計的函式:map、filter和reduce。在較新的python版本中,函式map和filter的用途並不大,應該使用列表推導來替代它們。你可使用map將序列的所有元素傳遞給函式。
>>
>
list
(map
(str
,range(10
)))# 與[str(i) for i in range(10)]等價
['0'
,'1'
,'2'
,'3'
,'4'
,'5'
,'6'
,'7'
,'8'
,'9'
] 你可使用filter根據布林函式的返回值來對元素進行過濾。
>>
>
deffunc
(x):..
.return x.isalnum().
..>>
> seq =
["foo"
,"x41"
,"?!"
,"***"
]>>
>
list
(filter
(func, seq))[
'foo'
,'x41'
]
函 數
描 述help(functionname)
獲取名為functionname函式的資訊
callable(x)
判斷物件x是否可呼叫
map(func, seq[, seq, …])
對序列中的所有元素執行函式
filter(func, seq)
返回乙個列表,其中包含對其執行函式時結果為真的所有元素
reduce(func, seq[, initial])
等價於 func(func(func(seq[0], seq[1]), seq[2]), …)
sum(seq)
返回 seq 中所有元素的和
呼叫函式(還提供要傳遞給函式的引數)
globals()
返回乙個包含全域性變數的字典,類似於vars,globals()[『parameter』]來訪問名為parameter的全域性變數
locals()
返回乙個包含區域性變數的字典
《python語言程式設計基礎》 第6章
根據資料之間的關係,組合資料型別可以分為3類 序列型別 元素之間存在先後關係,通過序號訪問,元素之間可以是相通的 集合型別 元素無序,且相同元素在集合中唯一存在 對映型別 即鍵值對 這個庫的名字挺有趣!jieba是python中乙個重要的第三方中文分詞函式庫。jieba庫的分詞原理是利用乙個中文詞庫...
python程式設計 第6章
學習django book的可以參照下面的資訊。在mysite下面建立完books後,繼續按著例子走,出現以下問題 pytho manage.py validate error one or more models did not validate books.author headshot to ...
第6章 6 1 函式基礎
6.1.2 函式宣告 乙個典型的函式定義包括以下幾個部分 返回型別 函式名字 由0個或多個形參組成的列表以及函式體。其中,形參以逗號隔開,形參列表位於一對圓括號之內。函式的呼叫完成兩項工作 1 用實參初始化函式對應的形參 2 將控制權轉移給被調函式。此時主調函式的執行被中斷,被調函式開始執行。舉個例...