Pthon高級編程——10.內建屬性和內建函數

1. 內建屬性

python3.5中類的內建屬性和方法

class Person(object):

    pass


經典類(舊式類),早期如果沒有要繼承的父類,繼承裏空着不寫的類


py2中無繼承父類,稱之經典類,py3中已默認繼承object

class Person:

    pass


子類沒有實現__init__方法時,默認自動調用父類的。 如定義__init__方法時,需自己手動調用父類的__init__方法

__getattribute__例子:

class Test(object):

    def __init__(self,subject1):

        self.subject1 = subject1

        self.subject2 = 'cpp'

    #屬性訪問時攔截器,打log

    def __getattribute__(self,obj):

        if obj == 'subject1':

            print('log subject1')

            return 'redirect python'

        else:   #測試時註釋掉這2行,將找不到subject2

            return object.__getattribute__(self,obj)

    def show(self):

        print('this is Test')

s = Test("python")

print(s.subject1)

print(s.subject2)

運行結果:

log subject1

redirect python

cpp



__getattribute__的坑

    class Person(object):

        def __getattribute__(self,obj):

            print("---test---")

            if obj.startswith("a"):

                return "hahha"

            else:

                return self.test

        def test(self):

            print("heihei")

    t = Person()

    t.a #返回hahha

    t.b #會讓程序死掉

        #原因是:當t.b執行時,會調用Person類中定義的__getattribute__方法,但是在這個方法的執行過程中

        #if條件不滿足,所以 程序執行else裏面的代碼,即return self.test  問題就在這,因爲return 需要把

        #self.test的值返回,那麼首先要獲取self.test的值,因爲self此時就是t這個對象,所以self.test就是

        #t.test 此時要獲取t這個對象的test屬性,那麼就會跳轉到__getattribute__方法去執行,即此時產

        #生了遞歸調用,由於這個遞歸過程中 沒有判斷什麼時候推出,所以這個程序會永無休止的運行下去,又因爲

        #每次調用函數,就需要保存一些數據,那麼隨着調用的次數越來越多,最終內存吃光,所以程序 崩潰

        #

        注意:以後不要在__getattribute__方法中調用self.xxxx

2 .內建函數

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

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

2.1. range

    range(stop) -> list of integers

    range(start, stop[, step]) -> list of integers

· start:計數從start開始。默認是從0開始。例如range5)等價於range0, 5;

· stop:stop結束,但不包括stop.例如:range0, 5) 是[0, 1, 2, 3, 4]沒有5

· step:每次跳躍的間距,默認爲1。例如:range0, 5) 等價於 range(0, 5, 1)

python2range返回列表,python3range返回一個迭代值。如果想得到列表,可通過list函數

a = range(5)

list(a)


創建列表的另外一種方法,快速生成列表,這樣快速生成列表的方式可通過將[]換成(),就可以生成一個迭代器。

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

In [22]: testList

Out[22]: [23456]


2.2 .map函數

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

    map(...)

        map(function, sequence[, sequence, ...]) -> list

· function:是一個函數

· sequence:是一個或多個序列,取決於function需要幾個參數

· 返回值是一個map

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

#函數需要一個參數

map(lambda x: x*x, [123])

#結果爲:[1, 4, 9]

#函數需要兩個參數

map(lambda x, y: x+y, [123], [456])

#結果爲:[5, 7, 9]

def f1( x, y ):  

    return (x,y)

l1 = [ 0123456 ]  

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')]


2.3. 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:接受一個參數,返回布爾值TrueFalse

· sequence:序列可以是strtuplelist

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

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

filter(lambda x: x%2, [1234])

[13]

filter(None"she")

'she'

2.4. 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:序列可以是strtuplelist

· 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

2.5. sorted函數

sorted(...)

    sorted(iterable, key=None, reverse=False) --> new sorted list, reverse=True時反序reverse=False時正序。

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