python筆記

作者:上官佳雨

第一講知識導圖

image

變量赎懦、運算符與數(shù)據(jù)類型

  • 注釋

  • 單行注釋:#

  • 多行注釋:''' ''' 或者 """ """

  • 運算符

  • 算術運算符:+ - * / // % **

  • 比較運算符:> >= < <= == !=

  • 邏輯運算符:and, or, not

  • 位運算符:~ & | ^ << >>

  • 三元運算符

  • 三元運算符通常在Python里被稱為條件表達式敷鸦,它可以使用一條語句來完成條件判斷和賦值操作想鹰。

  • 語法形式:True_statements if expression else False_statements

  • 其他運算符:in, not in, is, is not

  • ? is, is not (是&不是)對比的是兩個變量的<u>內存地址</u>,==, != (等于&不等于)對比的是兩個變量的<u>值</u>塔鳍。

  • 比較的兩個變量汉矿,指向的都是<u>地址不可變</u>的類型(str等),那么is阵苇,is not 和 ==壁公,!= 是<u>完全等價</u>的绅项。

  • 對比的兩個變量紊册,指向的是<u>地址可變</u>的類型(list,dict快耿,tuple等)囊陡,則兩者是有區(qū)別的。

  • 運算符的優(yōu)先級

  • 一元運算符優(yōu)于二元運算符掀亥。

  • 先算術運算撞反,后移位運算,最后位運算搪花。

  • 邏輯運算最后結合遏片。

  • 變量和賦值

  • 使用變量前,需要對其先賦值撮竿。

  • 變量名可以包括字母吮便、數(shù)字、下劃線倚聚、但變量名不能以數(shù)字開頭线衫。

  • Python 變量名是大小寫敏感的。

  • 數(shù)據(jù)類型與轉換

  • 整型(int)

  • 浮點型(float)

  • ?調整精度

  • str.format() 方法:使用字符串格式化來產生限定長度的有效位數(shù)惑折。

image

<figcaption>例如:print(&quot;{:.2f}&quot;.format(3.1415926)) —&gt;輸出3.14</figcaption>

  • round() 函數(shù):不精確但可以用來“事后舍入”授账,使得實際的結果值可以做相互比較枯跑。
    語法形式:round(number[, ndigits])?返回 number 舍入到小數(shù)點后 ndigits 位精度的值。 如果 ndigits 被省略或為 None白热,則返回最接近輸入值的整數(shù)敛助。

  • decimal 模塊:如果需要非常精確的結果(如會計方面的應用),可以用 decimal 包里的 Decimal 對象和 getcontext() 方法來實現(xiàn)屋确,用用 getcontext().prec 來調整精度纳击。

  • 布爾型(bool)

  • 數(shù)字運算中,用 1 和 0 代表 True 和 False攻臀。

  • ?確定bool(X) 的值是 True 還是 False焕数,就看 <u>X 是不是空</u>。

  • 對于數(shù)值變量刨啸,0, 0.0 都可認為是空的堡赔。

print(type(10.31), bool(0.00), bool(10.31))

運行結果為:
<class 'float'> False True
  • 對于<u>容器變量</u>,里面沒元素就是空的设联。eg. '', (), [], {}, set()
print(type(''), bool(''), bool('python'))

運行結果為:
 <class 'str'> False True
  • 獲取類型信息

  • type(object)

  • isinstance(object, classinfo)
    classinfo -- 可以是直接或間接類名善已、基本類型或者由它們組成的元組。eg. ?int离例,float换团,bool,complex,str(字符串),list著瓶,dict(字典),set辑甜,tuple

  • 兩個函數(shù)的區(qū)別:

  • type() 不會認為子類是一種父類類型衰絮,不考慮繼承關系袍冷。

  • isinstance() 會認為子類是一種父類類型,考慮繼承關系猫牡。

  • 如果要<u>判斷兩個類型是否相同</u>推薦使用 isinstance()胡诗。

  • 類型轉換

  • 轉換為整型 int(x, base=10)

  • 轉換為字符串 str(object='')

  • 轉換為浮點型 float(x)

  • 轉化為布爾型 bool(x)

  • print() 函數(shù)

  • 語法形式:print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)

  • sep是實現(xiàn)分隔符。

  • end是輸出結束時的字符淌友,默認是換行符\n煌恢。

  • file是定義流輸出的文件。

  • flush是立即把內容輸出到流文件震庭,不作緩存瑰抵。

位運算

  • 二進制3種表示形式:原碼、反碼和補碼

  • 符號位:最高位為符號位器联,0表示正數(shù)二汛,1表示負數(shù)婿崭。在位運算中符號位也參與運算。

  • 原碼:就是其二進制表示肴颊,有一位符號位氓栈。

  • 反碼:正數(shù)的反碼就是原碼,負數(shù)的反碼是符號位不變婿着,其余位取反(對應正數(shù)按位取反)授瘦。

  • 補碼:正數(shù)的補碼就是原碼,負數(shù)的補碼是反碼+1竟宋。
    計算機內部使用補碼來表示提完。

  • 按位非操作 ~

  • ~ 把num的補碼中的 0 和 1 全部取反(0 變?yōu)?1,1 變?yōu)?0)

  • 按位與操作 &

  • 只有兩個對應位都為 1 時才為 1

  • 按位或操作 |

  • 只要兩個對應位中有一個 1 時就為 1

  • 按位異或操作 ^

  • 只有兩個對應位不同時才為 1

  • 異或操作的性質:滿足交換律和結合律

  • 按位左移操作 <<

  • num << i 將num的二進制表示向左移動i位所得的值丘侠。

  • 按位右移操作 >>

  • num >> i 將num的二進制表示向右移動i位所得的值氯葬。

  • 利用位運算實現(xiàn)快速計算

  • 通過 <<,>> 快速計算2的倍數(shù)問題婉陷。

  • n << 1 -> 計算 n*2

  • n >> 1 -> 計算 n/2帚称,負奇數(shù)的運算不可用

  • n << m -> 計算 n*(2^m),即乘以 2 的 m 次方

  • n >> m -> 計算 n/(2^m)秽澳,即除以 2 的 m 次方

  • 1 << n -> 2^n

  • 通過 ^ 快速交換兩個整數(shù)闯睹。

a ^= b
b ^= a
a ^= b

# 相當于 a, b = b, a
  • 通過 a & (-a) 快速獲取a的最后為 1 位置的整數(shù)。

  • 利用位運算實現(xiàn)整數(shù)集合

  • 一個數(shù)的二進制表示可以看作是一個集合(0 表示不在集合中担神,1 表示在集合中)楼吃。

  • 元素與集合的操作:

  • a | (1<<i) -> 把 i 插入到集合中

  • a & ~(1<<i) -> 把 i 從集合中刪除

  • a & (1<<i) -> 判斷 i 是否屬于該集合(零不屬于,非零屬于)

  • 集合之間的操作:

  • a 補 -> ~a

  • a 交 b -> a & b

  • a 并 b -> a | b

  • a 差 b -> a & (~b)

條件語句

  • if 語句

  • 單個 if 語句中的 expression 條件表達式可以通過布爾操作符 and妄讯,or和not 實現(xiàn)<u>多重條件判斷</u>孩锡。

if 2 > 1 and not 2 > 3:
    print('Correct Judgement!')

運行結果為:
Correct Judgement!
  • if - else 語句

  • if語句支持嵌套,即在一個if語句中嵌入另一個if語句亥贸,從而構成<u>不同層次的選擇結構</u>躬窜。

hi = 6
if hi > 2:
    if hi > 7:
        print('好棒!好棒炕置!')
else:
    print('切~')

運行結果為:
無輸出
  • if - elif - else 語句

  • elif 語句即為 else if荣挨,用來檢查多個表達式是否為真,并在為真時執(zhí)行<u>特定代碼塊</u>中的代碼朴摊。

  • assert 關鍵詞

  • assert這個關鍵詞稱為“斷言”默垄,當這個關鍵詞后邊的條件為 False 時,程序自動崩潰并拋出<u>AssertionError</u>的異常甚纲。

  • 在進行<u>單元測試</u>時口锭,可以用來在程序中置入檢查點,只有條件為 True 才能讓程序正常工作介杆。

assert 3 > 7

運行報錯:
AssertionError

循環(huán)語句

  • while 循環(huán)

  • while后可以寫入一個<u>非零整數(shù)</u>鹃操,也可以寫入<u>str况既、list或任何序列</u>,值/長度非零則視為真值组民,執(zhí)行循環(huán)體棒仍;否則視為假值,不執(zhí)行循環(huán)體臭胜。

  • while - else 循環(huán)

  • 當while循環(huán)<u>正常執(zhí)行完</u>的情況下莫其,執(zhí)行else輸出。

  • 如果while循環(huán)中執(zhí)行了<u>跳出循環(huán)</u>的語句耸三,比如 break乱陡,將<u>不執(zhí)行else代碼塊</u>的內容仪壮。

  • for 循環(huán)

  • for循環(huán)是迭代循環(huán)憨颠,相當于一個通用的序列迭代器,可以遍歷任何<u>有序序列</u>(str积锅、list爽彤、tuple等),也可以遍歷任何<u>可迭代對象</u>(dict)缚陷。
    for 循環(huán)實際上創(chuàng)建了一個迭代器對象适篙,并為每個循環(huán)執(zhí)行 next() 方法。

  • 每次循環(huán)箫爷,迭代變量被設置為可迭代對象的當前元素嚷节,提供給代碼塊使用。

  • for - else 循環(huán)
    與while - else語句類似虎锚。

  • 當for循環(huán)<u>正常執(zhí)行完</u>的情況下硫痰,執(zhí)行else輸出。

  • 如果for循環(huán)中執(zhí)行了<u>跳出循環(huán)</u>的語句窜护,比如 break效斑,將<u>不執(zhí)行else代碼塊</u>的內容

  • range() 函數(shù)(是BIF(Built-in functions))

  • 語法形式:range([start,] stop, [step=1])

  • start和step兩個參數(shù)可選

  • step參數(shù)的默認值是1

  • ? range 生成的序列包含start的值但<u>不包含stop的值</u>。

  • enumerate()函數(shù)

  • 語法形式:enumerate(sequence, [start=0])

  • sequence:一個序列柄慰、迭代器或其他支持迭代對象鳍悠。

  • start:下標起始位置税娜。用 enumerate(A, j) 還可以確定索引起始值為 j坐搔。

  • 返回值: enumerate(枚舉) 對象,

  • 例如:[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]

  • 用 enumerate(A) 不僅返回了 A 中的<u>元素</u>敬矩,還順便給該元素一個<u>索引值</u> (默認從 0 開始)概行。

  • enumerate()與 for 循環(huán)的結合使用。

for i, a in enumerate(A)
    do something with a
  • break 語句

  • break語句可以跳出<u>當前所在層的循環(huán)</u>弧岳。(while凳忙,for語句等......)

  • continue 語句

  • continue終止本輪循環(huán)并開始下一輪循環(huán)业踏。

  • pass 語句

  • pass是空語句,不做任何操作涧卵,只起到<u>占位</u>的作用勤家,其作用是為了保持程序結構的完整性。

  • 盡管pass語句不做任何操作柳恐,但如果<u>暫時不確定要在一個位置放上什么樣的代碼</u>伐脖,可以先放置一個pass語句,讓代碼可以正常運行乐设。

  • 推導式

  • 列表推導式:[ expr forvalue in collection [ifcondition] ]

a = [(i, j) for i in range(0, 3) for j in range(0, 3)]
print(a)

運行結果為:
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
  • 元組推導式:( expr forvalue in collection [ifcondition] )
a = (x for x in range(10))
print(a)

運行結果為:
<generator object <genexpr> at 0x0000025BE511CC48>

print(tuple(a))

運行結果為:
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
  • 元組推導式生成的結果是一個生成器對象(與列表推導式不同)讼庇。

  • 獲得新元組或新元組中的元素,有以下三種方式:

  • 1. 使用 tuple() 函數(shù)近尚,可以直接將生成器對象轉換成元組蠕啄。

a = (x for x in range(1,10))
print(tuple(a))

運行結果為:
(1, 2, 3, 4, 5, 6, 7, 8, 9)
  • 2. 直接使用 for 循環(huán)遍歷生成器對象,可以獲得各個元素戈锻。
a = (x for x in range(1,10))
for i in a:
    print(i,end=' ')
print(tuple(a))

運行結果為:
1 2 3 4 5 6 7 8 9 ()
  • 3. 使用next() 方法遍歷生成器對象歼跟,也可以獲得各個元素。
a = (x for x in range(3))
print(a.__next__())
print(a.__next__())
print(a.__next__())
a = tuple(a)
print("轉換后的元組:",a)

運行結果為:
0
1
2
轉換后的元組: ()
  • 注意<u>遍歷后原生成器對象將不復存在</u>格遭,會得到空元組嘹承!

Python元組推導式?c.biancheng.net

  • 字典推導式:{ key_expr: value_expr for value in collection [if condition] }
b = {i: i % 2 == 0 for i in range(10) if i % 3 == 0}
print(b)

運行結果為:
{0: True, 3: False, 6: True, 9: False}
  • 集合推導式:{ expr for value in collection [if condition] }
c = {i for i in [1, 2, 3, 4, 5, 5, 6, 4, 3, 2, 1]}
print(c)

運行結果為:
{1, 2, 3, 4, 5, 6}
  • 其它:next(iterator[, default])

  • Return the next item from the iterator. If default is given and the iterator is exhausted, it is returned instead of raising StopIteration.

異常處理

  • Python 標準異常總結(常見)
image

<figcaption>上圖為Python異常體系中的部分關系如庭。</figcaption>

  • BaseException:所有異常的基類

  • Exception:常規(guī)異常的基類

  • OverflowError:數(shù)值運算超出最大限制

  • ZeroDivisionError:除數(shù)為零

  • AssertionError:斷言語句(assert)失敗

  • AttributeError:嘗試訪問未知的對象屬性

  • OSError:操作系統(tǒng)產生的異常(例如打開一個不存在的文件)

  • ImportError:導入模塊失敗的時候

  • IndexError:索引超出序列的范圍

  • KeyError:字典中查找一個不存在的關鍵字

  • MemoryError:內存溢出(可通過刪除對象釋放內存)

  • NameError:嘗試訪問一個不存在的變量

  • SyntaxError:語法錯誤導致的異常

  • TypeError:不同類型間的無效操作

  • ValueError:傳入無效的參數(shù)

  • Python 標準警告總結

  • try - except 語句

  • 語法形式:

try:
    檢測范圍
except Exception[as reason]:
    出現(xiàn)異常后的處理代碼
  • 工作方式:

  • 首先叹卷,執(zhí)行try子句。

  • 如果沒有異常發(fā)生坪它,忽略except子句骤竹,try子句執(zhí)行后結束。

  • 如果在執(zhí)行try子句的過程中發(fā)生了異常往毡,那么try子句余下的部分將被忽略蒙揣。如果異常的類型和except之后的名稱相符,那么對應的except子句將被執(zhí)行开瞭。最后執(zhí)行try - except語句之后的代碼懒震。

  • 如果一個異常沒有與任何的except匹配,那么這個異常將會傳遞給上層的try中嗤详。

  • 注意:

  • 使用except而不帶任何異常類型个扰,不是一個很好的方式。我們不能通過該程序識別出具體的異常信息葱色,因為<u>它捕獲所有的異常</u>递宅。

  • 一個try語句可能包含多個except子句,分別來處理不同的特定的異常。<u>最多只有一個分支會被執(zhí)行办龄。</u>

  • 使用多個except代碼塊時烘绽,必須堅持對其規(guī)范排序,要<u>從最具針對性的異常到最通用的異常俐填。</u>

dict1 = {'a': 1, 'b': 2, 'v': 22}
try:
    x = dict1['y']
except KeyError:
    print('鍵錯誤')
except LookupError:
    print('查詢錯誤')
else:
    print(x)

運行結果為:
鍵錯誤
  • 一個 except 子句可以同時處理多個異常安接,這些異常將被放在一個括號里成為一個<u>元組</u>。
try:
    s = 1 + '1'
    int("abc")
    f = open('test.txt')
    print(f.read())
    f.close()
except (OSError, TypeError, ValueError) as error:
    print('出錯了英融!\n原因是:' + str(error))

運行結果為:
出錯了赫段!
原因是:unsupported operand type(s) for +: 'int' and 'str'
  • try - except - finally 語句

  • 語法形式:

try:
    檢測范圍
except Exception[as reason]:
    出現(xiàn)異常后的處理代碼
finally:
    不管try子句里面有沒有發(fā)生異常,都會被執(zhí)行的代碼
  • 如果一個異常在try子句里被拋出,而又沒有任何的except把它截住矢赁,那么這個異常會在finally子句執(zhí)行后被拋出糯笙。

  • try - except - else 語句

  • 語法形式:

try:
    檢測范圍
except:
    出現(xiàn)異常后的處理代碼
else:
    如果沒有異常執(zhí)行這塊代碼
  • 注意:else語句的存在必須以except語句的存在為前提,在沒有except語句的try語句中使用else語句撩银,會引發(fā)語法錯誤给涕。

  • raise語句

  • Python 使用raise語句拋出一個指定的異常。

try:
    raise NameError('HiThere')
except NameError:
    print('An exception flew by!')

運行結果為:
An exception flew by!

python 多重嵌套循環(huán)跳出方法記錄

目的:多重嵌套循環(huán)的情況下,最里面一層循環(huán)中止時,直接中止整個多重嵌套循環(huán).

for i in range(10): # 循環(huán)2
    for j in range(9): # 循環(huán)1
        print(j)
        if i ==3 and j == 2:
            break  # break1
    else:
        continue
    break  # break2

重點在于 continue 和 break 的配合使用

循環(huán)1為 for-else模式

循環(huán)1的結果只會有2種情況: 1.循環(huán)結束,執(zhí)行else部分; 2.符合if判斷條件,循環(huán)中斷,執(zhí)行if下的break.

那么就是說,如果循環(huán)1完成一個循環(huán),那么就繼續(xù)進行循環(huán)2的下一個循環(huán),如果循環(huán)1的循環(huán)中斷,那么循環(huán)2也必須要中斷,跳出整個嵌套循環(huán)(目的)

也就是說,

循環(huán)1的情況2,循環(huán)break中斷之后,循環(huán)2也必須break,因此與循環(huán)1同級,在循環(huán)1之后放了break2.

循環(huán)1的情況1,循環(huán)結束,此時不能執(zhí)行循環(huán)2的break2,因此在else下放了continue,在循環(huán)1結束后會執(zhí)行else部分的continue,這個continue是對循環(huán)2起作用,因此會跳過執(zhí)行break2,進行循環(huán)2的下一輪循環(huán).

至此,目的達到.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末额获,一起剝皮案震驚了整個濱河市够庙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌抄邀,老刑警劉巖耘眨,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異境肾,居然都是意外死亡剔难,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門奥喻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來偶宫,“玉大人,你說我怎么就攤上這事环鲤〈壳鳎” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵冷离,是天一觀的道長吵冒。 經常有香客問我,道長西剥,這世上最難降的妖魔是什么痹栖? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮蔫耽,結果婚禮上结耀,老公的妹妹穿的比我還像新娘留夜。我一直安慰自己匙铡,他們只是感情好图甜,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鳖眼,像睡著了一般黑毅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上钦讳,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天矿瘦,我揣著相機與錄音,去河邊找鬼愿卒。 笑死缚去,一個胖子當著我的面吹牛,可吹牛的內容都是我干的琼开。 我是一名探鬼主播易结,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼柜候!你這毒婦竟也來了搞动?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤渣刷,失蹤者是張志新(化名)和其女友劉穎鹦肿,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辅柴,經...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡箩溃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了碌嘀。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碾篡。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖筏餐,靈堂內的尸體忽然破棺而出开泽,到底是詐尸還是另有隱情,我是刑警寧澤魁瞪,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布穆律,位于F島的核電站,受9級特大地震影響导俘,放射性物質發(fā)生泄漏峦耘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一旅薄、第九天 我趴在偏房一處隱蔽的房頂上張望辅髓。 院中可真熱鬧泣崩,春花似錦、人聲如沸洛口。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽第焰。三九已至买优,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間挺举,已是汗流浹背杀赢。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留湘纵,地道東北人脂崔。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像梧喷,于是被迫代替她去往敵國和親砌左。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355