1. 程式人生 > >內建函數(builtins)和functools

內建函數(builtins)和functools

ash fun bcd 不能 linux ems import 註意 tlist

內建函數

Build-in Function,啟動python解釋器,輸入dir(__builtins__), 可以看到很多python解釋器啟動後默認加載的屬性和函數,這些函數稱之為內建函數, 這些函數因為在編程時使用較多,cpython解釋器用c語言實現了這些函數,啟動解釋器 時默認加載。

這些函數數量眾多,不宜記憶,開發時不是都用到的,待用到時再help(function), 查看如何使用,或結合百度查詢即可,在這裏介紹些常用的內建函數。

range

    range(stop) -> list of integers
    range(start, stop[, step]) -> list of integers
  • start:計數從start開始。默認是從0開始。例如range(5)等價於range(0, 5);
  • stop:到stop結束,但不包括stop.例如:range(0, 5) 是[0, 1, 2, 3, 4]沒有5
  • step:每次跳躍的間距,默認為1。例如:range(0, 5) 等價於 range(0, 5, 1)

python2中range返回列表,python3中range返回一個叠代值。如果想得到列表,可通過list函數

a = range(5)
list(a)

創建列表的另外一種方法

In [21]: testList = [x+2 for x in range(5)]

In [22]: testList
Out[22]: [2, 3, 4, 5, 6]

map函數

map函數會根據提供的函數對指定序列做映射

    map(...)
        map(function, sequence[, sequence, ...]) -> list
  • function:是一個函數
  • sequence:是一個或多個序列,取決於function需要幾個參數
  • 返回值是一個list

參數序列中的每一個元素分別調用function函數,返回包含每次function函數返回值的list。

#函數需要一個參數
map(lambda x: x*x, [1, 2, 3])
#結果為:[1, 4, 9]

#函數需要兩個參數
map(lambda x, y: x+y, [1, 2, 3], [4, 5, 6])
#結果為:[5, 7, 9]


def f1( x, y ):  
    return (x,y)

l1 = [ 0, 1, 2, 3, 4, 5, 6 ]  
l2 = [ ‘Sun‘, ‘M‘, ‘T‘, ‘W‘, ‘T‘, ‘F‘, ‘S‘ ]
l3 = map( f1, l1, l2 ) 
print(list(l3))
#結果為:[(0, ‘Sun‘), (1, ‘M‘), (2, ‘T‘), (3, ‘W‘), (4, ‘T‘), (5, ‘F‘), (6, ‘S‘)]

filter函數

filter函數會對指定序列執行過濾操作

filter(...)
    filter(function or None, sequence) -> list, tuple, or string

    Return those items of sequence for which function(item) is true.  If
    function is None, return the items that are true.  If sequence is a tuple
    or string, return the same type, else return a list.
  • function:接受一個參數,返回布爾值True或False
  • sequence:序列可以是str,tuple,list

filter函數會對序列參數sequence中的每個元素調用function函數,最後返回的結果包含調用結果為True的元素。

返回值的類型和參數sequence的類型相同

返回值的類型和參數sequence的類型相同

filter(lambda x: x%2, [1, 2, 3, 4])
[1, 3]

filter(None, "she")
‘she‘

reduce函數

reduce函數,reduce函數會對參數序列中元素進行累積

reduce(...)
    reduce(function, sequence[, initial]) -> value

    Apply a function of two arguments cumulatively to the items of a sequence,
    from left to right, so as to reduce the sequence to a single value.
    For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates
    ((((1+2)+3)+4)+5).  If initial is present, it is placed before the items
    of the sequence in the calculation, and serves as a default when the
    sequence is empty.
  • function:該函數有兩個參數
  • sequence:序列可以是str,tuple,list
  • initial:固定初始值

reduce依次從sequence中取一個元素,和上一次調用function的結果做參數再次調用function。 第一次調用function時,如果提供initial參數,會以sequence中的第一個元素和initial 作為參數調用function,否則會以序列sequence中的前兩個元素做參數調用function。 註意function函數不能為None。

reduce(lambda x, y: x+y, [1,2,3,4])
10

reduce(lambda x, y: x+y, [1,2,3,4], 5)
15

reduce(lambda x, y: x+y, [‘aa‘, ‘bb‘, ‘cc‘], ‘dd‘)
‘ddaabbcc‘

在Python3裏,reduce函數已經被從全局名字空間裏移除了, 它現在被放置在fucntools模塊裏用的話要先引入: from functools import reduce

sorted函數

sorted(...)
    sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list

技術分享圖片

集合set

集合與之前列表、元組類似,可以存儲多個數據,但是這些數據是不重復的

集合對象還支持union(聯合), intersection(交), difference(差)和sysmmetric_difference(對稱差集)等數學運算.

>>> x = set(‘abcd‘)
>>> x
{‘c‘, ‘a‘, ‘b‘, ‘d‘}
>>> type(x)
<class ‘set‘>
>>> 
>>> 
>>> y = set([‘h‘,‘e‘,‘l‘,‘l‘,‘o‘])
>>> y
{‘h‘, ‘e‘, ‘o‘, ‘l‘}
>>> 
>>> 
>>> z = set(‘spam‘)
>>> z
{‘s‘, ‘a‘, ‘m‘, ‘p‘}
>>> 
>>> 
>>> y&z #交集
set()
>>> 
>>> 
>>> x&z #交集
{‘a‘}
>>> 
>>> 
>>> x|y #並集
{‘a‘, ‘e‘, ‘d‘, ‘l‘, ‘c‘, ‘h‘, ‘o‘, ‘b‘}
>>> 
>>> x-y #差集
{‘c‘, ‘a‘, ‘b‘, ‘d‘}
>>> 
>>> 
>>> x^z #對稱差集(在x或z中,但不會同時出現在二者中)
{‘m‘, ‘d‘, ‘s‘, ‘c‘, ‘b‘, ‘p‘}
>>> 
>>> 
>>> len(x)
4
>>> len(y)
4
>>> len(z)
4
>>>

functools

functools 是python2.5被引人的,一些工具函數放在此包裏。

python2.7中

技術分享圖片

python3.5中

import functools
dir(functools)

運行結果:

[‘MappingProxyType‘,
 ‘RLock‘,
 ‘WRAPPER_ASSIGNMENTS‘,
 ‘WRAPPER_UPDATES‘,
 ‘WeakKeyDictionary‘,
 ‘_CacheInfo‘,
 ‘_HashedSeq‘,
 ‘__all__‘,
 ‘__builtins__‘,
 ‘__cached__‘,
 ‘__doc__‘,
 ‘__file__‘,
 ‘__loader__‘,
 ‘__name__‘,
 ‘__package__‘,
 ‘__spec__‘,
 ‘_c3_merge‘,
 ‘_c3_mro‘,
 ‘_compose_mro‘,
 ‘_convert‘,
 ‘_find_impl‘,
 ‘_ge_from_gt‘,
 ‘_ge_from_le‘,
 ‘_ge_from_lt‘,
 ‘_gt_from_ge‘,
 ‘_gt_from_le‘,
 ‘_gt_from_lt‘,
 ‘_le_from_ge‘,
 ‘_le_from_gt‘,
 ‘_le_from_lt‘,
 ‘_lru_cache_wrapper‘,
 ‘_lt_from_ge‘,
 ‘_lt_from_gt‘,
 ‘_lt_from_le‘,
 ‘_make_key‘,
 ‘cmp_to_key‘,
 ‘get_cache_token‘,
 ‘lru_cache‘,
 ‘namedtuple‘,
 ‘partial‘,
 ‘partialmethod‘,
 ‘reduce‘,
 ‘singledispatch‘,
 ‘total_ordering‘,
 ‘update_wrapper‘,
 ‘wraps‘]

python3中增加了更多工具函數,做業務開發時大多情況下用不到,此處介紹使用頻率較高的2個函數。

partial函數(偏函數)

把一個函數的某些參數設置默認值,返回一個新的函數,調用這個新函數會更簡單。

import functools

def showarg(*args, **kw):
    print(args)
    print(kw)

p1=functools.partial(showarg, 1,2,3)
p1()
p1(4,5,6)
p1(a=‘python‘, b=‘itcast‘)

p2=functools.partial(showarg, a=3,b=‘linux‘)
p2()
p2(1,2)
p2(a=‘python‘, b=‘itcast‘)

技術分享圖片

wraps函數

使用裝飾器時,有一些細節需要被註意。例如,被裝飾後的函數其實已經是另外一個函數了(函數名等函數屬性會發生改變)。

添加後由於函數名和函數的doc發生了改變,對測試結果有一些影響,例如:

def note(func):
    "note function"
    def wrapper():
        "wrapper function"
        print(‘note something‘)
        return func()
    return wrapper

@note
def test():
    "test function"
    print(‘I am test‘)

test()
print(test.__doc__)

運行結果

note something
I am test
wrapper function

所以,Python的functools包中提供了一個叫wraps的裝飾器來消除這樣的副作用。例如:

import functools
def note(func):
    "note function"
    @functools.wraps(func)
    def wrapper():
        "wrapper function"
        print(‘note something‘)
        return func()
    return wrapper

@note
def test():
    "test function"
    print(‘I am test‘)

test()
print(test.__doc__)

運行結果

note something
I am test
test function

內建函數(builtins)和functools