python修飾函數
❶ python 中 @ 是什麼意思
修飾符,比如說
class A:
@staticmethod
def m(self):
pass
就相當於
class A:
def m(self):
pass
m = staticmethod(m)
其實就是一調用一個函數參數為下行的變數,並且替換它
(1)python修飾函數擴展閱讀:
函數修飾符
@用做函數的修飾符,可以在模塊或者類的定義層內對函數進行修飾,出現在函數定義的前一行,不允許和函數定義在同一行。
一個修飾符就是一個函數,它將被修飾的函數作為參數,並返回修飾後的同名函數或其他可調用的東西。
在Python的函數中偶爾會看到函數定義的上一行有@functionName的修飾,當解釋器讀到@這樣的修飾符的時候會優先解除@後的內容,直接就把@的下一行的函數或者類作為@後邊函數的參數,然後將返回值賦給下一個修飾的函數對象。
❷ python函數里定義的類
#Python 2.5
#這個可以用修飾器來完成
#但是一般不會限制參數類型
#給你個思路:
def argfilter(*types):
def deco(func): #這是修飾器
def newfunc(*args): #新的函數
if len(types)==len(args):
correct = True
for i in range(len(args)):
if not isinstance(args[i], types[i]): #判斷類型
correct = False
if correct:
return func(*args) #返回原函數值
else:
raise TypeError
else:
raise TypeError
return newfunc #由修飾器返回新的函數
return deco #返回作為修飾器的函數
@argfilter(int, str) #指定參數類型
def func(i, s): #定義被修飾的函數
print i, s
#之後你想限制類型的話, 就這樣:
#@argfilter(第一個參數的類名, 第二個參數的類名, ..., 第N個參數的類名)
#def yourfunc(第一個參數, 第一個參數, ..., 第N個參數):
# ...
#
#相當於:
#def yourfunc(第一個參數, 第一個參數, ..., 第N個參數):
# ...
#yourfunc = argfilter(第一個參數的類名, 第二個參數的類名, ..., 第N個參數的類名)(yourfunc)
❸ Python 中的 classmethod 和 staticmethod 有什麼具體用途
classmethod:類方法
staticmethod:靜態方法
在python中,靜態方法和類方法都是可以通過類對象和類對象實例訪問。但是區別是:
@classmethod 是一個函數修飾符,它表示接下來的是一個類方法,而對於平常我們見到的則叫做實例方法。類方法的第一個參數cls,而實例方法的第一個參數是self,表示該類的一個實例。
普通對象方法至少需要一個self參數,代表類對象實例
類方法有類變數cls傳入,從而可以用cls做一些相關的處理。並且有子類繼承時,調用該類方法時,傳入的類變數cls是子類,而非父類。對於類方法,可以通過類來調用,就像C.f(),有點類似C++中的靜態方法, 也可以通過類的一個實例來調用,就像C().f(),這里C(),寫成這樣之後它就是類的一個實例了。
靜態方法則沒有,它基本上跟一個全局函數相同,一般來說用的很少
Example 1:
>>>classa():
@staticmethod
defstaticm():
print'static'
defnormalm(self):
print'nomarl',self
@classmethod
defclassm(cls):
print'class',cls
>>>a1=a()
>>>a1.normalm()
nomarl<__main__.ainstanceat0x84dddec>
>>>a1.staticm()
static
>>>a1.classm()
class__main__.a
>>>type(a)
<type'classobj'>
>>>type(a1)
<type'instance'>
Example 2:
classA(object):
@classmethod
defcm(cls):
print'類方法cm(cls)調用者:',cls.__name__
@staticmethod
defsm():
print'靜態方法sm()被調用'
classB(A):
pass
A.cm()
B.cm()
A.sm()
B.sm()
輸出:
類方法cm(cls)調用者:A
類方法cm(cls)調用者:B
靜態方法sm()被調用
靜態方法sm()被調用
@classmethod與@staticmethod的應用實例
#!/usr/bin/envpython
#-*-coding:utf-8-*-
classTClassStatic(object):
obj_num=0
def__init__(self,data):
self.data=data
TClassStatic.obj_num+=1
defprintself(self):
print("self.data:",self.data)
@staticmethod
defsmethod():
print("thenumberofobjis:",TClassStatic.obj_num)
@classmethod
defcmethod(cls):
print("cmethod:",cls.obj_num)
cls.smethod()
defmain():
objA=TClassStatic(10)
objB=TClassStatic(12)
objB.printself()
objA.smethod()
objB.cmethod()
print("------------------------------")
TClassStatic.smethod()
TClassStatic.cmethod()
if__name__=="__main__":
main()
輸出結果如下:
('self.data:',12)
('thenumberofobjis:',2)
('cmethod:',2)
('thenumberofobjis:',2)
------------------------------
('thenumberofobjis:',2)
('cmethod:',2)
('thenumberofobjis:',2)
❹ python所有內置函數的定義詳解
1、定義函數
函數是可重用的程序。本書中已經使用了許多內建函數,如len()函數和range()函數,但是還沒自定義過函數。定義函數的語法格式如下:
def 函數名(參數):
函數體
定義函數的規則如下:
①關鍵字def用來定義一個函數,它是define的縮寫。
②函數名是函數的唯一標識,函數名的命名規則遵循標識符的命名規則。
③函數名後面一定要緊跟著一個括弧,括弧內的參數是可選的,括弧後面要有冒號。
④函數體(statement)為一個或一組Python語句,注意要有縮進。
⑤函數體的第一行可以有文檔字元串,用於描述函數的功能,用三引號括起來。
按照定義規則,可以定義第一個函數了:
>>>defhello_world():
...print('Hello,world!')#注意函數體要有縮進
...
>>>hello_world()
Hello,world!
>>>a=100#全局變數
>>>deftest1():
...print(a)
...
>>>deftest2():
...print(a)
...
>>>test1()
100
>>>test2()
100
>>>deftest1():
...a=100#局部變數
...print(a)
...
>>>deftest2():
...print(a)
...
>>>test1()
100
>>>print(a)
Traceback(mostrecentcalllast):
File"<stdin>",line1,in<mole>
NameError:name'a'isnotdefined
>>>test2()
Traceback(mostrecentcalllast):
File"<stdin>",line1,in<mole>
File"<stdin>",line2,intest2
NameError:name'a'isnotdefined
>>>deftest1():
...globala#全局變數
...a=100
...print(a)
...
>>>deftest2():
...print(a)
...
>>>test1()
100
>>>print(a)
100
>>>test2()
100
>>>a=100#全局變數
>>>deftest1():
...a=200#同名局部變數
...print(a)
...
>>>deftest2():
...print(a)
...
>>>test1()
200
>>>test2()
100
這個函數不帶任何參數,它的功能是列印出「Hello,world!」。最後一行代碼hello_world()是調用函數,即讓Python執行函數的代碼。
2、全局變數和局部變數
全局變數是定義在所有函數外的變數。例如,定義一個全局變數a,分別在函數test1()和test2()使用變數a:
定義了全局變數a之後,在函數test1()和test2()內都可以使用變數a,由此可知,全局變數的作用范圍是全局。
局部變數是在函數內定義的變數,除了用關鍵字global修飾的變數以外。例如,在函數test1()內定義一個局部變數a,分別在函數外和另一個函數test2()內使用變數a:
Python解釋器提示出錯了。由於局部變數a定義在函數test1()內,因此,在函數test1()內可以使用變數a,但是在函數外或者另一個函數test2()內使用變數a,都會報錯,由此可見,局部變數的作用范圍是定義它的函數內部。
一般情況下,在函數內聲明的變數都是局部變數,但是採用關鍵字global修飾的變數卻是全局變數:
這個程序與上個程序相比,只是在函數test1()中多了一行代碼「global a」,程序便可以正確運行了。在函數test1()中,採用關鍵字global修飾了變數a之後,變數a就變成了全局變數,不僅可以在該函數內使用,還可以在函數外或者其他函數內使用。
如果在某個函數內局部變數與全局變數同名,那麼在該函數中局部變數會覆蓋全局變數:
由於在函數test1()中定義了一個與全局變數同名的局部變數a,因此,在函數test1()中全局變數a的值被局部變數覆蓋了,但是在函數test2()中全局變數a的值沒有被覆蓋。
綜上所述,在Python中,全局變數保存的數據供整個腳本文件使用;而局部變數只用於臨時保存數據,變數僅供局部代碼塊使用。
❺ python的高級特徵及用法介紹
【導讀】Python 是一種美麗的語言,它簡單易用卻非常強大。任何編程語言的高級特徵通常都是通過大量的使用經驗才發現的。比如你在編寫一個復雜的項目,並在
stackoverflow 上尋找某個問題的答案,然後你突然發現了一個非常優雅的解決方案,它使用了你從不知道的 Python
功能,下面就給大家進行python的高級特徵及用法介紹。
1、Map 函數
Map() 是一種內置的 Python
函數,它可以將函數應用於各種數據結構中的元素,如列表或字典。對於這種運算來說,這是一種非常干凈而且可讀的執行方式。
2、Lambda 函數
Lambda 函數是一種比較小的匿名函數——匿名是指它實際上沒有函數名。
Python 函數通常使用 def a_function_name() 樣式來定義,但對於 lambda 函數,我們根本沒為它命名。這是因為 lambda
函數的功能是執行某種簡單的表達式或運算,而無需完全定義函數。
lambda 函數可以使用任意數量的參數,但表達式只能有一個。
3、Generator 函數
Generator 函數是一個類似迭代器的函數,即它也可以用在 for 循環語句中。這大大簡化了你的代碼,而且相比簡單的 for
循環,它節省了很多內存。
4、Filter 函數
filter 內置函數與 map 函數非常相似,它也將函數應用於序列結構(列表、元組、字典)。二者的關鍵區別在於 filter() 將只返回應用函數返回
True 的元素。
5、Itertools 模塊
Python 的 Itertools 模塊是處理迭代器的工具集合。迭代器是一種可以在 for 循環語句(包括列表、元組和字典)中使用的數據類型。
使用 Itertools 模塊中的函數讓你可以執行很多迭代器操作,這些操作通常需要多行函數和復雜的列表理解。
以上就是python的高級特徵及用法介紹,希望對於大家的python學習能有所幫助,想要學習更多的python高級技能,希望大家持續關注!