本講主要內容 2.1 變數 1. 變數是什麼? 變數,是指把程式運行的中間結果臨時的存在記憶體里,以便後續的代碼調用,其值可以修改。 在python中,當變數被使用時,在記憶體里將產生兩個動作,一是開闢指定地址的空間,二是賦予指定的變數值。 在python語言中,變數在指定的同時,必須強制賦初值,否則解 ...
本講主要內容
變數
字元串
數字和運算符
數據類型轉換
2.1 變數
1. 變數是什麼?
變數,是指把程式運行的中間結果臨時的存在記憶體里,以便後續的代碼調用,其值可以修改。
在python中,當變數被使用時,在記憶體里將產生兩個動作,一是開闢指定地址的空間,二是賦予指定的變數值。
在python語言中,變數在指定的同時,必須強制賦初值,否則解釋器報錯。
name # name變數未賦值,解釋器認為非法,報未定義錯誤 name = 'kidd' # name變數賦予初值'kidd',解釋器執行通過
這裡的name為變數名,其值為'kidd'。Python變數賦值通過等號(=)來實現。
變數建立的結果,往往被其他代碼所使用。例如:
x = 1+2+3+4 print(x) # print函數列印變數x的結果,輸出10
2. 多個變數賦值
Python允許同時為多個變數賦值。
one = two = three = 1 print(one, two, three) # print函數允許多值列印輸出,用逗號分隔變數
註:one, two, three三個變數在記憶體中指向同一個地址。也可以按照下麵的格式,給不同的變數名賦值:
one, two, three = 1, 1, 1 print(one, two, three) # print輸出值也為三個連續的1
3. 變數值類型
所有編程語言的變數值都是分類型的,Python語言變數值的類型在賦值後才被隱性確定。
例如x = 0,那麼0就是整數類型的值;x = 'ok',那麼ok就是字元串類型的值;x = True,那麼True就是布爾類型的值。
Python語言的基本變數類型包括字元串、數字、列表、元組、字典五大類。
註:變數命名規則 (1)變數只能由字母、數字、下劃線組成。 (2)不能以數字開頭。 (3)不能是python中的關鍵字 (4)大小寫區分,a = 1和A = 1是兩個變數。 以上要求是必須滿足的,下麵的要求要儘量做到 (5)變數名要有描述性,要簡潔、易讀,不宜過長。 (6)變數名不能使用中文以及拼音。 (7)官方推薦使用的變數名: 下劃線:my_name = 'kidd' 駝峰體:MyName = 'kidd'
註:關於常量
常量,即不能變的數據對象。
在python中,常量名全部為大寫,且放在文件的最上面。
NAME = ‘kidd’
2.2 字元串
字元串,由任意位元組的字元組成,用單引號(')、雙引號( “)或三引號(''')成對錶示。
簡單的說,凡是用引號括起來的就是字元串。
name = 'kidd' name1 = "kidd"
單雙引號配合使用:
s = "I'm kidd"
當一個字元串有多行時,一般考慮使用三引號:
msg = '''床前明月光, 疑是地上霜, 舉頭望明月, 低頭思故鄉。'''
註:只有引號,沒有位元組內容的字元串也是合法的。例如name = ''
2.2.1 字元串的基本操作
字元串值基本操作包括讀取、合併、修改、刪除、查找
1. 字元串值的讀取
s = 'Tom is a cat'
代碼中的字元串在記憶體中的存放順序如下表所示:
s字元串: | T | o | m | i | s | a | c | a | t | |||
對應下標地址: | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
從上表可以看出,字元串中的每個字元都對應一個下標。字元串的下標都是從0開始。
註:下麵對字元串進行的操作,形成的都是一個新的字元串,與原來的字元串沒有關係
(1)按照索引取值:[下標]。
s1 = s[2] # 讀取下標為2的字元 print(s1) 結果:m
(2)按照切片取值:[左下標: 右下標],顧頭不顧尾。
s2 = s[4:6] # 讀取下標為4,5的字元 print(s2) 結果:is
(3)帶冒號省略下標方式切片:[左下標: ]、[: 右下標]、[ : ]。
s3 = s[: 3] # 讀取下標為前三個的字元 print(s3) 結果:Tom [: 3] 指的是從字元串的開始,讀到下標為2的字元 s4 = s[9: ] # 讀取下標從第9到最後的字元 print(s4) 結果:cat s5 = s[:] # 讀取整個字元串 print(s5) 結果:Tom is a cat
(4)負數下標讀取:用負數下標從右到左讀取對應的字元串值。
s6 = s[-1] # 從右往左,讀取右邊第一個字元 print(s6) 結果:t s7 = s[-3: -1] # 從右往左,讀取倒數第三個、倒數第二個字元 print(s7) 結果:ca
(5)帶步長的切片讀取:[左下標: 右下標: 步長]。
s8 = s[: : 2] # 從頭到尾,步長為2,讀取對應字元 print(s8) 結果:Tmi a # 如果想倒序取值,加一個反向步長(步長前加負號) s9 = s[-1:-6: -2] print(s9) 結果:tca
註1:Python在採用下標讀取其他對象值時,也統一採用類似風格的下標使用方法,如後面要講到的列表、元組等。
註2:使用下標時,超出字元串範圍讀取值,解釋器將報錯。
2. 字元串值合併
對於不同的字元串,可以通過加號(+)進行合併操作
name = 'kidd' job = 'student' res = name + ', ' + job # 用加號合併三個字元串 print(res) 結果:kidd, student
註:字元串值也可以與數字相乘 s = '錦鯉' s1 = s * 6 # 重覆顯示6個錦鯉 print(s1) 結果:錦鯉錦鯉錦鯉錦鯉錦鯉錦鯉
3. 字元串值修改
replace:替換 s = 'Tom is a cat, Tom...' s1 = s.replace('Tom', 'Jack') # 前面為要替換的內容,後面為替換的內容 print(s1) 結果:Jack is a cat, Jack... # 可以設置替換次數,但是只能從前往後開始替換 s2 = s.replace('Tom', 'Jack', 1) print(s2) 結果:Jack is a cat, Tom...
name = 'I am a student' new_name = name[: 7] + 'teacher' print(new_name) 結果:I am a teacher 上述字元串值的修改,是通過讀取子字元串併合並的方法實現的。 不能直接對字元串做如下修改操作: name[3] = 'i' # 解釋器將報錯
4. 字元串值刪除
strip:預設去除字元串前後的空格、換行符(\n)、製表符(\t) name = '\tblame kidd ' print(name.strip()) 結果:'blame kidd' # 加引號是為了區分空格 # 也可以指定去除的字元 name = '**blame kidd*' print(name.strip('*')) # 去除字元串首尾的* 結果:blame kidd name = 'iwakiddwa' print(name.strip('wai')) 結果:kidd 去除字元串前面的空格:lstrip 去除字元串後面的空格:rstrip # 應用舉例:登錄賬戶時 username = input('請輸入用戶名:').strip() if username == 'kidd': print('登錄成功!')
del:刪除整個字元串值 del(name) # 清楚記憶體中的name,再次調用name將報錯
說明:del(x)函數函數記憶體中一個指定的對象x,x可以是字元串、數字、列表、元組、字典、類等。
5. 字元串值查找
判斷以什麼為開頭:startswith print(name.startswith('bl')) # 判斷是否以bl開頭 結果:True print(name.startswith('e', 4)) # 判斷第5個位置之後的字元串以什麼開頭 結果:True print(name.startswith('la', 1, 5)) # 判斷第2個位置到第5個位置的字元串以什麼為開頭 結果:True
判斷以什麼為結尾:endswith
與startswith用法一致
通過元素找索引,找到第一個元素就返回索引值,沒有此元素則返回-1:find print(name.find('a')) 結果:2 print(name.find('d')) 結果:7 print(name.find('w')) 結果:-1 print(name.find('m', 1, -1)) # find可以設置查找的字元串的開始位置和結束位置 結果:3
通過元素找索引,找到第一個元素就返回其索引值,沒有此元素則報錯:index print(name.index('a')) 結果:2 print(name.index('w')) # 沒有w,報錯
2.2.2 其它常用操作
1. 獲取字元串長度
用len函數可以獲取字元串長度
name = 'blame kidd' print(len(name)) 結果:10
說明:len(x)函數返回一個對象的長度,x可以是字元串、列表、元組、字典。
註:
在python3.6版本中,把一個漢字看作一個字元串長度
在python2.x版本中,把一個漢字看作兩個字元串長度
2. r/R原始字元串控制符號
print('D:\back\name') # 字元串里含特殊轉移符號,\b, \n 結果:D:ack # 沒有使用r情況下,\b轉為了退格符,實現了退一格的效果 ame # \n轉為了換行符,實現了其後字母的換行顯示 print(r'D:\back\name') 結果:D:\back\name # 在使用r情況下,字元串原樣輸出,轉義字元不起作用
3. split:將字元串分割成列表(str -- > list), 預設按照空格分割
s = 'apple huawei xiaomi' l1 = s.split() # 預設按照空格分割 print(l1) 結果:['apple', 'huawei', 'xiaomi'] s = 'apple, huawei xiaomi' l2 = s.split(',') print(l2) 結果:['apple', 'huawei xiaomi']
註意這三個的區別: s1 = ' apple huawei xiaomi' print(s1.split()) 結果:['apple', 'huawei', 'xiaomi'] s2 = ' apple huawei xiaomi' print(s2.split(' ')) 結果:['', 'apple', 'huawei', 'xiaomi'] s3 = ',apple,huawei,xiaomi' print(s3.split(',')) 結果:['', 'apple', 'huawei', 'xiaomi']
# 可以設置split的分割次數 s = 'blameliop' print(s.split('l', 1)) 結果:['b', 'lameliop]
4. join:自定製連接符,將可迭代對象中的元素連接起來
s = 'kidd' s1 = '*'.join(s) print(s1) 結果:k*i*d*d
5. capitalize:首字母大寫
name = 'blame kidd' print(name.capitalize()) 結果:Blame kidd
6. title:非字母隔開的每個部分的首字母大寫
name = 'blame kidd' print(name.title()) 結果:Blame Kidd
7. center:字元串居中,前後填充自定義的字元
name = 'blame kidd' print(name.center(20, '*')) 結果:*****blame kidd*****
8. upper:字元串全部大寫;;lower:字元串全部小寫
name = 'Blame Kidd' print(name.upper()) 結果:BLAME KIDD print(name.lower()) 結果:blame kidd
應用場景:驗證碼不區分大小寫 code = 'AjkG'.lower() your_code = input('請輸入驗證碼:').lower() if code == your_code: print('驗證成功!')
9. swapcase:大小寫轉換
name = 'BlaMe kiDd' print(name.swapcase()) 結果:bLAmE KIdD
10. 格式化輸出:%、format
# %s為格式化字元串;%d為格式化整數 name = 'blame kidd' age = 18 print('My name is %s, My age is %d'%(name, age)) 結果:My name is blame kidd, My age is 18
format有三種方式 第一種: s1 = '我叫{}, 今年{}'.format('kidd', '18') print(s1) 結果:我叫kidd, 今年18 第二種: s2 = '我叫{0}, 今年{1}, 我還是叫{0}'.format('kidd', '18') print(s2) 結果:我叫kidd, 今年18, 我還是叫kidd 第三種: s3 = '我叫{name}, 今年{age}, 我還是叫{name}'.format(age = '18', name = 'kidd') print(s3) 結果:我叫kidd, 今年18, 我還是叫kidd
11. is系列
name = 'kidd123' print(name.isalpha()) # 判斷name是否全部以字母組成 結果:False print(name.isdigit()) # 判斷name是否全部以數字組成 結果:False print(name.isalnum()) # 判斷name是否以字母或者數字組成 結果:True
12. count:計數
name = 'blame kidd' print(name.count('d')) # 計算給定字元出現幾次,可以進行切片 結果:2