本文適應人群:C# or Python3 基礎鞏固 代碼褲子: https://github.com/lotapp/BaseCode 線上編程: https://mybinder.org/v2/gh/lotapp/BaseCode/master 線上預覽:http://github.lesschin ...
本文適應人群:C#
or Python3
基礎鞏固
代碼褲子: https://github.com/lotapp/BaseCode
線上編程: https://mybinder.org/v2/gh/lotapp/BaseCode/master
線上預覽:http://github.lesschina.com/python/base/ext/基礎衍生.html
馬上快期末考試了,老師蜜月也回來了,於是有了一場跨季度的複習講課了:
1.Python基礎語法擴展¶
1.1.if 判斷條件相關¶
None、""、0、[]、{}
==> 假
1、" "、[None,""]、{"":None}
==> 真
小明可高興了,前幾天被打擊的面目全非,這幾天老師回來了,又可以大發神威了,於是搶先提交demo:
In [1]:# None if None: print(True) else: print(False)
FalseIn [2]:
# 0為False if 0: print(True) else: print(False)
FalseIn [3]:
# 空字元串 if "": print(True) else: print(False)
FalseIn [4]:
# 空列表為False if []: print(True) else: print(False)
FalseIn [5]:
# 空字典為False if {}: print(True) else: print(False)
FalseIn [6]:
# 1為True if 1: print(True) else: print(False)
TrueIn [7]:
# 含空格 if " ": print(True) else: print(False)
TrueIn [8]:
if [None,""]: print(True) else: print(False)
TrueIn [9]:
if {"":None}: print(True) else: print(False)
True
老師微帶笑容的看了小明一眼,然後接著講if的擴展
1.2.三元表達符¶
eg:max = a if a > b else b
a, b = 1, 2 max = a if a > b else b print(max)
2In [11]:
a, b, c = 1, 3, 2 max = a if a > b else b max = max if max > c else c print(max)
3In [12]:
# 上面的那個還有一種簡寫(不推薦) a, b, c = 1, 3, 2 max = (a if a > b else b) if (a if a > b else b) > c else c print(max)
3
1.2.字元串和編碼¶
在Python3.x
版本中,字元串是以Unicode
編碼的
對於單個字元的編碼,Python提供了ord()
函數獲取字元的整數表示,chr()
函數把編碼轉換為對應的字元
小潘對這塊有所研究,把小明按在桌上然後搶先提交demo:
In [13]:ord('D')Out[13]:
68In [14]:
ord('毒')Out[14]:
27602In [15]:
chr(68)Out[15]:
'D'In [16]:
chr(27602)Out[16]:
'毒'In [17]:
print(ord('A')) print(ord('Z')) print(ord('a')) print(ord('z'))
65 90 97 122
老師補充講解道:
編碼:encode()
解碼:decode()
url相關的可以用:
urllib.parse.quote()
and urllib.parse.unquote()
urllib.parse.urlencode()
可以直接對一個key-value
進行url
編碼
# encode() and decode() name="毒逆天" name_encode=name.encode("utf-8") print(name_encode) print(name_encode.decode("utf-8"))
b'\xe6\xaf\x92\xe9\x80\x86\xe5\xa4\xa9' 毒逆天In [19]:
# 需要導入urlib.parse import urllib.parseIn [20]:
test_str="淡定" # 對字元串進行url編碼和解碼 test_str_enode = urllib.parse.quote(test_str) print(test_str_enode) # urllib.parse.quote() 解碼 print(urllib.parse.unquote(test_str_enode))
%E6%B7%A1%E5%AE%9A 淡定In [21]:
# urlencode 可以直接對一個key-value進行編碼 test_dict={"name":"毒逆天","age":23} encode_str = urllib.parse.urlencode(test_dict) print(encode_str) print(urllib.parse.unquote(encode_str))
name=%E6%AF%92%E9%80%86%E5%A4%A9&age=23 name=毒逆天&age=23
1.3.值判斷和地址判斷¶
小明不樂意了,你個小潘總是搶我的風頭,看完標題就刷刷的在黑板上寫下瞭如下知識點:
is 是比較兩個引用是否指向了同一個對象(id()
得到的地址一樣則相同)
== 是比較兩個對象的值是否相等
在之前講Dict的時候提了一下可變和不可變類型:https://www.cnblogs.com/dotnetcrazy/p/9155310.html#5.2.增加和修改
Func裡面又系統的說了一下:https://www.cnblogs.com/dotnetcrazy/p/9175950.html#4.5.可變類型和不可變類型
對於可變不可變系列就不去覆述了,下麵再來幾個案例看看 值判斷和 地址判斷的概念
In [22]:################ 可變類型 ################
In [23]:
a=[1,2,3] b=[1,2,3] # id不一樣,那is肯定不一樣了 print(id(a)) print(id(b))
139727165899464 139727165725256In [24]:
# a和b是否指向同一個地址 a is bOut[24]:
FalseIn [25]:
# a和b的值是否相同 a == bOut[25]:
TrueIn [26]:
################ 開始變化了 ################
In [27]:
# 讓a指向b的地址 a=b # a和b的id一樣了 print(id(a)) print(id(b))
139727165725256 139727165725256In [28]:
# a和b是否指向同一個地址 a is bOut[28]:
TrueIn [29]:
# a和b的值是否相同 a == bOut[29]:
TrueIn [30]:
################ 不可變類型 ################
In [31]:
a=1 b=1 # id一樣 print(id(a)) print(id(b))
94592578394656 94592578394656In [32]:
a is bOut[32]:
TrueIn [33]:
a == bOut[33]:
TrueIn [34]:
# 但是你要註意,不是所有不可變類型都這樣的 f1=1.2 f2=1.2 # 聲明兩個相同值的浮點型變數,查看它們的id,發現它們並不是指向同個記憶體地址(這點和int類型不同) print(id(f1)) print(id(f2))
139727217917024 139727217917096In [35]:
# 這個就不一樣了 # 這方面涉及Python記憶體管理機制,Python對int類型和較短的字元串進行了緩存 # 無論聲明多少個值相同的變數,實際上都指向同個記憶體地址,其他的就沒這福利咯~ f1 is f2Out[35]:
FalseIn [36]:
f1 == f2Out[36]:
True
2.Python總結之for系列¶
老師徐徐道來:“之前說for總是零零散散的,現在基礎都講完了,來個小彙總:”
2.1.Base¶
能夠被for迴圈遍歷的,就是可迭代的
For基礎系:https://www.cnblogs.com/dotnetcrazy/p/9102030.html#9.1.Python
In [37]:# 類似於for(int i=0;i<5;i++) for i in range(5): print(i)
0 1 2 3 4In [38]:
#while迴圈一般通過數值是否滿足來確定迴圈的條件 #for迴圈一般是對能保存多個數據的變數,進行遍歷 name="https://pan.baidu.com/s/1weaF2DGsgDzAcniRzNqfyQ#mmd" for i in name: if i=='#': break print(i,end='')#另一種寫法:print("%s"%i,end="") print('\n end ...')
https://pan.baidu.com/s/1weaF2DGsgDzAcniRzNqfyQ end ...In [39]:
# 你期望的結果是:i = 5 for i in range(10): if i == 5: print("i = %d" % i) else: print("沒有找到")
i = 5 沒有找到In [40]:
# 當迭代的對象迭代完併為空時,位於else的子句將執行 # 而如果在for迴圈中含有break時則直接終止迴圈,並不會執行else子句 # 正確寫法如下: for i in range(10): if i == 5: print("i = %d" % i) break else: print("沒有找到")
i = 5In [41]:
# 遍歷一個字典 test_dict={"Name":"小明","Age":23} for k,v in test_dict.items(): print("key:%s,value:%s"%(k,v))
key:Name,value:小明 key:Age,value:23
2.2.列表生成式¶
如果下麵知識點還不熟悉的,看看之前講的~列表生成式:https://www.cnblogs.com/dotnetcrazy/p/9155310.html#1.9.列表生成式
簡寫:list(range(1, 11))
全寫:[x for x in range(1,11)]
list(range(1, 11))Out[42]:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]In [43]:
[x for x in range(1,11)]Out[43]:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]In [44]:
# 1~10的平方列表 [x*x for x in range(1,11)]Out[44]:
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]In [45]:
# 1~10之間的偶數 [x for x in range(1, 11) if x % 2 == 0]Out[45]:
[2, 4, 6, 8, 10]In [46]:
# 數學裡面的全排列 [x + y for x in 'ABC' for y in 'AB']Out[46]:
['AA', 'AB', 'BA', 'BB', 'CA', 'CB']In [47]:
# 數學裡面的坐標軸 [(x,y) for x in range(1,5) for y in range(1,4)]Out[47]:
[(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3), (4, 1), (4, 2), (4, 3)]In [48]:
# (x,y,z) 一般三個嵌套就上天了 [(x,y,z) for x in range(1,5) for y in range(1,4) for z in range(1,3)]Out[48]:
[(1, 1, 1), (1, 1, 2), (1, 2, 1), (1, 2, 2), (1, 3, 1), (1, 3, 2), (2, 1, 1), (2, 1, 2), (2, 2, 1), (2, 2, 2), (2, 3, 1), (2, 3, 2), (3, 1, 1), (3, 1, 2), (3, 2, 1), (3, 2, 2), (3, 3, 1), (3, 3, 2), (4, 1, 1), (4, 1, 2), (4, 2, 1), (4, 2, 2), (4, 3, 1), (4, 3, 2)]
2.3.擴展¶
如果要對list實現類似C#或者java那樣的下標迴圈怎麼辦?
這塊小明又有預習,於是在提交Code的同時大聲說道:
Python內置的enumerate
函數可以把一個list變成索引-元素
對,這樣就可以在for迴圈中同時迭代索引和元素本身
for i, item in enumerate(['A', 'B', 'C']): print(i, item)
0 A 1 B 2 C
3.Python中賦值、淺拷貝、深拷貝¶
看到標題小明和小潘就楞了,老師當時沒講解啊,然後兩個人眼巴巴的看著老師講解:
官方文檔:https://docs.python.org/3/library/copy.html
3.1.賦值¶
通過=
來實現,就是把地址拷貝了一份,比如 a = b
a=[1,2,2] b = a print(id(a)) print(id(b))
139727165518536 139727165518536In [51]:
# 再驗證 a.append(3) # 都增加了一個3,說明的確指向同一個記憶體地址 print(a) print(b)
[1, 2, 2, 3] [1, 2, 2, 3]
3.2.深拷貝deepcopy¶
導入copy
模塊,調用deepcopy
方法
如果有嵌套引用的情況,直接遞歸拷貝
In [52]:import copy a=[1,2,2]In [53]:
b=copy.deepcopy(a) # 指向了不同的記憶體地址 print(id(a)) print(id(b))
139727165899080 139727165900488In [54]:
# 再驗證一下 a.append(3) # b不變,說明的確指向不同的記憶體地址 print(a) print(b)
[1, 2, 2, 3] [1, 2, 2]In [55]:
################ 開始變化了 ################
In [56]:
# 之前講了嵌套列表,我們來驗證一下 a=[1,2,2] b=[1,2,3,a] c=copy.deepcopy(b) # 發現地址都不一樣 print(id(b)) print(id(c)) print(id(b[3])) print(id(c[3]))
139727166586248 139727165899080 139727165725256 139727165899464In [57]:
# 直觀的驗證一下 a.append(666) # 深拷貝的確是深拷貝 print(b) print(c)
[1, 2, 3, [1, 2, 2, 666]] [1, 2, 3, [1, 2, 2]]
3.3.淺拷貝copy¶
copy只是簡單拷貝,如果拷貝內容裡面還有引用之類的,他是不管的
In [58]:import copy a=[1,2,2]In [59]:
b=copy.copy(a) # 指向了不同的記憶體地址 print(id(a)) print(id(b))
139727165902088 139727165850952In [60]:
################ 開始變化了 ################