python進階 內置函數

內置函數:

一、map

對序列的每一個元素進行操作,最終獲得操作後的新序列。

wKioL1ZPNUnS8qGEAABNLqeWJBc250.png

實例:

#!/usr/bin/env  python
# --*--coding:utf-8 --*--
li = [11, 22, 33]
news = map(lambda a: a + 2, li)
print news
li = [22, 33, 44]
l1 = [11, 22, 33]
news = map(lambda a, b: a - b, li, l1)
print news
li = [11, 22, 33]
news = map(lambda a: a * 2, li)
print news
li = [100, 2200, 3300]
news = map(lambda a: a / 2, li)
print news


實例輸出結果:

[13, 24, 35]
[11, 11, 11]
[22, 44, 66]
[50, 1100, 1650]

序列中的每一個元素經過操作,得出新的序列。兩個序列相互操作必須元素相同,如果不同會造成多出的元素與None相互操作,出現錯誤。

#!/usr/bin/env  python
# --*--coding:utf-8 --*--
li = [22, 33, 44]
l1 = [11, 22]
news = map(lambda a, b: a + b, li, l1)
print news

報錯信息:

Traceback (most recent call last):
  File "D:/s11day2/s11day2/test/test.py", line 5, in <module>
    news = map(lambda a, b: a + b, li, l1)
  File "D:/s11day2/s11day2/test/test.py", line 5, in <lambda>
    news = map(lambda a, b: a + b, li, l1)
TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'

二、filter

篩選序列中符合的元素,把符合條件的元素組成一個新的序列。

wKioL1ZPNVrBm3cUAABOsjtwAUQ651.png

實例:

#!/usr/bin/env  python
# --*--coding:utf-8 --*--
li = [22, 33, 44]
l1 = [11, 22]
news = map(lambda a, b: a + b, li, l1)
print news#!/usr/bin/env  python
# --*--coding:utf-8 --*--
li = [22, 33, 44, 55, 66, 77, 88, 99]
news_list = filter(lambda a: a > 66, li)
print news_list
li = [22, 33, 44, 55, 66, 77, 88, 99]
news_list = filter(lambda a: a > 44 and a < 88 , li)
print news_list

輸出:

[77, 88, 99]
[55, 66, 77]

三、reduce

對序列中的所有元素進行累加

wKioL1ZPNmvD0qsxAABsh2FJz80947.png

實例:

#!/usr/bin/env  python
# --*--coding:utf-8 --*--
li = [22, 33, 44, 55, 66, 77, 88, 99]
news_list = reduce(lambda a, b: a + b, li)
print news_list
li = [22, 33, 44, 55, 66, 77, 88, 99]
news_list = reduce(lambda a, b: a - b, li)
print news_list
li = [22, 33, 44, 55, 66, 77, 88, 99]
news_list = reduce(lambda a, b: a / b, li)
print news_list
li = [22, 33, 44, 55, 66, 77, 88, 99]
news_list = reduce(lambda a, b: a * b, li)
print news_list

輸出結果:

484
-440
0
77786550737280

yield生成器

對比range和xrange的區別:

>>> print range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> print xrange(10)
xrange(10)

range直接打印出來,而xange在需要的時候迭代循環纔會打印出來,

yield是繼續執行上次的操作,如下:

#!/usr/bin/env  python
# --*--coding:utf-8 --*--
def rmange(arg):
    seek = 0
    while True:
        seek = seek + 1
        if seek > arg:
            return
        else:
            yield seek
for i in rmange(10):
    print i

第一步,從行到下執行函數(def rmange(arg):),第二步,執行for,第三步,調用上面的函數,進入while循環進行判斷到yield,第二次for循環的時候直接不用調用def了,直接進入while循環。yiled就是繼續執行上次的操作。可以使用上例進行調試測試。
裝飾器

作用:具有特殊含義的函數,裝飾函數或類。可以在函數執行前或者執行後添加相應的操作。

#!/usr/bin/env  python
# --*--coding:utf-8 --*--
def Before(request,kargs):
    print 'before'
def After(request,kargs):
    print 'after'
def Filter(before_func,after_func):
    def outer(main_func):
        def wrapper(request,kargs):
            before_result = before_func(request,kargs)
            if(before_result != None):
                return before_result;
            main_result = main_func(request,kargs)
            if(main_result != None):
                return main_result;
            after_result = after_func(request,kargs)
            if(after_result != None):
                return after_result;
        return wrapper
    return outer
@Filter(Before, After)
def Index(request,kargs):
    print 'index'
if __name__ == '__main__':
    Index(1,2)

執行結果:

before
index
after

根據python運行規律,從上到下,應該是

before
after
index

冒泡算法

作用:根據簡單的排序,臨近的兩個元素進行比較根據要求按順序排列。

舉例:

需求:請按照從小到大對列表 [13, 22, 6, 99, 11] 進行排序

思路:相鄰兩個值進行比較,將較大的值放在右側,依次比較!

li = [13, 22, 6, 99, 11]
for m in range(4):     # 等價於 #for m in range(len(li)-1):
    if li[m]> li[m+1]:
        temp = li[m+1]
        li[m+1] = li[m]
        li[m] = temp

第二步

li = [13, 22, 6, 99, 11]
for m in range(4):     # 等價於 #for m in range(len(li)-1):
    if li[m]> li[m+1]:
        temp = li[m+1]
        li[m+1] = li[m]
        li[m] = temp
for m in range(3):     # 等價於 #for m in range(len(li)-2):
    if li[m]> li[m+1]:
        temp = li[m+1]
        li[m+1] = li[m]
        li[m] = temp
for m in range(2):     # 等價於 #for m in range(len(li)-3):
    if li[m]> li[m+1]:
        temp = li[m+1]
        li[m+1] = li[m]
        li[m] = temp
for m in range(1):     # 等價於 #for m in range(len(li)-4):
    if li[m]> li[m+1]:
        temp = li[m+1]
        li[m+1] = li[m]
        li[m] = temp
print li

第三步

li = [13, 22, 6, 99, 11]
for i in range(1,5):    
    for m in range(len(li)-i): 
        if li[m] > li[m+1]:
            temp = li[m+1]
            li[m+1] = li[m]
            li[m] = temp
         print li
輸出結果:
[13, 22, 6, 99, 11]
[13, 6, 22, 99, 11]
[13, 6, 22, 11, 99]
[6, 13, 22, 11, 99]
[6, 13, 11, 22, 99]
[6, 11, 13, 22, 99]

第一個是原值,後面是五次循環左右兩個元素對比根據大小排序。

遞歸

程序分析:斐波那契數列(Fibonacci sequence),又稱黃金分割數列,指的是這樣一個數列:0、1、1、2、3、5、8、13、21、34、……。

在數學上,費波那契數列是以遞歸的方法來定義:

F0 = 0     (n=0)
F1 = 1    (n=1)
Fn = F[n-1]+ F[n-2](n=>2)

程序源代碼:

方法一

#!/usr/bin/python
# -*- coding: UTF-8 -*-
def fib(n):
    a,b = 1,1
    for i in range(n-1):
        a,b = b,a+b
    return a
# 輸出了第10個斐波那契數列
print fib(10)

方法二

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 使用遞歸
def fib(n):
    if n==1 or n==2:
        return 1
    return fib(n-1)+fib(n-2)
# 輸出了第10個斐波那契數列
print fib(10)

以上實例輸出了第10個斐波那契數列,結果爲:

55

方法三

如果你需要輸出指定個數的斐波那契數列,可以使用以下代碼:

def fib(n):
    if n == 1:
        return [1]
    if n == 2:
        return [1, 1]
    fibs = [1, 1]
    for i in range(2, n):
        fibs.append(fibs[-1] + fibs[-2])
    return fibs

# 輸出前 10 個斐波那契數列

print fib(10)

以上程序運行輸出結果爲:

[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]




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