天天看點

Python基礎學習:内置函數(2)

11. @classmethod

       類方法裝飾器調用的文法糖,它為被裝飾的函數提供最基本的靜态類方法。有關類方法的具體資訊,請參閱标準類型層次結構中關于标準類型層次結構的文檔。

12. compile(source,filename, mode, flags=0, dont_inherit=False, optimize=-1)

       該函數将source編譯成代碼或者AST對象。編譯出的代碼可以被函數exec()或函數eval()執行。被編譯的source的具體存在形式可以是普通的字元串、位元組字元串,或者是AST對象。

       filename參數提供source被讀取的目錄檔案名。如果source不是從檔案中讀取,那麼在此處filename參數通常為<string>。

       mode參數用于指定編譯後代碼的表示格式。如果source由一系列的語句構成,那麼可以用exec()函數執行;如果source隻由表達式組成,呢麼可以用eval()函數執行;如果source由互動式聲明單獨構成,足可以用single()函數執行。

       flags與don’t_inhert都是可選參數,它們決定哪些future_statement語句會影響source的編譯。如果不對兩者進行指派或者指派為0,代碼将與調用compile()函數中生效的future_statement語句同時生效。如果隻給出了flags參數(dont_inhert參數未給出或給出為0),那麼flags指定的future_statement語句也将生效。如果dont_inhert參數被給定了一個非零整型數字,flags就代表那麼圍繞compile()函數生效的future_statement語句。

       optimize參數決定編譯的優化級别。預設值是-1(選擇有-o選項給出的解釋器優化級)。顯式級别為0代表沒有優化、__debug__的值為True;級别1代表斷言被移除、__debug__的值為False;級别2中文檔字元串也會被移除。

13. classcomplex([real[, imag]])

       該類可以用來建構複數,它将傳回一個執行個體化的複數類(複數類也是一個基本的數字類型)。real代表實部,imag代表虛部(可以預設,預設時預設為0)。

該類支援類似如下調用法:

       complex(‘1+2j’)但不支援其中包含空格,

若包含空格如complex(‘1 + 2j’)解釋器将會抛出ValueError錯誤。

14.delattr(object,name)

       object參數應當是一個對象;name參數是一個字元串,該字元串為object對象所包含的某個屬性的名字。delattr()函數将在該對象允許删除該屬性時,删除該對象内被name參數指定的屬性。

例如:

delattr(x,'foobar')  等價于del x.foobar.

15. classdict(**kwarg)

   classdict(mapping, **kwarg)

   classdict(iterable, **kwarg)

       該類執行個體化後創造一個新的字典,創造的字典屬于字典類。

16. dir([object])

       若[object]為空,該函數将傳回本地作用域中的名稱清單;若[object]不為空,該函數将傳回object的有效屬性清單。

       如果object有一個名叫__dir__()的方法(或函數),dir()函數必将傳回object的屬性清單。該原則允許那些可以自定義__getattr__()函數或__getattribute__()函數的對象,自主選擇向dir()函數報告其屬性的方式。

       如果該object不提供__dir__()方法,該函數将盡力從object的__dict__()方法(假如這個方法存在)裡和其類型對象裡收集屬性資訊;但該函數最後收集到的清單内的資訊不一定完整,甚至在__getattr__()存在時會出現錯誤。

       由于該函數緻力于收集最與object相關的資訊,而非最完整的資訊,該函數會對不同類型的對象産生不同的收集機制。

(1)如果object是子產品對象,清單将包含子產品的屬性名;

(2)如果object是一個類型或者類對象,清單将包含其屬性名,并包含其遞歸的屬性所基于的屬性;

(3)至于其他類型的object,清單将包含其屬性名,并且包含其遞歸的屬性所在類的基類。

例如:

>>> importstruct

>>> dir()   # 顯示該子產品空間内的屬性名稱

['__builtins__', '__name__', 'struct']

>>> dir(struct)  # 顯示struct子產品的屬性名稱

['Struct', '__all__', '__builtins__', '__cached__','__doc__', '__file__',

 '__initializing__', '__loader__', '__name__','__package__',

 '_clearcache','calcsize', 'error', 'pack', 'pack_into',

 'unpack','unpack_from']

>>> classShape:

...     def__dir__(self):

...         return ['area', 'perimeter', 'location']

>>> s = Shape()

>>> dir(s)

['area', 'location', 'perimeter']
           

17.divmod(a,b)

       參數a,b為非負數的數字。在使用整數除法時,該函數傳回由a與b的商和餘數組成的一堆數字,其結果類似于(a//b,a%b)。對于混合運算類型(包含浮點數float),該函數啟用二進制算數運算符規則,其結果類似于(q,a%b),q=math.floor(a/b),但q也可以小于1。無論如何,q * b + a%b的結果都十分接近于a(一般不等,這是由于計算機位數有限所必然産生的),如果a%b不為零,則它具有與b相同的符号,并且0<= abs(a%b)<abs(b)。

18. enumerate(iterable,start=0)

       該枚舉函數傳回一個枚舉對象。iterable必須是一個序列、疊代器或者其它可疊代的對象。由enumerate函數傳回的疊代器方法__next__()将輸出一個由計數值(從start參數開始,預設值為0)和可疊代對象的一個順序元素組成的元組。

例如:

>>> seasons= ['Spring','Summer','Fall','Winter']
>>> list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
>>> list(enumerate(seasons, start=1))
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]
           

該函數等價于下列函數:

>>> seasons= ['Spring','Summer','Fall','Winter']
>>> list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
>>> list(enumerate(seasons, start=1))
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]
           

19. eval(expression,globals=None, locals=None)

       參數expression是一個字元串,參數globals、locals屬于可選參數。一旦選擇傳輸globals,其對象應為字典;選擇傳輸locals參數,其對象應為映射對象。

       expression參數所對應的字元串将被解析為Python表達式(或者說是條件清單),它使用globals和locals這兩個參數所對應字典作為全局或本地命名空間。如果globals字典存在并且缺少'__builtins__'方法,則在解析表達式之前将目前全局變量複制到全局變量空間中。 這意味着表達式可以無障礙通路标準的builtins子產品。如果省略了本地字典,則預設為全局字典。 如果兩個字典均被省略,則在調用eval()的環境中執行表達式。傳回值是評估表達式的結果,文法錯誤被報告為例外。

例如:

>>> x =1

>>> eval('x+1')

2
           

20. exec(object[,globals[, locals]])

       這個函數支援Python代碼的動态執行。object必須是字元串或代碼對象。如果它是一個字元串,則将該字元串解析為一組Python語句,然後執行該語句(除非發生文法錯誤)。 如果它是一個代碼對象,它隻是被執行。在任何情況下,執行的代碼都應該作為有效的檔案輸入。請注意,即使在傳遞給exec()函數的代碼的上下文中,return和yield語句也可能不在函數定義之外使用。傳回值是None。

       在所有情況下,如果省略可選部件,則代碼将在目前範圍内執行。如果隻提供全局變量,則它必須是一個字典,它将用于全局變量和局部變量。如果給定全局變量和局部變量,它們分别用于全局變量和局部變量。如果提供,本地人可以是任何映射對象。請記住,在子產品級别,全局變量和本地變量是相同的字典。如果exec擷取兩個單獨的對象作為全局變量和局部變量,那麼代碼将被嵌入類定義中執行。

       如果globals字典不包含鍵__builtins__的值,則将内置子產品的内置字典的引用插入到該鍵下。通過這種方式,您可以通過将自己的__builtins__字典插入到全局變量中,然後将其傳遞給exec(),進而控制可執行代碼可用的内建函數。