Python3 基本語法四 函式 匿名函式 閉包

2021-08-15 18:49:21 字數 4574 閱讀 9276

匿名函式

type函式

閉包任何傳入引數和自變數必須放在圓括號中間,圓括號之間可以用於定義引數

函式的第一行語句可以選擇性地使用文件字串—用於存放函式說明

函式內容以冒號起始,並且縮排

return [表示式] 結束函式,選擇性地返回乙個值給呼叫方。不帶表示式的return相當於返回 none

函式體

>>

>

defhello() :

print("hello world!"

)>>

> hello()

hello world!

可變型別:變數賦值 la=[1,2,3,4] 後再賦值 la[2]=5 則是將 list la 的第三個元素值更改,本身la沒有動,只是其內部的一部分值被修改了。

可變型別:類似 c++ 的引用傳遞,如 列表,字典。如 fun(la),則是將 la 真正的傳過去,修改後fun外部的la也會受影響

關鍵字引數

預設引數

不定長引數

defprintinfo( name, age ):

"列印任何傳入的字串"

print ("名字: "

, name);

print ("年齡: "

, age);

return

;#呼叫printinfo函式

printinfo( age

=50, name

="runoob"

);def

printinfo( name, age

=35 ):

"列印任何傳入的字串"

print ("名字: "

, name);

print ("年齡: "

, age);

return

;#呼叫printinfo函式

printinfo( age

=50, name

="runoob"

);print ("------------------------"

)printinfo( name

="runoob"

);def

printinfo( arg1, *

vartuple ):

"列印任何傳入的引數"

print ("輸出: "

) print (arg1)

for var in vartuple:

print (var)

return

;# 呼叫printinfo 函式

printinfo( 10 );

printinfo( 70, 60, 50 );

e (enclosing) 閉包函式外的函式中

g (global) 全域性作用域

b (built-in) 內建作用域 以 l –> e –> g –>b 的規則查詢,即:在區域性找不到,便會去區域性外的區域性找(例如閉包),再找不到就會去全域性找,再者去內建中找。

int(2.9) # 內建作用域

g_count =

0# 全域性作用域

defouter():

o_count =

1# 閉包函式外的函式中

definner():

i_count =

2# 區域性作用域

1def

fun1():

global num # 需要使用 global 關鍵字宣告

print(num)

num =

123print(num)

fun1()

outer():

num =

10def

inner():

nonlocal num # nonlocal關鍵字宣告

num =

100print(num)

inner()

print(num)

outer()

lambda的主體是乙個表示式,而不是乙個**塊。僅僅能在lambda表示式中封裝有限的邏輯進去。

lambda 函式擁有自己的命名空間,且不能訪問自己引數列表之外或全域性命名空間裡的引數。

sum=

lambda

arg1, arg2: arg1 + arg2;

# 呼叫sum函式

print ("相加後的值為 : "

, sum( 10, 20 ))

print ("相加後的值為 : "

, sum( 20, 20 ))

type() 不會認為子類是一種父類型別,不考慮繼承關係。

isinstance() 會認為子類是一種父類型別,考慮繼承關係。

如果要判斷兩個型別是否相同推薦使用 isinstance()。

type(name, bases, dict)

bases -- 基類的元組。

dict -- 字典,類內定義的命名空間變數。

>>

>

type(1)

<

type

'int'

>

>>

>

type('runoob'

)<

type

'str'

>

>>

>

type([2])

<

type

'list'

>

>>

>

type()

<

type

'dict'

>

>>

> x =

1>>

>

type( x ) ==

int# 判斷型別是否相等

true

# 三個引數

>>

>

class

x(object):

... a =

1...

>>

> x =

type('x'

, (object,), dict(a

=1)) # 產生乙個新的型別 x

>>

> x

<

class

'__main__.x'

>

a: pass

class

b(a):

pass

isinstance(a(), a) # returns true

type(a()) == a # returns true

isinstance(b(), a) # returns true

type(b()) == a # returns false

內嵌函式必須引用乙個定義在閉合範圍內(外部函式裡)的變數——內部函式引用外部變數

外部函式必須返回內嵌函式——必須返回那個內部函式

funx():

x=5def

funy():

nonlocal x

x+=1return x

return funy

> a=funx()

>>

> a()

6>>

> a()

7>>

> a()

8>>

> a()

9>>

> x

traceback (most recent call last):

file "

", line 1, in

xnameerror: name 'x'

isnot defined

>>

>

但是最後的錯誤說明x並不是乙個全域性變數。其

實這就是閉包的乙個十分淺顯的作用,形成閉包之後,閉包變數能夠隨著閉包函式的呼叫而實時更新,就好像是乙個全域性變數那樣。

> a.__closure__

(object at 0x00000000667d02d0

>,)

>>

>

type(a.__closure__)

<

class

'tuple'

>

>>

>

type(a.__closure__[0])

<

class

'cell'

>

>>

> a.__closure__[0].cell_contents

9>>

> a()

10>>

> a.__closure__[0].cell_contents

10>>

>

deftest():pass

>>

> test.__closure__==

none

true

>>

>

元組裡面的物件為cell物件,而訪問cell物件的cell_contents屬性則可以得到閉包變數的當前值(即上一次呼叫之後的值)。

而隨著閉包的繼續呼叫,變數會再次更新。

所以可見,一旦形成閉包之後,python確實會將__closure__和閉包函式繫結作為儲存閉包變數的場所。

python3函式語法 Python3

python3 degrees 函式 描述degrees 將弧度轉換為角度。語法以下是 degrees 方法的語法 import math math.degrees x 注意 degrees 是不能直接訪問的,需要匯入 math 模組,然後通過 math 靜態物件呼叫該方法。引數x 乙個數值。返回值...

python3基礎語法 對String基本操作

1.拼接 包含字串拼接數字 1 使用 作為字串的拼接運算子 2 字串與數字進行拼接時,需要將數字轉換成字串 使用 str 或 repr 函式 str1 這是 str2 funny p 99.8 print str1 str2 結果為 這是 funny print str1 str p 使用str 將...

Python3基礎系列 基本入門語法

本文簡單地介紹了python的一些基本入門知識,通過對這些知識的了解,大家可以寫一些簡單的 同時也為後面深入理解打下基礎。本文的主要內容如下 值 即value,通常有 1,2,3.1415,bright rose 型別 不同的值有不同的型別。值型別 1int型 整型 bright str字串型 3....