python 11期 第四天

一、冒泡排序


第二種冒泡排序:

li = [89,22,63,11,43,2,47,21,1,97,73]

for a in range(len(li)-1):
    for b in range(a+1,len(li)):
        if li[a] > li[b]:
            li[a],li[b]=li[b],li[a]
print li

列出來兩個序列,a是從第一個到倒數第二個,b是從第二個到倒數第一個,然後兩個序列的列表值做比較,大的換位置。


二、更改配置文件

1、查詢配置,原有文件中有此節點,將此節下的記錄列出來

def look_setup(site):

    with open('G:\doc\setup.conf') as f:

        li=[]

        flag=False

        for line in f:

            lookline='backend %s' % site

            if line.strip() == lookline:

                flag=True

                continue

            if line.strip().startswith('backend'):

                break

            if flag and line.strip():

                li.append(line.strip())

    return li

此函數用來查詢,調用此函數:

retu=look_setup('www.oldboy.org')

print retu


2、增加一行記錄。

先判斷節點backend是否存在,如果存在,再判斷新節點是否已經存在,如果存在就不再添加,如果不存在則要添加;如果backend不存在,則把backend和記錄同時添加到文件末尾。


3、刪除一行記錄或backend節點

先判斷記錄是否存在,如果存在就刪除;判斷backend節點是否存在,存在則刪除。



三、lambda表達式

lambda表達式可以將簡易的函數用一行來表示,如:

def func(name):

        return name * 2

下面一句,等同於上面兩句,可以直接調用func2函數。

func2=lambda name:name *2


func2=lambda **x:x

a={'wang':24,'zhi':42}
print func2(**a)


lambda用來處理簡單邏輯,自動return.


四、內置函數之序列操作系列

1、map 對序列中的每個元素進行操作,最終返回一個新的序列

wKioL1ZRo8mQR44DAACrrHMspIA852.png

>>> a=(14,35,63)

>>> print map(lambda x:x+50,a)

[64, 85, 113]

##a是列表或元組,遍歷a傳給前面的lambda的匿名函數,這兩個做爲map的兩個參數。


li=[23,89,1,1]
li2=[11,42,53,35]

print map(lambda a,b:a+b,li,li2)

li和li2兩個列表元素的數量要相等,否則會報錯。


2、filter 對序列中的元素進行篩選 ,返回符合條件的序列。

wKiom1ZRo5jyCOkhAADQAeLhMWQ795.png

filter()函數爲過濾生成新列表,當在第一個功能函數內返回True時候,才把元素放到新列表中,否則過濾掉

li=[15,22,66,43]

def test(num):

        if num>40:

                return True

        else:

                return False

print filter(test,li)

##filter(function, sequence) 返回一個 sequence(序列),包括了給定序列中所有調用 function(item) 後返回值爲 true 的元素(如果可能的話,會返回相同的類型)。如果該 序列 (sequence)是一個 str, unicode 或者 tuple,返回值必定是同一類型,否則,它總是 list。


li=[23,89,False,'',0]

print filter(None,li)

如果filter的參數爲None, 則只取序列中爲True的數值。


3、reduce 對序列進行累計操作,最後返回一個值。


li=[11,42,53,35]

print reduce(lambda a,b:a+b,li)


五、yield生成器


def abc():

  yield 2

  yield 4

  yield 7

>>> abc()

<generator object abc at 0x7f7f873a5640>

yield只有在循環調用時候,纔會生效,執行時yield能記錄上次循環執行的位置,下次循環直接從下一步開始:


def func(b):

    a=0

    while True:

        a+=1

        if a>b:

            return

        else:

            yield a

此函數也只有在for循環調用時纔會打印。


六、裝飾器


在不用裝飾器的情況下,如果想給home函數增加功能,又不想改原home的代碼

def home():

    print "Welcome to back"


可用以下方法:

def inclues(fun):

    print "This is append"

    return fun()


home=inclues(home)

以上方法雖然沒有home的原代碼,但是改變了接口的調用方式。


def inclues(fun):

    print "This is append"

    return fun

home=inclues(home)


home()

上面的方法就是在不改變源代碼 ,又不改變調用接口的情況下實現了添加新功能的需求。

這就是裝飾器的分解,


裝飾器方法如下:

def inclues(fun):

    print "This is append"

    return fun

@inclues

def home():

    print "Welcome to back"

home()

裝飾器要放在函數的上面,函數纔可以調用。

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