第二天 開發(fā)環(huán)境和語法基礎(chǔ)(1)
今天主要計(jì)劃學(xué)習(xí)用VSCode搭建開發(fā)環(huán)境及Python語法基礎(chǔ)
學(xué)習(xí)涉及到的源碼地址:GitHub源碼
使用VSCode打造Python開發(fā)環(huán)境
可以用來開發(fā)Python的開發(fā)工具很多,我選擇了VSCode,原因很簡單,因?yàn)樗强缙脚_的,而且免費(fèi)的。
-
下載安裝VS Code
從VSCode官方網(wǎng)站下載自己喜歡的工作環(huán)境的版本進(jìn)行安裝,很簡單在這里就不多說了。
-
安裝Python環(huán)境
從Python官網(wǎng)下載適合自己開發(fā)環(huán)境的Python3.x版本進(jìn)行安裝.
-
配置VSCode開發(fā)Python
在VSCode中搜索擴(kuò)展插件:Python,安裝后,重新加載。就可以愉快的擼代碼了。Python插件自帶的Pylint功能會(huì)在你輸入的過程中給你自動(dòng)提示,自動(dòng)完成,以及錯(cuò)誤提示。這里需要提醒各位,VSCode包括VS中,Tab都默認(rèn)是4個(gè)空格。
-
VSCode常用的幾個(gè)操作快捷鍵:
首先是F1/Ctrl+Shit+P萬能鍵,誰用誰知道 Ctrl+P:文件切換 Ctrl+空格:自動(dòng)提示 F12/Ctrl+左鍵:跳轉(zhuǎn)到定義 Shift+F12:預(yù)覽定義 Ctrl+G:跳轉(zhuǎn)行號 Ctrl+/:注釋切換 Alt+↑↓:整行上下移動(dòng) Ctrl+↑↓:編輯器垂直滾動(dòng)條上下移動(dòng),光標(biāo)不動(dòng) Ctrl+Backspace/Delete:整詞/連續(xù)空白刪除 Ctrl+→←:光標(biāo)整詞移動(dòng) Ctrl+F查找/Ctrl+Shift+F在文件中查找,這都屬于通用的,類似的就不說了啊。 -
調(diào)試配置
隨時(shí)隨地,打開一個(gè)Pyhton源碼文件,按F5,選擇調(diào)試運(yùn)行當(dāng)前文件。項(xiàng)目中一般需要配置啟動(dòng)項(xiàng)目入口文件,傳統(tǒng)意義上它叫:main.py.注意,VSCode默認(rèn)在調(diào)試后,會(huì)停在第一句。
調(diào)試快捷鍵:
```
F5:調(diào)試/繼續(xù),
F10:單步跳過,
F11:單步進(jìn)入,
Shift+F11:跳出。
F9:切換斷點(diǎn)
```
接下來,開擼吧。
Python編程基礎(chǔ)
Python程序的基本格式
-
記住Python使用縮進(jìn)控制代碼范圍的
這點(diǎn)有點(diǎn)像coffee script,應(yīng)該是coffee學(xué)習(xí)python;區(qū)別于Java、C、C++等用{}控制代碼塊?!翱s進(jìn)”是Python語法強(qiáng)制的規(guī)定。縮進(jìn)時(shí),幾個(gè)空格都是允許的,但是數(shù)目必須統(tǒng)一且前后一致。通常采用“四個(gè)空格”表示一個(gè)縮進(jìn)。
使用#進(jìn)行行注釋,用三個(gè)連續(xù)的'''進(jìn)行塊注釋
變量名是區(qū)分大小寫的
結(jié)尾不需要使用;進(jìn)行結(jié)束
使用\行連接比較長的行內(nèi)容
-
一段示例代碼:
''' 這里是一大塊注釋語句 為什么要使用塊注釋,哪里使用,我就不多說了 程序員都懂的 ''' a = "a" A = "c" # a 和 A 是兩個(gè)不同的變量 #用\連接長字符串 b = "I love google than \ baidu,because of xxxxxx\ nnnnnn\ oooo" if True: # 行注釋 "True"是Python的一個(gè)Bool值 #下面的行相對于if用Tab控制了縮進(jìn) print("我是對的") #不需要使用;結(jié)束語句 print("Hello") if False: #上一個(gè)代碼塊結(jié)束了,開始新的代碼 print("我錯(cuò)了嗎") print("World")
Python程序的構(gòu)成
- Python程序由模塊組成的,通常就是一個(gè)py源文件
- 模塊由一系列的語句構(gòu)成
- 語句用于創(chuàng)建對象、變量賦值、調(diào)用函數(shù)、控制語句等
***重點(diǎn)Python中的對象
在Python中一切都是對象。
對象由三部分組成:identity,type,value組成,它的本質(zhì)被解釋器放在內(nèi)存堆中。擁有特定的值,支持特定類型的相關(guān)操作。
比如定義一個(gè)變量:a = 1
1就是對象,它存在在內(nèi)存中如下:
| id | type | value |
|---|---|---|
| 4395429648 | int | 1 |
變量a其實(shí)是對象id的引用,存放在內(nèi)存棧中;如果在定義一個(gè)變量:b = 1,那么a和b指向的是同一個(gè)引用地址。
可以通過內(nèi)置方法:id(a) 或 id(1)獲取對象的id,type(a)獲取對象的類型。
***重點(diǎn): Python只會(huì)緩存[-5,無窮大]的整數(shù),所以,在這里,a和b的引用地址一樣。這里不注意的話,可能是個(gè)坑。內(nèi)置數(shù)據(jù)類型:數(shù)值型,字符串,列表,字典等都會(huì)有自己的對象緩存池,這樣做的好處是,避免了頻繁的申請內(nèi)存,釋放內(nèi)存,這樣會(huì)極大的降低應(yīng)用程序的運(yùn)行速度,還會(huì)造成大量的內(nèi)存碎片。因此提供對象緩存機(jī)制是非常重要的。
綜上,可以總結(jié)兩個(gè)點(diǎn):
-
python是動(dòng)態(tài)語言
定義變量不需要指定類型,解釋器會(huì)根據(jù)其引用的對象自動(dòng)確定其類型
-
python也是強(qiáng)類型語言
因?yàn)閷ο笫欠至祟愋偷?,不同的類型支持的操作是不一樣?/p>
Python的標(biāo)識符
- 關(guān)于命名就不多說了,規(guī)則和大多數(shù)開發(fā)語言一致
- 重點(diǎn)說一下,盡量不要用__開頭的標(biāo)識符進(jìn)行命名,因?yàn)殡p下劃線開頭和結(jié)尾的名稱通常有特殊含義,如init,在python中表示類的構(gòu)造函數(shù)
變量的定義和賦值
-
變量名 = 表達(dá)式
python從右往左進(jìn)行解釋,先計(jì)算右邊的表達(dá)式生成一個(gè)對象,然后將對象地址賦予對應(yīng)的變量。
-
變量的刪除
a = 1 del(a)變量刪除后,沒有被引用的對象會(huì)被垃圾回收機(jī)制自動(dòng)回收。
-
鏈?zhǔn)劫x值
x = y = z = 1
定義了x,y,z三個(gè)變量,且他們的值都是1. -
結(jié)構(gòu)賦值
x,y = 1,2
相當(dāng)于x=1,y=2
一個(gè)技巧,通過這樣的方式可以很容易實(shí)現(xiàn)變量的交換,如:
x = 1 y = 2 x,y = y,x # 一句話就搞定,這就是Python的優(yōu)勢 print(x,y) # 2,1 -
常量
這個(gè)。。。。Python中沒有常量,切記,真的沒有??梢栽诰幋a是約定一個(gè)變量為常量,如:CONST = 1,然后記住不要修改它哦
內(nèi)置數(shù)據(jù)類型和常用運(yùn)算符號
-
內(nèi)置類型
1、整型
Python 中,除 10 進(jìn)制,還有其他三種進(jìn)制:
0b或0B二進(jìn)制: 0 1 0o或0O八進(jìn)制: 0 1 2 3 4 5 6 7 0x或0X十六進(jìn)制:0 1 2 3 4 5 6 7 8 9 a b c d e f** 注意這個(gè)在Python中沒有大小限制,無限大;所以科學(xué)計(jì)算還是Python好。
int() 方法可以將浮點(diǎn)類型、布爾、符合要求的字符串轉(zhuǎn)換成整數(shù)
整數(shù)和浮點(diǎn)數(shù)混合運(yùn)算時(shí),表達(dá)式結(jié)果自動(dòng)轉(zhuǎn)型成浮點(diǎn)數(shù)。
int(9.7) # 9直接去掉小數(shù)點(diǎn)后面的 int("9") # 9 int(True) # 1 int(False) # 0 int("3.14") # 報(bào)錯(cuò) int("abcef") # 報(bào)錯(cuò) 3+7.0 # 10.0 自動(dòng)轉(zhuǎn)換四舍五入用round()函數(shù)
2、浮點(diǎn)型
兩個(gè)表達(dá)方式:3.14 或 314e-2
float() 可以進(jìn)行強(qiáng)制轉(zhuǎn)換
3、布爾型
兩個(gè)值:True 和 False
布爾值得本質(zhì)是0和1,所以他們可以進(jìn)行數(shù)學(xué)運(yùn)算
1 + True # 2 1 + False # 14、字符串
雙引號“”定義一個(gè)字符串
-
數(shù)學(xué)運(yùn)算符
+,-,,/,//,%,*
如:
# //是整除的運(yùn)算 a = 9//4 # 2 # **是冥運(yùn)算 a = 2**10 # 1024被除數(shù)為0會(huì)報(bào)錯(cuò),還是寫一下吧。
-
比較關(guān)系運(yùn)算符
> , >= , <, <=, ==, !=
關(guān)系運(yùn)算符是可以連用的,如:
a = 3 1 < a < 4 # True 1 < a != 5 # True 3 != a !=5 # False -
邏輯運(yùn)算符
and,or,not
-
同一運(yùn)算符
is, is not
同一運(yùn)算符用于比較對象的地址。
a = 1 b = 1 a is b # True c = 2 a is not c # Trueis 與 == 區(qū)別:
is 用于判斷兩個(gè)變量引用對象是否為同一個(gè),既比較對象的地址。
== 用于判斷引用變量引用對象的值是否相等,默認(rèn)調(diào)用對象的 eq()方法。 按位運(yùn)算符
&與,|或,^異或,>>,<< 移位
a = 0b1001
b = 0b1000
bin(a|b) # 0b1001 參加運(yùn)算的兩個(gè)對象只要有一個(gè)為1,其值為1
bin(a&b) # 0b1000 兩位同時(shí)為“1”,結(jié)果才為“1”,否則為0
bin(a^b) # 0b1 參加運(yùn)算的兩個(gè)對象,如果兩個(gè)相應(yīng)位為“異”(值不同),則該位結(jié)果為1,否則為0。
bin(a>>2) #0b10 右邊移出的空位一律補(bǔ)0,丟棄移出的位
bin(a<<2) #0b100100 左邊移出的空位一律補(bǔ)0
-
復(fù)合賦值運(yùn)算符
就是+=,*=,//=,|=等等
a = 1 a += 1 # 2 a = a + 1注意:Python沒有++,--
-
運(yùn)算符優(yōu)先級問題
- 乘除優(yōu)先加減
- 位運(yùn)算和算術(shù)運(yùn)算 > 比較運(yùn)算符 > 賦值運(yùn)算符 > 邏輯運(yùn)算符
字符串
Python字符串的特點(diǎn)
-
不可變
python中的字符串是不可變化,修改字符串實(shí)際是新建一個(gè)字符串對象,將新的對象地址賦值給引用它的對象。
a = "abcdef" a[3] = "1" # 注意,這里會(huì)報(bào)錯(cuò) -
字符串是一個(gè)序列
可以通過下標(biāo)進(jìn)行訪問
正向:最左側(cè)第一個(gè)字符0開始直到len(str)-1為止
反向:最右側(cè)第一個(gè)字符-1開始倒數(shù)直到-len(str)為止。
不支持單字符,單字符也是字符串
-
直接支持Unicode編碼
在python3中,字符編碼集是Unicode的,支持世界上任何語言集合,默認(rèn)是16位,內(nèi)置函數(shù)ord()可以把字符轉(zhuǎn)換成對應(yīng)的Unicode碼;chr()可以把十進(jìn)制數(shù)字轉(zhuǎn)換成對應(yīng)的字符。
ord('A') # 65 chr(65) # A ord('林') # 26519 chr(26519) # 林
使用',",''',"""創(chuàng)建字符串和轉(zhuǎn)義符號\
''' 或 """ 可以創(chuàng)建多行字符串
" 里面可以不用轉(zhuǎn)義'
\ 用來轉(zhuǎn)義特殊符號
a = ''' 測試創(chuàng)建多行字符串:
a = "abcd"
b = "ooooo"
完畢'''
b = "雙引號'可以不用轉(zhuǎn)義'"
c = '' # 控制符串
d = '\'\'\'轉(zhuǎn)義符號測試 \r\t\\\n完畢'
e = "abcd"
e[1] # b
常用操作及內(nèi)置函數(shù)
- 字符串拼接符號: +
- 字符串復(fù)制符號: *
- in 或 not in 關(guān)鍵字,判斷某個(gè)字符串)是否存在于指定字符串中。
- is 或 is not 判斷兩個(gè)對象是否同一個(gè)對象
- == 或 != 判斷兩個(gè)字符串值是否相等
a = "a" + "b" # ab
b = "a" * 3 # aaa
c = "ab"
c is a # True
c is not a # False
d = "abc#"
e = "abc#"
#### 此處需要注意,Python僅對字符串由_、字符、數(shù)字組成的字符串進(jìn)行緩存(字符串駐留機(jī)制)
d is e # False
d is not e # True
d == e # True
"a" in d # True
"f" not in d # True
a1 = "ab"
a2 = "bc"
a1 + a2 == "abbc" # True
a1 + a2 is "abbc" # False
內(nèi)置函數(shù)
- len() 獲取字符串的長度
- str() 將其他類型轉(zhuǎn)換成字符串
a = "abcdef"
b = ""
c = 314e-2
len(a) # 6
len(b) # 0
str(c) # 3.14
str(True) # 1
成員函數(shù)
-
replace()字符串替換
a = 'abcdef' b = a.replace("c","x") print(a) # abcdef 注意a并沒改變 print(b) # abxdef a = a.replace("c","x") print(a) # abxdef a引用地址重新指向 -
slice()切片操作提取子字符串
語法:[起始start:終止end:步長step],不包含end位置的字符
a = "0123456789" a[0:2] # 01 a[:] # 0123456789 提取所有字符 a[:2] # 01 默認(rèn)start 0 a[::2] # 02468 步長為2 a[9:100] # 9 結(jié)束超過范圍了,相當(dāng)于直接到最后一個(gè) a[9:8] # '' 開始位置超過范圍了,不報(bào)錯(cuò)返回空 a[11:100] # '' 開始位置超過范圍了,不報(bào)錯(cuò)返回空 a[:2:-1] # 9876543 步長為負(fù)數(shù)時(shí),start默認(rèn)為-1 a[:2:-2] # 9753 a[-8:-2] # 234567 正向截取,從倒數(shù)第8個(gè)到倒數(shù)第2個(gè)(不含) a[-2:-1] # 8 正向截取,結(jié)束位置不對,只取開頭的值 print(a) # 0123456789 說明所有操作返回的是新對象地址 -
split()、join()分割和合并
split()可以基于指定分隔符(字符串或正則表達(dá)式)將字符串分隔成子字符串列表,默認(rèn)為空
join()用于將字符串列表連接起來
a = "a b c d" a.split() # ['a', 'b', 'c', 'd'] 相當(dāng)于用\s+分割 b = ["a","b","c"] *.join(b) # a*b*c "".join(b) # abc 注意這個(gè)性能優(yōu)于 + 連接字符 -
strip()去除字符串首尾指定信息
默認(rèn)去掉首尾的空格,可以指定去掉,如strip("##")
lstrip()去除字符串左邊指定信息
rstrip()去除字符串右邊指定信息
capitalize()、title()、upper()、lower()、swapcase()大小寫轉(zhuǎn)換
center()、ljust()、rjust()這三個(gè)函數(shù)用于對字符串實(shí)現(xiàn)排版
isalnum()是否為字母或數(shù)字
isalpha()檢測字符串是否只由字母組成(含漢字)。
isdigit()檢測字符串是否只由數(shù)字組成
isspace()檢測是否為空白符
isupper()是否為大寫字母
islower()是否為小寫字母
startswith()、endswith()、find()、rfind()、count()字符串查找
a = "abcdabcdabcdabcd"
b = "abcdabcd測試abcdabcd"
a.startswith("abcd") #True
a.endswith("d") # True
a.find("abcd") # 0 第一次出現(xiàn)位置
a.rfind("abcd") # 14 最后一次出現(xiàn)的位置
a.count("abcd") # 4出現(xiàn)4次
a.capitalize() # Abcdabcdabcdabcd
b.swapcase() # ABCDABCD測試ABCDABCD
b.center(30,'*') # ******abcdabcd測試abcdabcd****** 30為填充后的總長度
-
format() 格式化輸出
基本語法是通過 {索引/參數(shù)} 和 :
a = "測試格式化:{0},{1},{0}" b = "測試格式化:{tag1},{tag2},{tag1}" a.format("占位0","占位1") # '測試格式化:占位0,占位1,占位0' b.format(tag1="占位0",tag2="占位1") # '測試格式化:占位0,占位1,占位0' c = "格式化:{0:*^10},{1:#>10},{0:<10}" c.format("占位0","占位1") # '格式化:***占位0****,#######占位1,占位0 ' 注意最后的空格浮點(diǎn)數(shù)通過f,整數(shù)通過d進(jìn)行需要的格式化。
a = "我的身高是{0:d}cm,體重{1:.2f}kg" a.format(180,71.5489) # '我的身高是180cm,體重71.55kg' 注意有四舍五入 ''' 數(shù)字 格式 輸出 描述 3.1415926 {:.2f} 3.14 保留小數(shù)點(diǎn)后兩位 3.1415926 {:+.2f} 3.14 帶符號保留小數(shù)點(diǎn)后兩位 2.71828 {:.0f} 3 不帶小數(shù) 5 {:0>2d} 05 數(shù)字補(bǔ)零 (填充左邊, 寬度為 2) 5 {:x<4d} 5xxx 數(shù)字補(bǔ) x (填充右邊, 寬度為 4) 10 {:x<4d} 10xx 數(shù)字補(bǔ) x (填充右邊, 寬度為 4) 1000000 {:,} 1,000,000 以逗號分隔的數(shù)字格式 0.25 {:.2%} 25.00% 百分比格式 1000000000 {:.2e} 1.00E+09 指數(shù)記法 13 {:10d} 13 右對齊 (默認(rèn), 寬度為 10) 13 {:<10d} 13 左對齊 (寬度為 10) 13 {:^10d} 13 中間對齊 (寬度為 10) '''
Python中的序列
序列是一種數(shù)據(jù)存儲方式,用來存儲一系列的數(shù)據(jù)。在內(nèi)存中,序列就是一塊用來存放多個(gè)值的連續(xù)的內(nèi)存空間。Python中常用的序列結(jié)構(gòu)有:字符串、列表、元組、字典、集合。
列表
列表是大小可變的、用于存儲任意數(shù)目、任意類型的數(shù)據(jù)集合。
-
創(chuàng)建列表
- 基本語法
a = [] # 空列表 b = [1, 2, 3,'abc', True]- 通過list()創(chuàng)建
將可迭代的對象轉(zhuǎn)換成列表
a = list() # 空列表 b = list('abcd,efg') # ['a','b',....] c = list(range(10))-
通過range()創(chuàng)建
語法:range([start,] end [,step])
-
推導(dǎo)式生成列表
可以非常方便的創(chuàng)建復(fù)雜的列表
a = [x*2 for x in range(5)] # 循環(huán)創(chuàng)建多個(gè)元素 b = [x*2 for x in range(100) if x%6==0] #通過 if 過濾元素
-
列表元素的添加
-
append()
在列表尾部添加一個(gè)元素,原列表地址不變,這個(gè)性能沒問題,推薦使用
-
+運(yùn)算符
會(huì)產(chǎn)生新的對象,元素過大影響性能。
-
extend()
不會(huì)產(chǎn)生新的對象,在原對象尾部直接追加新的元素
-
insert()
插入元素到列表對象的任意制定位置。插入元素后面的元素會(huì)發(fā)生移動(dòng)。對性能有影響。
*復(fù)制擴(kuò)展
a = [1,2,3,4] a.append(5) print(a) # [1, 2, 3, 4, 5] id(a) # 4398822896 a = a + [5,6] print(a) # [1, 2, 3, 4, 5, 5, 6] id(a) # 4398824096 a.extend([7,8,9]) print(a) # [1, 2, 3, 4, 5, 5, 6, 7, 8, 9] id(a) # 4398824096 a.insert(4,100) print(a) # [1, 2, 3, 4, 100, 5, 5, 6, 7, 8, 9] id(a) # 4398824096 a = a * 2 print(a) #[1, 2, 3, 4, 100, 5, 5, 6, 7, 8, 9, 1, 2, 3, 4, 100, 5, 5, 6, 7, 8, 9] id(a) # 4398822896疑問: 這里最后的id和之前的一樣了,屬于什么情況呢,新分配了一個(gè)剛才使用過的地址?
-
-
元素的刪除
-
del
語法:del a[1],本質(zhì)是數(shù)組的拷貝,將刪除元素后面的元素地址一次向前拷貝。
-
pop
pop()刪除并返回指定位置元素,如果未指定位置則默認(rèn)操作列表最后一個(gè)元素。推薦使用默認(rèn)操作,不影響性能。
-
remove
刪除首次出現(xiàn)的指定元素,若不存在該元素拋出異常。
a = [1,2,3,4,5] del a[1] print(a) # [1, 3, 4, 5] a.pop() # 5 print(a) # [1, 3, 4] a.remove(3) print(a) # [1, 4] -
-
列表基本操作
通過索引直接訪問元素。索引的區(qū)間在[0, 列表長度-1]這個(gè)范圍。超過索引會(huì)引發(fā)異常。
-
index() 可以獲取指定范圍內(nèi)元素首次匹配的索引
語法: index(value,[start,[end]])
count() 獲得指定元素在列表中出現(xiàn)的次數(shù)
len() 獲取列表長度
in 或 not in判定元素是否存在于列表
列表切片,和前面的字符串操作基本一致
-
列表的遍歷
語法:for item in listA:
列表復(fù)制: [] + listA,直接listA = listB 只是引用賦值
max 和 min 返回列表中最大和最小值
sum 對數(shù)值列表進(jìn)行求和
a = [1,2,3,4,5] b = [1,2,3,4,5] a == b # True a is b # False a[0] # 1 a.index(2) # 1 a.count(5) # 1 len(a) # 5 5 in a # True a[::-1] # [5, 4, 3, 2, 1] 翻轉(zhuǎn)列表元素 c = [] + a c == b # True c is a # False d = a d is a # True for item in d: print(item) # 依次打印 1 2 3 4 5 sum(d) # 15 max(d) # 5 min(d) # 1 e = ['a','abc',1,True,0,False] # 不適用 max sum min 會(huì)報(bào)錯(cuò) -
列表排序
對象方法sort()在原列表中進(jìn)行排序
對象方法reverse()翻轉(zhuǎn)原列表
內(nèi)置函數(shù)sorted()返回排序后的新列表,原列表不變
-
內(nèi)置函數(shù)reversed()返回翻轉(zhuǎn)數(shù)據(jù)后的迭代器對象,原列表不變
注意這里返回的的是迭代器,需要用list()生成列表,迭代器只能用一次
```python
a = [1,2,3,4,5]
b = ['a','b','c','d']
c = ['a','abc','1',2,True]
a.sort()
print(a) # [1,2,3,4,5]
b.sort(reverse=True) #
print(b) # ['d', 'c', 'b', 'a']
c.sort() # 報(bào)錯(cuò):not supported between instances of 'int' and 'str'
a.reverse()
print(a) # [5, 4, 3, 2, 1]
a1 = sorted(a)
print(a) # [5, 4, 3, 2, 1]
print(a1) # [1, 2, 3, 4, 5]
```
-
二緯和多維列表
可以任意嵌套多維列表
a = [ [1,2,3,4], 5, ['a','b','c',[10,20,30]], 'abcd' ] ''' 這樣的列表需要一些技巧才能進(jìn)行遍歷 '''-
思考
Python的列表和Javascipt的數(shù)組很像,都是動(dòng)態(tài)的,可以隨時(shí)中增加的,對其中元素類型不做任何限制的。對處理復(fù)雜的數(shù)據(jù)結(jié)構(gòu),提供了相當(dāng)?shù)姆奖恪?/p>
-