第三課.python程式設計基礎(二)

2020-10-19 12:00:25

在最開始,我記錄一個內容:TPU,TPU是谷歌生產的專用於tensor計算的處理器。下面進入正式部分

條件判斷與三元表示式

python中只有if,if else,if elif,if elif else這幾種組合,判斷的條件不是None,0,False就可以執行;如果藉助elif就可以實現多分支判斷:

#條件判斷 if else
age=66
if age<18:
    print('young boy')
else:
    print('adults')

#多分支判斷 if elif
age=66
if age<18:
    print('young boy')
elif age>18 and age<60:
    pringt('adults')
elif age>60:
    print('others')

關於三元表示式,a if condition else b,它只是一個表示式,如果條件不是None或者0,False,就返回a,否則返回b
三元表示式通常用於條件判斷的場景:

a=1 if b>6 else 3

注意,不能按照if else的習慣,寫成a=1 if b>6 else a=3,因為1 if b>6 else 3本身就是一個表示式

迴圈與迴圈控制

迴圈指的是for迴圈,while迴圈,控制是break,continue關鍵字的使用,只需要記住以下幾點:
1.for迴圈:可設定迭代次數的迴圈
2.while迴圈:條件迴圈,不能設定迭代次數
3.break:終止整個迴圈
4.continue:跳過本次迴圈

迭代器和生成器

迭代器和生成器在以往困惑了我很久,因此我在這裡特別記錄一下這個部分
在瞭解迭代器之前,先明白什麼是可迭代物件,一般來說,當建立了一個列表,集合,字典時,就生成了一個容器,比如:
一個列表[1,2,3,4]就是一個容器,這就是一個可迭代物件,所謂可迭代物件指可通過for迴圈遍歷的物件。注意,目前這個容器並不能自己遍歷自己(通過物件自身的方法來遍歷自己,一般這個方法指的就是__next__)。到這裡,就該說出迭代器和可迭代物件的區別了,迭代器是具有__next__方法的可迭代物件。
通過iter()方法進行型別轉換後,可以將可迭代物件變成迭代器。在原檔案中,可迭代物件叫做iterable,迭代器叫做iterator,迭代器的__next__方法也有特點:只能迭代一次,不能返回到以前的索引,下面是相關範例,助於理解:

#迭代器與可迭代物件的區別,迭代器多了一個方法__next__
print("This is iterator")
li=iter([1,2,3])
print(next(li))
print("for迴圈開始")
for i in li:
    print(i)

print("This is iterable")
lis=[1,2,3]
for i in lis:
    print(i)
for i in lis:
    print(i)

fig1
對於生成器,生成器必然是一個迭代器,生成器這個物件有兩種實現方式:第一種是用生成器表示式實現;第二種方式是由生成器函數實現
生成器表示式類似列表生成式,只是將[…]中括號換成(…)小括號,例如:

>>> li=(x for x in range(30) if x%3==0)
>>> li
<generator object <genexpr> at 0x7f79e7581d60>

用函數實現的生成器就是函數中使用了yield關鍵字,這就是為什麼看到yield總會牽扯到生成器這個物件的原因:

#生成器函數(帶yield關鍵字的函數)實現生成器
def func(n):
    for i in range(n):
        yield i**2
gen=func(6)
print(gen)
print(next(gen))
print("藉助for迴圈")
for item in gen:
    print(item)

正如gen=func(6)的宣告,gen就是一個生成器,結果如下:
fig2

異常與偵錯

偵錯BUG,BUG的意思是昆蟲,那為什麼要叫找BUG,其實背後有個有趣的故事
在早期,人們使用繼電器程式設計,美國的一名海軍當時正在為完成一項任務進行程式設計,機器剛開始還好好的,但過了一會就出現了故障,每個實驗人員都覺得很奇怪,這名海軍爬上機器,線上路之中發現了飛蛾,飛蛾由於光和熱的吸引,靠近繼電器後被燒死,導致一組繼電器短路,於是這名海軍為機器偵錯取了一個形象的名字:找昆蟲,也就是找BUG
發現異常有助於我們偵錯程式碼,使程式更穩定,在python中,常見異常如下:


NameError: 存取到沒有宣告的變數
ZeroDivisionError: 除數是0
SyntaxError: 語法錯誤
IndexError: 索引超出範圍
KeyError :請求一個不存在的字典關鍵字
IOError: 輸入輸出錯誤,例如讀檔案,但檔案不存在
AttributeError: 存取到未知的物件屬性
ValueError: 傳給函數的引數型別不正確,例如給數值型引數傳遞了字串


通常,我們將有疑惑的程式碼放入try下,except會捕獲對應的異常,並執行對應指令:

try:
    code
except ValueError:
    print("值錯誤")
except NameError:
    print("名稱錯誤")
else:
    print("狀態良好")

除了系統發現異常,也可以通過關鍵字raise手動丟擲異常:

def addfunc(a,b):
    if type(a)!=type(b):
        raise ValueError('型別錯誤')
    return a+b
addfunc(5,'a')