前段時間用Python刷了一些題,把刷題的過程遇到的一些小知識點總結了一下,都是一些比較基礎的知識點,特別適合一些剛入門的新手看~
lambda表達式
- lambda表達式是起到一個函數速寫的作用。允許在代碼內嵌入一個函數的定義。它只是一個表達式,函數體比def簡單很多。
- 3個數求和的例子:
>>>f = lambda x,y,z:x+y+z
>>>f(1,2,3)
>>>6
- 而如何要用正常函數實現上述功能的話,需要先用def定義函數名,代碼如下:
>>>def f(x,y,z):
>>> return x+y+z
>>>n = f(1,2,3)
>>>6
filter()、map()和reduce()函數的區別
- filter()函數
- 包括兩個參數,分別是function和list。該函數根據function參數返回的結果是否為真來過濾list參數中的項,最後返回一個新列表,如下例所示:
>>>a=[1,2,3,4,5,6,7]
>>>b=filter(lambda x:x>5, a)
>>print b
>>>[6,7]
- 如果filter參數值為None,就使用identity()函數,list參數中所有為假的元素都將被刪除。如下所示:
>>>a=[0,1,2,3,4,5,6,7]
b=filter(None, a)
>>>print b
>>>[1,2,3,4,5,6,7]
- map()函數
- map()的兩個參數一個是函數名,另一個是列表或元組。
>>>map(lambda x:x+3, a) #這裡的a同上
>>>[3,4,5,6,7,8,9,10] #另一個例子
>>>a=[1,2,3] >>>b=[4,5,6]
>>>map(lambda x,y:x+y, a,b)
>>>[5,7,9]
- 在刷題的過程中,map()函數通常可以結合輸入一起使用,例如在一行中輸入3個整數,可用如下語句:
a,b,c = map(int, input().split())
- reduce()函數
- reduce()函數接收的參數和 map()類似,一個函數 f,一個list,但行為和 map()不同,reduce()傳入的函數 f 必須接收兩個參數,reduce()對list的每個元素反覆調用函數f,並返回最終結果值。
- 例如,編寫一個f函數,接收x和y,返回x和y的和:
def f(x, y):
return x + y
- 調用 reduce(f, [1, 3, 5, 7, 9])時,reduce函數將做如下計算:
- 先計算頭兩個元素:f(1, 3),結果為4;
- 再把結果和第3個元素計算:f(4, 5),結果為9;
- 再把結果和第4個元素計算:f(9, 7),結果為16;
- 再把結果和第5個元素計算:f(16, 9),結果為25;
- 由於沒有更多的元素了,計算結束,返回結果25。
range() 函數用法
- range() 函數可創建一個整數列表,一般用在 for 循環中。語法如下:
- range(start, stop, step)
- 實例:
>>>range(10) # 從 0 開始到 10 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range(1, 11) # 從 1 開始到 11 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> range(0, 30, 5) # 步長為 5 [0, 5, 10, 15, 20, 25]
>>> range(0, 10, 3) # 步長為 3 [0, 3, 6, 9]
>>> range(0, -10, -1) # 負數 [0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
>>> range(0) []
>>> range(1, 0) []
- range 在 for 中的使用:
for i in range(n): # 正序遍歷,表示i的取值從0到n-1
for i in range(n,0,-1): # 倒序遍歷,表示i的取值從n到1
dict字典
- dict字典使用鍵-值(key-value)存儲,具有極快的查找速度。在Java中也稱為map。
- 舉個例子,假設要根據同學的名字查找對應的成績,如果用list實現,需要兩個list:
names = ['Michael', 'Bob', 'Tracy']
scores = [95, 75, 85]
- 給定一個名字,要查找對應的成績,就先要在names中找到對應的位置,再從scores取出對應的成績,list越長,耗時越長。
- 如果用dict實現,只需要一個“名字”-“成績”的對照表,直接根據名字查找成績,無論這個表有多大,查找速度都不會變慢。用Python寫一個dict如下:
>>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
>>> d['Michael'] 95
- 我在刷題的時候,遇到一個問題就是需要在循環中動態往dict添加數據,但是沒有找到添加的函數,其實不用插入函數,循環中動態往dict添加數據也很簡單,如下所示:
dt = {} #先定義一個字典,注意是{},如果定義數組是[]
for i in range(n):
dt[key[i]] = value[i]
sort與sorted的排序問題
- sort參數說明
L.sort(cmp=None, key=None, reverse=False)
- sorted參數說明
sorted(iterable, cmp=None, key=None, reverse=False)
- iterable:是可迭代類型,通常為一個集合;
- cmp:用於比較的函數,比較什麼由key決定,有默認值,迭代集合中的一項;
- key:用列表元素的某個屬性和函數進行作為關鍵字,有默認值,迭代集合中的一項;
- reverse:排序規則. reverse = True 表示降序 或者 reverse = False 表示升序,默認值為False。
- 使用sort()方法對list排序會修改list本身,不會返回新list,使用方法如下:
my_list = [3, 5, 1, 4, 2]
my_list.sort()
print my_list
#輸出:
[1, 2, 3, 4, 5]
- 而使用sorted()方法排序時會返回一個新的list:
my_list = [3, 5, 1, 4, 2]
result = sorted(my_list) #返回一個新的list
print result
#輸出:
[1, 2, 3, 4, 5]
常用的一些零散的小知識
- 求實數的多少次冪
- 正常在java和C語言中,求一個數的冪需要調用一個求冪的函數,但是Python中直接一個運算符就可以搞定了:
#Python求冪
10**2 #10的平方
10**4 #10的4次方
- print(‘xx’,end=’’)中end問題
- end是print()函數的一個參數。end 是輸出語句結束以後附加的字符串,它的默認值是換行(’\n’)。如果輸出的時候不需要換行需要顯示的給end賦值。
- 例如輸出一個數組,每個數之間以空格隔開,可以用如下語句:
for i in range(n):
print(data[i],end=' ') #end值為空格
- 如果只是單純的想要輸出不換行,可以令end='',end值為空字符串
- // 與 / 的區別
- “ / “ 表示浮點數除法,返回浮點結果;
- “ // “ 表示整數除法,返回不大於結果的一個最大的整數
- 【code】
print("6 // 4 = " + str(6 // 4))
print("6 / 4 =" + str(6 / 4))
- 【result】
6 // 4 = 1
6 / 4 =1.5
- 記得用set去除重複元素
- 如果一個數組中有很多重複元素,根據需求需要去除重複元素的話,可以使用set集合,類似於Java的HashSet。
- 語法很簡單,只需一行代碼就可以去重,如下所示:
- 【code】
a = [1,1,2,2,3,4,5]
a = set(a) print(a)
- 【result】
{1, 2, 3, 4, 5}
ps:碼字不易,如果你覺得有幫助的話,幫忙轉發一下吧~
---------------------------------
微信公眾號:輪子工廠,機器學習 | 數據結構與算法 | 源碼分析 | 資源與工具分享
閱讀更多 譚慶波不在家 的文章