今天開始學Python(type,str,dir及其他內置函數)

Python 有小部分相當有用的內置函數。除這些函數之外,其它所有的函數都

被分到了各個模塊中。其實這是一個非常明智的設計策略,避免了核心語言

變得像其它腳本語言一樣臃腫


1. type函數

用於返回任意對象的數據類型, 在types模塊中列出了可能的數據類型.

>>> type(1) 
<class 'int'>
>>> type((1,))
<class 'tuple'>
>>> type("here")
<class 'str'>
>>> type(help)
<class 'site._Helper'>
>>> type(sys)
<class 'module'>
>>> import(types)
>>> type(sys) == types.ModuleType
True


1.1 type 可以接收任何東西作爲參數,並返回它的數據類型,

整數、字符串、元組、函數、類、模塊甚至類型對象都可以被接受

1.2 可以用types模塊中的常量與type返回值做比較



2. str函數

str 將數據強制轉換爲字符串。每種數據類型都可以強制轉換爲字符串。


>>> str(1)
'1'
>>> list = ['a','b',[1,2,3]]
>>> str(list)
"['a', 'b', [1, 2, 3]]"
>>> import my.test
>>> str(my.test)
"<module 'my.test' from 'C:\\Study\\Python\\test\\src\\my\\test.py'>"
>>> str(my.test.init)
'<function init at 0x010AA9C0>'
>>> str(help)
'Type help() for interactive help, or help(object) for help about object.'
>>> str(None)
'None'

2.1 對於各種數據類型,顯然可以想象得到的結果

2.2 str還可以作用於函數,類,模塊.

2.3 str作用於函數時,可能有兩種情況, 一是返回函數的__doc__對象, 如help函數

       若是沒有, 則返回'<function init at 0x010AA9C0>' 這樣的形式, init是函數名, 0x010AA9C0是地址

2.4 str作用於模塊時, 會返回模塊在磁盤上的路徑名

2.5 None是Python的null值



3. dir 函數

dir函數會返回一個對象所有的屬性和方法的列表,

注意返回的列表只包含字符串形式的名稱,並不是方法(屬性)本身


>>> map = {"val":12}
>>> dir(map)
['__class__', '__contains__', '__delattr__', '__delitem__', '__doc__', '__eq__', 
'__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__',
 '__init__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', 
'__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', 
'__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys',
 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']


舉個字典的例子, 後面的keys,items,values還眼熟嗎?不記得的話看這裏


4. callable函數

這個函數可以接受任何對象作爲參數, 如果參數對象可調用, 返回True, 否則返回False

可調用的對象包括函數,類方法,甚至類自身

>>> callable(sys)
False
>>> callable(sys.path)
False
>>> callable(help)
True
>>> callable(callable)
True

任何可調用的對象都有 doc string。通過將 callable 函數作用於一個對象的每個屬性,

可以確定哪些屬性 (方法、函數、類) 是你要關注的,

哪些屬性 (常量等等) 是你可以忽略、之前不需要知道的。


5. getattr函數

getattr 是一個有用到令人無法致信的內置函數,

可以返回任何對象的任何屬性

>>> li = ['a','b']
>>> li.append
<built-in method append of list object at 0x010B1C88>
>>> getattr(li,'append')
<built-in method append of list object at 0x010B1C88>
>>> getattr(li,'append')("try")
>>> li
['a', 'b', 'try']
上面的例子中, 對象是個list, 屬性是append方法

此時, getattr返回的就是一個方法的引用,然後你就可以調用這個函數, 

但是實際上你沒有直接調用函數;只是以字符串形式指定了函數名稱。


getattr 常見的使用模式是作爲一個分發者。

舉個例子,如果你有一個程序可以以不同的格式輸出數據,

你可以爲每種輸出格式定義各自的格式輸出函數,

然後使用唯一的分發函數調用所需的格式輸出函數。

getattr作爲分發者的例子:

現在有個模塊my.test

其代碼爲:

def unknowVoice():
    print("I don't know the voice")
def catVoice():
    print("miao")
def dogVoice():
    print("wan")

然後我們可以創建一個分發者:


>>> def getVoice(object):
...        getattr(my.test,"%sVoice" %object)()
...
>>> import my.test
>>> getVoice("cat")
miao
其實這裏還有個問題, 如果我調用getVoice("pig") 會發生什麼結果呢?

是的, 報錯:

>>> getVoice("pig")
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "<console>", line 2, in getVoice
AttributeError: 'module' object has no attribute 'pigVoice'
值得慶幸的是,getattr 能夠使用可選的第三個參數,一個缺省返回值。

因此, 我們如下改動getVoice函數

def getVoice(object):
    getattr(my.test,"%sVoice" %object,my.test.unknowVoice)()

此時:

>>> import my.test
>>> getVoice("pig")
I don't know the voice
如你所見, 第三個參數是一個缺省返回值,

如果第二個參數指定的屬性或者方法沒能找到,則將返回這個缺省返回值。

6. lambda函數

Python 支持一種有趣的語法,它允許你快速定義單行的最小函數。

這些叫做 lambda 的函數,是從 Lisp 借用來的,可以用在任何需要函數的地方。

>>> def f(x):
...     return x*2
...     
>>> f(3)
6
>>> g = lambda x: x*2  #這是一個lambda函數,它的作用與f(x)一樣
>>> g(3)
6
>>> (lambda x: x*2)(3) #直接調用lambda函數
6

注意lambda函數的語法, 參數列表周圍沒有小括號,而且忽略了return關鍵字(因爲整個函數只有一行)

該函數沒有函數名稱,但是可以將它賦值給一個變量進行調用。


總的來說,lambda 函數可以接收任意多個參數 (包括可選參數) 並且返回單個表達式的值。

lambda 函數不能包含命令,包含的表達式不能超過一個。


7. 總結

這些內置函數都歸組到__builtins__(在python 2.x 裏是 __builtin__)這個特殊的模塊下, 

這個模塊裏還有一些內置屬性和內置類(比如錯誤類)

Note. Python 是自文檔化的, 相對於其他大部分語言你需要時不時回顧參考手冊,

python 可以使用help函數,或者自己寫一個幫助者函數來了解這些模塊的使用

以下給出一個幫助者函數

def info(object, spacing=10, collapse=1):
    """Print methods and doc strings.
    
    Takes module, class, list, dictionary, or string."""
    methodList = [method for method in dir(object) if callable(getattr(object, method))]#(1)
    processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)#(2)
    print "\n".join(["%s %s" %                                                     
                      (method.ljust(spacing),
                       processFunc(str(getattr(object, method).__doc__)))               
                     for method in methodList])          #(3)

這個函數就不詳細分析裏, 裏面用到的函數, 上文中都有講述, 來試試自己學了多少進去吧..

如果你對(1)(3)感到困惑, 就看今天開始學Python(映射、過濾list和連接list)

如果你對(2)中的and-or用法困惑, 就看今天開始學Python(and 和 or 運算)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章