【十三】Python中assert的作用?
Python中assert(斷言)用于判斷一個表達式,在表達式條件為 f a l s e false false的時候觸發異常。
斷言可以在條件不滿足程序運行的情況下直接返回錯誤,而不必等待程序運行后出現崩潰的情況。
Rocky直接舉一些例子:
>>> assert True
>>> assert False
Traceback (most recent call last):File "<stdin>", line 1, in <module>
AssertionError
>>> assert 1 == 1
>>> assert 1 == 2
Traceback (most recent call last):File "<stdin>", line 1, in <module>
AssertionError
>>> assert 1 != 2
【十四】Python中互換變量有不用創建臨時變量的方法嗎?
在Python中,當我們想要互換兩個變量的值或將列表中的兩個值交換時,我們可以使用如下的格式進行,不需要創建臨時變量:
x, y = y, x
這么做的原理是什么呢?
首先一般情況下Python是從左到右解析一個語句的,但在賦值操作的時候,因為是右值具有更高的計算優先級,所以需要從右向左解析。
對于上面的代碼,它的執行順序如下:
先計算右值 y , x y , x y,x(這里是簡單的原值,但可能會有表達式或者函數調用的計算過程), 在內存中創建元組(tuple),存儲 y , x y, x y,x分別對應的值;計算左邊的標識符,元組被分別分配給左值,通過解包(unpacking),元組中第一個標示符對應的值 ( y ) (y) (y),分配給左邊第一個標示符 ( x ) (x) (x),元組中第二個標示符對應的值 ( x ) (x) (x),分配給左邊第二個標示符 ( y ) (y) (y),完成了 x x x和 y y y的值交換。
【十五】Python中的主要數據結構都有哪些?
- 列表(list)
- 元組(tuple)
- 字典(dict)
- 集合(set)
【十六】Python中的可變對象和不可變對象?
可變對象與不可變對象的區別在于對象本身是否可變。
可變對象:list(列表) dict(字典) set(集合)
不可變對象:tuple(元組) string(字符串) int(整型) float(浮點型) bool(布爾型)
【十七】Python中的None代表什么?
None是一個特殊的常量,表示空值,其和False,0以及空字符串不同,它是一個特殊Python對象, None的類型是NoneType。
None和任何其他的數據類型比較返回False。
>>> None == 0
False
>>> None == ' '
False
>>> None == None
True
>>> None == False
False
我們可以將None復制給任何變量,也可以給None賦值。
【十八】Python中 ? a r g s *args ?args和 ? ? k w a r g s **kwargs ??kwargs的區別?
? a r g s *args ?args和 ? ? k w a r g s **kwargs ??kwargs主要用于函數定義。我們可以將不定數量的參數傳遞給一個函數。
這里的不定的意思是:預先并不知道函數使用者會傳遞多少個參數, 所以在這個場景下使用這兩個關鍵字。
? a r g s *args ?args
? a r g s *args ?args是用來發送一個非鍵值對的可變數量的參數列表給一個函數。
我們直接看一個例子:
def test_var_args(f_arg, *argv):print("first normal arg:", f_arg)for arg in argv:print("another arg through *argv:", arg)test_var_args('hello', 'python', 'ddd', 'test')-----------------結果如下-----------------------
first normal arg: hello
another arg through *argv: python
another arg through *argv: ddd
another arg through *argv: test
? ? k w a r g s **kwargs ??kwargs
? ? k w a r g s **kwargs ??kwargs允許我們將不定長度的鍵值對, 作為參數傳遞給一個函數。如果我們想要在一個函數里處理帶名字的參數, 我們可以使用 ? ? k w a r g s **kwargs ??kwargs。
我們同樣舉一個例子:
def greet_me(**kwargs):for key, value in kwargs.items():print("{0} == {1}".format(key, value))greet_me(name="yasoob")-----------結果如下-------------
name == yasoob
【十九】Python中Numpy的broadcasting機制?
Python的Numpy庫是一個非常實用的數學計算庫,其broadcasting機制給我們的矩陣運算帶來了極大地方便。
我們先看下面的一個例子:
>>> import numpy as np
>>> a = np.array([1,2,3])
>>> a
array([1, 2, 3])
>>> b = np.array([6,6,6])
>>> b
array([6, 6, 6])
>>> c = a + b
>>> c
array([7, 8, 9])
上面的代碼其實就是把數組 a a a和數組 b b b中同樣位置的每對元素相加。這里 a a a和 b b b是相同長度的數組。
如果兩個數組的長度不一致,這時候broadcasting就可以發揮作用了。
比如下面的代碼:
>>> d = a + 5
>>> d
array([6, 7, 8])
broadcasting會把 5 5 5擴展成 [ 5 , 5 , 5 ] [5,5,5] [5,5,5],然后上面的代碼就變成了對兩個同樣長度的數組相加。示意圖如下(broadcasting不會分配額外的內存來存取被復制的數據,這里只是方面描述):
我們接下來看看多維數組的情況:
>>> e
array([[1., 1., 1.],[1., 1., 1.],[1., 1., 1.]])
>>> e + a
array([[2., 3., 4.],[2., 3., 4.],[2., 3., 4.]])
在這里一維數組被擴展成了二維數組,和 e e e的尺寸相同。示意圖如下所示:
我們再來看一個需要對兩個數組都做broadcasting的例子:
>>> b = np.arange(3).reshape((3,1))
>>> b
array([[0],[1],[2]])
>>> b + a
array([[1, 2, 3],[2, 3, 4],[3, 4, 5]])
在這里 a a a和 b b b都被擴展成相同的尺寸的二維數組。示意圖如下所示:
總結broadcasting的一些規則:
- 如果兩個數組維數不相等,維數較低的數組的shape進行填充,直到和高維數組的維數匹配。
- 如果兩個數組維數相同,但某些維度的長度不同,那么長度為1的維度會被擴展,和另一數組的同維度的長度匹配。
- 如果兩個數組維數相同,但有任一維度的長度不同且不為1,則報錯。
>>> a = np.arange(3)
>>> a
array([0, 1, 2])
>>> b = np.ones((2,3))
>>> b
array([[1., 1., 1.],[1., 1., 1.]])
>>> a.shape
(3,)
>>> a + b
array([[1., 2., 3.],[1., 2., 3.]])
接下來我們看看報錯的例子:
>>> a = np.arange(3)
>>> a
array([0, 1, 2])
>>> b = np.ones((3,2))
>>> b
array([[1., 1.],[1., 1.],[1., 1.]])
>>> a + b
Traceback (most recent call last):File "<stdin>", line 1, in <module>
ValueError: operands could not be broadcast together with shapes (3,) (3,2)
【二十】Python中的實例方法、靜態方法和類方法三者區別?
不用@classmethod和@staticmethod修飾的方法為實例方法。在類中定義的方法默認都是實例方法。實例方法最大的特點是它至少要包含一個self參數,用于綁定調用此方法的實例對象,實例方法通常可以用類對象直接調用。
采用@classmethod修飾的方法為類方法。類方法和實例方法相似,它至少也要包含一個參數,只不過類方法中通常將其命名為cls,Python會自動將類本身綁定給cls參數。我們在調用類方法時,無需顯式為cls參數傳參。
采用@staticmethod修飾的方法為靜態方法。靜態方法沒有類似self、cls這樣的特殊參數,因此Python的解釋器不會對它包含的參數做任何類或對象的綁定。也正因為如此,類的靜態方法中無法調用任何類屬性和類方法。
【二十一】Python中常見的切片操作
[:n]代表列表中的第一項到第n項。我們看一個例子:
example = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]print(example[:6])---------結果---------
[1, 2, 3, 4, 5, 6]
[n:]代表列表中第n+1項到最后一項:
example = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]print(example[6:])---------結果---------
[7, 8, 9, 10]
[-1]代表取列表的最后一個元素:
example = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]print(example[-1])---------結果---------
10
[:-1]代表取除了最后一個元素的所有元素:
example = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]print(example[:-1])---------結果---------
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[::-1]代表取整個列表的相反列表:
example = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]print(example[::-1])---------結果---------
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
[1:]代表從第二個元素意指讀取到最后一個元素:
example = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]print(example[1:])---------結果---------
[2, 3, 4, 5, 6, 7, 8, 9, 10]
[4::-1]代表取下標為4(即第五個元素)的元素和之前的元素反轉讀取:
example = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]print(example[4::-1])---------結果---------
[5, 4, 3, 2, 1]
【二十二】Python中如何進行異常處理?
一般情況下,在Python無法正常處理程序時就會發生一個異常。異常在Python中是一個對象,表示一個錯誤。當Python腳本發生異常時我們需要捕獲處理它,否則程序會終止執行。
捕捉異常可以使用try,except和finally語句。
try和except語句用來檢測try語句塊中的錯誤,從而讓except語句捕獲異常信息并處理。
try:6688 / 0
except:'''異常的父類,可以捕獲所有的異常'''print "0不能被除"
else:'''保護不拋出異常的代碼'''print "沒有異常"
finally:print "最后總是要執行我"
【二十三】Python中remove,del以及pop之間的區別?
remove,del以及pop都可以用于刪除列表、字符串等里面的元素,但是具體用法并不相同。
- remove是剔除第一個匹配的值。
- del是通過索引來刪除當中的元素。
- pop是通過索引來刪除當中的元素,并且返回該元素;若括號內不添加索引值,則默認刪除最后一個元素。
>>> a = [0, 1, 2, 1, 3]
>>> a.remove(1)
>>> a
[0, 2, 1, 3] >>> a = [0, 1, 2, 1, 3]
>>> del a[1]
[0, 2, 1, 3] >>> a = [0, 1, 2, 1, 3]
>>> a.pop(1)
1
>>> a
[0, 2, 1, 3]
文末推薦
內容介紹:
《機器學習平臺架構實戰》詳細闡述了與機器學習平臺架構相關的基本解決方案,主要包括機器學習和機器學習解決方案架構,機器學習的業務用例,機器學習算法,機器學習的數據管理,開源機器學習庫,Kubernetes容器編排基礎設施管理,開源機器學習平臺,使用AWS機器學習服務構建數據科學環境,使用AWS機器學習服務構建企業機器學習架構,高級機器學習工程,機器學習治理、偏差、可解釋性和隱私,使用人工智能服務和機器學習平臺構建機器學習解決方案等內容。此外,本書還提供了相應的示例、代碼,以幫助讀者進一步理解相關方案的實現過程。
當當: https://product.dangdang.com/29625469.html
京東: https://item.jd.com/13855627.html