① 解析python函數變數如何使用
剛學用Python的時候,特別是看一些庫的源碼時,經常會看到func(*args, **kwargs)這樣的函數定義,這個*和**讓人有點費解。其實只要把函數參數定義搞清楚了,就不難理解了。
先說說函數定義,我們都知道,下面的代碼定義了一個函數funcA
def funcA():
pass
顯然,函數funcA沒有參數(同時啥也不幹:D)。
下面這個函數funcB就有兩個參數了,
def funcB(a, b):
print a
print b
調用的時候,我們需要使用函數名,加上圓括弧擴起來的參數列表,比如 funcB(100, 99),執行結果是:
100
99
很明顯,參數的順序和個數要和函數定義中一致,如果執行funcB(100),Python會報錯的:
TypeError: funcB() takes exactly 2 arguments (1 given)
我們可以在函數定義中使用參數默認值,比如
def funcC(a, b=0):
print a
print b
在函數funcC的定義中,參數b有默認值,是一個可選參數,如果我們調用funcC(100),b會自動賦值為0。
OK,目前為止,我們要定義一個函數的時候,必須要預先定義這個函數需要多少個參數(或者說可以接受多少個參數)。一般情況下這是沒問題的,但是也有在定義函數的時候,不能知道參數個數的情況(想一想C語言里的printf函數),在Python里,帶*的參數就是用來接受可變數量參數的。看一個例子
def funcD(a, b, *c):
print a
print b
print "length of c is: %d " % len(c)
print c
調用funcD(1, 2, 3, 4, 5, 6)結果是
1
2
length of c is: 4
(3, 4, 5, 6)
我們看到,前面兩個參數被a、b接受了,剩下的4個參數,全部被c接受了,c在這里是一個tuple。我們在調用funcD的時候,至少要傳遞2個參數,2個以上的參數,都放到c里了,如果只有兩個參數,那麼c就是一個empty tuple。
好了,一顆星我們弄清楚了,下面輪到兩顆星。
上面的例子里,調用函數的時候,傳遞的參數都是根據位置來跟函數定義里的參數表匹配的,比如funcB(100, 99)和funcB(99, 100)的執行結果是不一樣的。在Python里,還支持一種用關鍵字參數(keyword argument)調用函數的辦法,也就是在調用函數的時候,明確指定參數值付給那個形參。比如還是上面的funcB(a, b),我們通過這兩種方式調用
funcB(a=100, b=99)
和
funcB(b=99, a=100)
結果跟funcB(100, 99)都是一樣的,因為我們在使用關鍵字參數調用的時候,指定了把100賦值給a,99賦值給b。也就是說,關鍵字參數可以讓我們在調用函數的時候打亂參數傳遞的順序!
另外,在函數調用中,可以混合使用基於位置匹配的參數和關鍵字參數,前題是先給出固定位置的參數,比如
def funcE(a, b, c):
print a
print b
print c
調用funcE(100, 99, 98)和調用funcE(100, c=98, b=99)的結果是一樣的。
好了,經過以上鋪墊,兩顆星總算可以出場了:
如果一個函數定義中的最後一個形參有 ** (雙星號)前綴,所有正常形參之外的其他的關鍵字參數都將被放置在一個字典中傳遞給函數,比如:
def funcF(a, **b):
print a
for x in b:
print x + ": " + str(b[x])
調用funcF(100, c='你好', b=200),執行結果
100
c: 你好
b: 200
大家可以看到,b是一個dict對象實例,它接受了關鍵字參數b和c。
② python 高階函數有哪些
1、高階函數
變數可以指向函數,函數的參數可以接收變數,那麼函數可以接收另一個函數作為參數,這種函數稱為高階函數。
(1)把函數作為實參
(2)把函數作為返回值
2、系統的內置高階函數
(1)map函數:接收兩個參數,一個是函數,一個是序列,map將傳入的函數依次作用到序列的每個元素,並且把結果作為新的列表返回
(2)rece函數:把一個函數作用到一個序列上,這個函數必須接收兩個參數,rece把結果和序列的下一個元素做累積計算
(3)filter函數:也接收一個函數和一個序列,和map函數不同的是,filter函數把傳入的函數依次作用於每個元素,然後返回返回值是True的元素
(4)sorted函數:排序函數
把用戶名按照首字母不區分大小寫排序
(5)sorted()函數按照關鍵字排序
關鍵字:商品個數
(6)sorted()函數按照關鍵字排序,用鍵值來查找
(7)lambda匿名函數:有時候傳參數時不需要顯示自定義的函數,直接傳入匿名函數更方便;冒號前面的x,y表示函數參數,匿名函數不需要擔心函數名的沖突,匿名函數也是一個函數對象,可以把匿名函數賦值給一個變數,再利用變數來調用函數,匿名函數也可以作為返回值返回
3、高階函數的應用:
(1)sorted函數:
(2)sorted函數默認是從小到大排序
4、裝飾器
裝飾器就是用來裝飾函數的:想要增加原有函數的功能,但是不希望修改原有函數的定義,在代碼運行期間動態增加功能的方式
(1)此裝飾器的功能:計算函數的運行時間
import functools
@functools.wraps(f) ##保留原有函數的屬性
運行結果:
(2)此裝飾器的功能:用戶登錄認證
運行結果:
(3)此裝飾器的功能:認證用戶的同時,顯示用戶的轉賬金額
import inspect
inspect.getcallargs()將傳的參數封裝為一個字典,字典的key值是形式參數,value值是實參
(4)此裝飾器的功能:確保收到的每個參數都是整數,是整數就求和,否則拋出錯誤
(5)此裝飾器的功能:給裝飾器傳參數,是整數和浮點數就求和
python學習網,大量的免費python視頻教程,歡迎在線學習!
③ Python函數及變數的定義和使用
def <函數名>():
<函數體>
return <返回值>
def <函數名>(非可選參數,可選參數):
<函數體>
return <返回值>
def <函數名>(參數,*b):
<函數體>
return <返回值>
<函數名> = lambda <參數> : <表達式>
例1:f = lambda x , y : x + y
調用:f(6 + 8) 輸出:14
例2: f = lambda : "沒有參數的lambda函數!"
調用: print(f()) 輸出: 沒有參數的lambda函數!
④ python中怎樣查看已載入的命名空間中所有變數和函數
dir()
不加任何參數,便可查看命名空間內所有的變數名、函數名以及導入的模塊的名稱
返回的是一個列表
⑤ python函數高級
一、函數的定義
函數是指將一組語句的集合通過一個名字(函數名)封裝起來,想要執行這個函數,只需要調用函數名即可
特性:
減少重復代碼
使程序變得可擴展
使程序變得易維護
二、函數的參數
2.1、形參和實參數
形參,調用時才會存在的值
實慘,實際存在的值
2.2、默認參數
定義:當不輸入參數值會有一個默認的值,默認參數要放到最後
2.3、 關鍵參數
定義: 正常情況下,給函數傳參數要安裝順序,不想按順序可以用關鍵參數,只需要指定參數名即可,(指定了參數名的就叫關鍵參數),但是要求是關鍵參數必須放在位置參數(以位置順序確定對應的參數)之後
2.4、非固定參數
定義: 如你的函數在傳入參數時不確定需要傳入多少個參數,就可以使用非固定參數
# 通過元組形式傳遞
# 通過列表形式傳遞
# 字典形式(通過k,value的方式傳遞)
# 通過變數的方式傳遞
三、函數的返回值
作用:
返回函數執行結果,如果沒有設置,默認返回None
終止函數運行,函數遇到return終止函數
四、變數的作用域
全局變數和局部變數
在函數中定義的變數叫局部變數,在程序中一開始定義的變數叫全局變數
全局變數作用域整個程序,局部變數作用域是定義該變數的函數
當全局變數與局部變數同名是,在定義局部變數的函數內,局部變數起作用,其他地方全局變數起作用
同級的局部變數不能互相調用
想要函數里邊的變數設置成全局變數,可用global進行設置
五、特殊函數
5.1、嵌套函數
定義: 嵌套函數顧名思義就是在函數里邊再嵌套一層函數
提示 在嵌套函數里邊調用變數是從里往外依次調用,意思就是如果需要調用的變數在當前層沒有就會去外層去調用,依次內推
匿名函數
基於Lambda定義的函數格式為: lambda 參數:函數體
參數,支持任意參數。
匿名函數適用於簡單的業務處理,可以快速並簡單的創建函數。
# 與三元運算結合
5.3、高階函數
定義:變數可以指向函數,函數的參數可以接收變數,那麼一個函數就可以接收另一個函數作為參數,這種函數稱之為高階函數 只需要滿足一下任意一個條件,即是高階函數
接收一個或多個函數作為輸入
return返回另一個函數
5.4、遞歸函數
定義:一個函數可以調用其他函數,如果一個函數調用自己本身,這個函數就稱為遞歸函數
在默認情況下Python最多能遞歸1000次,(這樣設計師是為了防止被內存被撐死)可以通過sys.setrecursionlimit(1500)進行修改
遞歸實現過程是先一層一層的進,然後在一層一層的出來
必須有一個明確的條件結束,要不然就是一個死循環了
每次進入更深層次,問題規模都應該有所減少
遞歸執行效率不高,遞歸層次過多會導致站溢出
# 計算4的階乘 4x3x2x1
# 列印數字從1-100
5.5、閉包現象
定義:內層函數調用外層函數的變數,並且內存函數被返回到外邊去了
閉包的意義:返回的函數對象,不僅僅是一個函數對象,在該函數外還包裹了一層作用域,這使得,該函數無論在何處調用,優先使用自己外層包裹的作用域
⑥ 對python 中class與變數的使用方法詳解
python中的變數定義是很靈活的,很容易搞混淆,特別是對於class的變數的定義,如何定義使用類里的變數是我們維護代碼和保證代碼穩定性的關鍵。
枚舉了各種情況,沒有辦法全部枚舉,但大部分情況應該都已經包含了。
1. 類變數:能夠通過類名或者object的self來訪問到,在類的內部和外部均可達,比如class_var_1
2. 對象變數:可以通過對象的self來使用的變數,通過constructor一路走向去的的self初次被賦值的變數都會成為對象變數,比如object_var_1, object_var_2, object_var_3, object_var_4
3. 內部變數:可以在函數中定義,並加上self前綴,在初次調用過定義的函數後,就可以在後面的對象的函數中被使用,比如internal_var_1
4. 局部變數:在函數內部定義,並使用的變數,在使用完之後就會被回收對類及object不可見
5. 全局變數:定義在類或者函數外部,作用域在變數被定義之後的任意代碼段,比如:global_var_1