內置函數:
一、map
對序列的每一個元素進行操作,最終獲得操作後的新序列。
實例:
#!/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
篩選序列中符合的元素,把符合條件的元素組成一個新的序列。
實例:
#!/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
對序列中的所有元素進行累加
實例:
#!/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]