Python基礎(三)
- 2019 年 10 月 3 日
- 筆記
今日主要內容
- 整型
- 範圍
- 進位轉換
- 字元串
- 索引
- 切片
- 部分方法詳解
- for循環
一、整型(int)
(一)整型的範圍
- 32位:-2 ** 31 ~ 2 ** 31 -1
- 64位:-2 ** 63 ~ 2 ** 63 -1
(二)進位轉換
-
十進位轉換二進位:
- 短除法:與2短除,除到商為0,從下向上取余
-
bin() 函數:將十進位數轉換為二進位數
num = 13 print(bin(num)) # 1101
-
二進位轉換十進位
- 算術法:從右向左依次乘2的n次方(n為0,1,2,…),最後相加
-
int() 函數:其中第二個參數傳入幾進位數,第一個參數傳入對應進位數
num = "1101" print(int(num, 2)) # 13
(三)不可變數據類型
-
什麼是不可變/可變類型數據
- 能在原地修改的數據是可變類型數據
- 不能再原地修改的數據(修改就會開闢新的記憶體空間)是不可變類型數據
-
整型是不可變類型數據
-
id() 函數:查看記憶體地址
a = 10 print(id(a)) # 1956675984 a = a + 1 print(id(a)) # 1956676016
二、字元串(str)
(一)索引
-
什麼是索引?
- 索引就是下標,python中索引是從0開始的
-
索引只給有序數據類型使用
-
索引的表示
str[下標]
-
正索引和反索引
- 正索引:從左到右依次 0,1,2 …
- 反索引:從右到左依次 -1,-2,-3 …
a = "糞發塗牆的郭老濕" print(a[0]) # 糞 print(a[3]) # 牆 print(a[5]) # 郭 print(a[-3]) # 郭
-
注意:索引時,超出最大索引值會報錯
a = "糞發塗牆的郭老濕" print(a[10]) # IndexError: string index out of range
(二)切片
-
上面的例子,如果想要得到"糞發塗牆",只能挨個索引再進行拼接
a = "糞發塗牆的郭老濕" a1 = print(a[0]) a2 = print(a[1]) a3 = print(a[2]) a4 = print(a[3]) print(a1 + a2 + a3 + a4) # 糞發塗牆
是不是很麻煩 ,可以利用切片
-
切片只給有序數據類型使用
-
切片格式
str[start: end: step]
- 默認step為1
-
特點:顧頭不顧腚
-
從開頭切片不用輸入start;
切到結尾不用輸入end;
從開頭切到結尾都不用輸入
a = "糞發塗牆的郭老濕" mes = a[:4] # 從開頭切不用輸入start print(mes) # 糞發塗牆
- step為步長,可以利用step間隔切片
a = "糞發塗牆老污郭" print(a[::2]) # 糞塗老郭
-
步長若為負數,則反向切片
注意:若反向切片,start和end的位置是從後往前取的
a = "糞發塗牆老污郭" print(a[::-2]) # 郭老塗糞 print(a[-2:-6:-1]) # 污老牆塗
- 將字元串反轉可以利用切片
a = "糞發塗牆老污郭" a_inversion = a[::-1] print(a_inversion) # 郭污老牆塗發糞
-
- 索引時,超出最大索引值不會報錯
(三)方法詳解
-
str.upper() 全部變為大寫 str.lower() 全部變為小寫 str.startswith(n) 判斷是否以n開頭 str.endswith(n) 判斷是否以n結尾 str.count(n) 計算n出現的次數 str.strip() 去掉兩端空格、n、t str.split(n) 以n切割 str.replace(old, new) 替換 str.isalnum() 判斷是否由數字、中文、字母構成 str.isalpha() 判斷是否由中文、字母構成 str.isdigit() 判斷是否由阿拉伯數字構成 str.isdecimal() 判斷是否由十進位數字構成
-
str.upper()
- 將字元串全部變為大寫,只對字母生效,對其他不報錯
a = "zxdznb" new_a = a.upper() print(a) # 不可變類型,原字元串不變 print(new_a) # ZXDZNB
-
str.lower()
- 將字元串全部變為小寫,只對字母生效,對其他不報錯
a = "ZXDZNB" new_a = a.lower() print(a) # 不可變類型,原字元串不變 print(new_a) # zxdznb
-
應用:登錄驗證碼,不區分大小寫
verify_code = "eF7d" while True: user = input("帳號:") pwd = input("密碼:") while True: print(f"驗證碼:{verify_code}") vc = input("請輸入驗證碼:") if vc.upper() == verify_code.upper(): # 全部變為大寫 break else: print("輸入錯誤,請重新輸入!") if user == "ZXD" and pwd == "zxd123": print("歡迎回來") break else: print(」帳號密碼錯誤,請重新輸入!「)
-
str.startswith(n)
- 判斷字元串是否以參數n開頭,輸出為布爾值
- 還可以判斷切片的開頭
a = "zxdznb" print(a.startswith("z")) # True print(a.startswith("x")) # False print(a.startswith("x", 1, 5)) # True print(a.startswith("z", 1, 5)) # False
-
str.endswith(n)
- 判斷字元串是否以參數n結尾,輸出為布爾值
- 還可以判斷切片的結尾
a = "zxdznb" print(a.endswith("b")) # True print(a.endswith("x")) # False print(a.endswith("n", 1, 5)) # True print(a.endswith("z", 1, 5)) # False
-
str.count(n)
- 計算參數n在字元串中出現的次數
- 還可以切片計算變數n出現的次數
a = "zxdznb" print(a.count("z")) # 2 print(a.count("z", 0, 3)) # 1
-
str.strip()
- 默認去掉字元串兩端空格、換行符(n)、製表符(t)
- 也可以去掉指定內容
a = " zxdznb " a1 = a.strip() print(a1) # zxdznb a2 = a1.strip("b") print(a2) # zxdzn
-
應用:去掉用戶輸入帳號密碼時,手誤多打的空格
while True: user = input("帳號:").strip() pwd = input("密碼:").strip() if user == "ZXD" and pwd == "zxd123": print("歡迎回來!") break else: print("帳號密碼錯誤,請重新輸入")
-
str.split()
- 默認以空格、換行符(n)、製表符(t)切割字元串,得到的是一個列表,
- 也可以指定字元切割
- 還可以填入第二個參數,可以指定切割次數
a1 = "zxd znb" lst1 = a1.split() print(lst1[0], lst1[1]) # zxd znb a2 = "zxd,znb" lst2 = a2.split(",") print(lst2[0], lst2[1]) # zxd znb a3 = "xdznbznb" lst3 = a3.split("z", 1) print(lst3[0], lst3[1]) # xd nbznb
-
str.replace(old, new)
- 將字元串中的字元替換成新字元
- 可以指定替換次數,默認全部替換
a = "zxdhnbhnb" new1_a = a.replace("h", "z") print(new1_a) # zxdznbznb # 全部替換 new2_a = a.replace("h", "z", 1) print(new2_a) # zxdznbhnb # 替換一次
-
str.isalnum()
- 判斷字元串是否由數字、中文、字母組成
a1 = "zxd666" a2 = "zxd_666" print(a1.isalnum()) # True print(a2.isalnum()) # False
-
str.isalpha()
- 判斷字元串是否由字母、中文組成
a1 = "zxd最nb" a2 = "zxd666" print(a1.isalpha()) # True print(a2.isalpha()) # False
-
str.isdigit()
- 判斷字元串是否由阿拉伯數字組成
a1 = "666" a2 = "六六六" print(a1.isdigit()) # True print(a2.isdigit()) # False
-
str.isdecimal()
- 判斷字元串是否由十進位數字組成
a1 = "66" a2 = "0x42" print(a1.isdecimal()) # True print(a2.isdecimal()) # False
三、for循環
(一)for循環和while循環的區別
- for循環:有限循環
- while循環:無限循環
(二)for循環的結構
-
for i in xxx: 循環體
- for:關鍵字
- i:變數名
- in:關鍵字
- xxx:可迭代對象
(三)len() 函數
- 查詢數據的長度,通用函數用於所有數據類型
(四)for循環舉例
-
一個面試題
for i in "abcde": pass print(i) # 循環最後給變數i賦值的是e,沒有變動e一直指向e
-
理解for循環和函數自上而下執行機制
num = 1 count = 3 while count: for i in "abc": print(i + str(num),end=",") print() count -= 1 num += 1
輸出結果: a1,b1,c1, a2,b2,c2, a3,b3,c3,