Python練習題 一. 使用匿名函數對1~1000求和,代碼力求簡潔。


Python 練習

標簽: Python Python練習題 Python知識點


一.使用匿名函數對1~1000求和,代碼力求簡潔。

答案:

In [1]: from functools import reduce

In [2]: print(reduce(lambda x, y: x + y, range(1, 1001)))
Out[2]: 500500

知識點

1. 匿名函數:lambda 參數:表達式

lambda語句中,開頭先寫關鍵字lambda,冒號前是參數,可以有多個,用逗號隔開;冒號右邊的為表達式,需要注意的是只能有一個表達式。由於lambda返回的是函數對象(構建的是一個函數對象),所以需要定義一個變量去接收。


#### **2. 高階函數**:把函數作為一個參數傳入到另一個函數中 #####**1> ```map()```** python內置的一個高階函數,它接收兩個參數,一個是函數,一個是 Iterable(可遍歷對象,如列表),map將傳入的函數依次作用到序列的每個元素,並把結果作為新的 Iterator(迭代器)返回。 簡單代碼舉例:求f(x)=x*x ```python In [8]: def f1(x): ...: return x * x ...: list1 = range (1, 6) ...: print(list(map(f1, list1))) ...: [1, 4, 9, 16, 25] ```
2> reduce()

reduce把一個函數作用在一個序列[x1, x2, x3, ...]上,這個函數必須接收兩個參數,reduce把結果繼續和序列的下一個元素做累積計算,其效果就是:reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
簡單代碼舉例:對1~1000求和

In [1]: from functools import reduce

In [2]: print(reduce(lambda x, y: x + y, range(1, 1001)))
Out[2]: 500500
3> filter()

Python內建的filter()函數用於過濾序列。和map()類似,filter()也接收一個函數和一個序列。和map()不同的是,filter()把傳入的函數依次作用於每個元素,然后根據返回值是True還是False決定保留還是丟棄該元素。
簡單代碼舉例:過濾掉列表中的基數

In [12]: list(filter(lambda x:x%2==0, range(1,9)))
Out[12]: [2, 4, 6, 8]
4> sorted()

對所有可迭代的對象進行排序操作,返回重新排序的列表。

sort 與 sorted 區別:
sort 是應用在 list 上的方法,sorted 可以對所有可迭代的對象進行排序操作。
list 的 sort 方法返回的是對已經存在的列表進行操作,而內建函數 sorted方法返回的是一個新的 list,而不是在原來的基礎上進行的操作。

語法:sorted(iterable[, cmp[, key[, reverse]]])

參數說明:
iterable -- 可迭代對象。
cmp -- 比較的函數,這個具有兩個參數,參數的值都是從可迭代對象中取出 ,此函數必須遵守的規則為,大於則返回1,小於則返回-1,等於則返回0。
key -- 主要是用來進行比較的元素,只有一個參數,具體的函數的參數就是取自於可迭代對象中,指定可迭代對象中的一個元素來進行排序。
reverse -- 排序規則,reverse = True 降序 , reverse = False 升序(默認)。
簡單代碼舉例:

In [14]: a = [5, 9, 2, 3, 4, 7, 1]

In [15]: b = sorted(a)      # 保留原列表

In [16]: a
Out[16]: [5, 9, 2, 3, 4, 7, 1]

In [18]: b
Out[18]: [1, 2, 3, 4, 5, 7, 9]

In [19]: L=[('b',2),('a',1),('c',3),('d',4)]

In [20]: sorted(L, cmp=lambda x, y:cmp(x[1], y[1]))   # 利用cmp函數
Out[20]: [('a', 1), ('b', 2), ('c', 3), ('d', 4)]

In [21]: sorted(L, key=lambda x:x[1])   #  利用key
Out[21]: [('a', 1), ('b', 2), ('c', 3), ('d', 4)]

In [22]: students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
In [23]: sorted(students, key=lambda s: s[2])   # 按年齡排序
Out[23]: [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

In [24]: sorted(students, key=lambda s: s[2], reverse=True)       # 按降序
Out[24]: [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
 


3. 列表(數組)生成式 ,range與xrange

1> range

range([start,] stop[, step]),根據start與stop指定的范圍以及step設定的步長,生成一個序列。

比如:

In [1]: range(5)
Out[1]: [0, 1, 2, 3, 4]

In [2]: range(1,5)
Out[2]: [1, 2, 3, 4]

In [3]: range(0,6,2)
Out[3]: [0, 2, 4]
2> xrange

xrange 用法與 range 完全相同,所不同的是生成的不是一個list對象,而是一個生成器。
比如:

In [1]: xrange(5)
Out[1]: xrange(5)

In [2]: list(xrange(5))
Out[2]: [0, 1, 2, 3, 4]

In [3]: xrange(1,5)
Out[3]: xrange(1, 5)

In [4]: list(xrange(1,5))
Out[4]: [1, 2, 3, 4]

In [5]: xrange(0,6,2)
Out[5]: xrange(0, 6, 2)

In [6]: list(xrange(0,6,2))
Out[6]: [0, 2, 4]
  • 由上面的示例可以知道:要生成很大的數字序列的時候,用xrange會比range性能優很多,因為不需要一上來就開辟一塊很大的內存空間。
  • xrange 和 range 這兩個基本上都是在循環的時候用。

PS: 部分知識點總結參考自菜鳥教程網廖雪峰的官方網站


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM