python基礎 第6章 抽象

2021-09-02 11:42:25 字數 4658 閱讀 8381

# 斐波那契數函式

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 將控制權轉移給被調函式。此時主調函式的執行被中斷,被調函式開始執行。舉個例...