一、字符串
字符串就是由若干個不同的unicode字符組成的不可變序列
1 .字符串創建
#單引號字符串 str1 = '天要下雨,娘要嫁人,由他去吧' str2 = str() #空串 str3 = str([10,20,30]) ? #雙引號字符串 str2 = "天要下雨,娘要嫁人,由他去吧" ? #三引號字符串 多行字符串 str3 = ''' 好雨知時節 當春乃發生 ''' str4 = """ 隨風潛入夜 潤物細無聲 ""
2.獲取字符
因為是不可變序列,所以不能修改單個字符;凡是修改字符串的操作都產生新串
str1 = '天要下雨,娘要嫁人,由他去吧' print(str1[0],str1[-1]) #天 吧
3.字符串轉義
-
常見轉義字符
轉移字符 說明 轉移字符 說明 \'
單引號 \"
雙引號 \n 換行 \r 回車 \t tab \\ \ -
原生字符
如果在字符串中不把\當做轉移字符,可以使用
str1 = r'c:\wh1803\course\1' print(str1) #c:\wh1803\course\1
4.序列通用操作
#1 字符串拼接 #對于字符串字面值,只要相鄰兩個字符串中間沒有其他字符就會自動拼接為一個字符串 str1 = '中美達成共識''不打貿易戰' print(str1) #中美達成共識不打貿易戰 ? #其他情況使用+運算符拼接字符串 str1 = '你好' str2 = ' 樹先生' print(str1 + '世界') print(str1 + str2) ? #2.字符串重復 str1 = '汪' * 3 print(str1) #汪汪汪 ? #3.成員操作 str1 = '天要下雨,娘要嫁人,由他去吧' if '天' in str1:print('是成員') else:print('不是成員') ? #4.字符串截取(切片) str1 = '123456' print(str1[0:2]) #'12' print(str1[1:]) #'23456' print(str1[::2]) #'135' print(str1[:]) #'123456' print(str1[::-1]) #'654321' ? #5.字符串長度 print(len(str1))
4 字符串常用函數
4.1 字符串查找和替換
str1 = 'a fox jumped over the fence'
方法名 | 說明 | 示例 |
---|---|---|
str.count(sub,start=0,end=len(string)) | 查找子串sub出現的次數;start從指定下標開始查,end結束下標 | str1.count('f') |
str.find(str, beg=0, end=len(string)) | 從左向右檢測字符串中是否包含子字符串 str,如果包含返回下標,否則返回-1。beg和end是可選參數,指定查找范圍 | str1.find('fox') |
str.rfind(sub[, start[, end]]) | 從右向左檢測字符串中是否包含sub子串,包含返回子串的下標,否則返回-1 | str1.rfind('fox') |
str.index(sub[, start[, end]]) | 作用類似find,但子串sub不存在會報錯ValueError | str1.index('fox') |
str.rindex(sub[, start[, end]]) | 從右向左檢測,類似rfind,會報ValueError | str1.rindex('fox') |
str.replace(old, new[, count]) | 返回一個新字符串,原串中的old被替換為new,可選參數count指定替換次數。 | str1.replace('a','many') |
4.2 字符串分隔和組合
方法名 | 說明 | 示例 |
---|---|---|
str.split([sep[, num=count(sep)]]) | 將字符串拆分為以sep為分隔符的列表,如果指定num,則最多拆分num次 | str1.split(' ') |
str.rsplit([sep[, num=count(sep)]]) | 從右向左拆分 | ? |
str.partition(seq) | 將字符串拆分為一個有三個元素的元組(seq前的字符串,seq,seq后的字符串)。 | ? |
str.rpartion(seq) | 同上 | ? |
str.splitlines([keepends]) | 拆分一個包含多行的字符串,以每行為一個元素返回一個列表。keepends是一個True字符或非零整數,表示保留行尾標志(即換行符) | ? |
str.join(seq) | 以指定字符串str作為分隔符,將seq對象中所有的元素(字符串表示)合并為一個新的字符串;seq可以是字符串、列表等 | ? |
4.3 字符串判斷
方法 | 說明 | 示例 |
---|---|---|
str.isalpha() | 判斷字符串是否由字母構成并且只包含字母,是返回True,否返回False | str1.isalpha() |
str.isalnum() | 檢測字符串是否由字母和數字組成,如果都是數字或字母返回True,否則返回False | ? |
str.isdigit() | 檢測字符串是否由數字構成,可檢測byte類型 | ? |
str.isdecimal() | 檢測字符串是否由數字構成 | ? |
str.isnumeric() | 檢測字符串是否由數字構成, 可以檢測漢字數字:十 | ? |
str.isspace() | 檢測字符串是否只有空格或tab構成 | ? |
str.islower() | 檢測字符串中的字母字符是否全部由小寫字母組成 | ? |
str.isupper() | 檢測字符串中的字母字符是否全部由大寫寫字母組成 | ? |
str.startswith(suffix[, start[, end]]) | 用于判斷字符串是否以指定子字符串開頭,如果是則返回True,否則返回False。 | ? |
str.endswith(suffix[, start[, end]]) | 用于判斷字符串是否以指定子字符串 結尾,如果是則返回True,否則返回False。 | ? |
4. 4字符串轉換
方法 | 說明 | 示例 |
---|---|---|
str.lower() | 字符串轉小寫 | ? |
str.upper() | 字符串轉大寫 | ? |
str.swapcase() | 把字符串中的大小寫字母互換,大寫轉換成小寫,小寫轉換成大寫。不去管非字母類字符。 | ? |
str.capitalize() | 將字符串的第一個字符轉換為大寫, 其余轉換為小寫 | ? |
str.title() | 字符串中每個單詞的首字母大寫,其余小寫。 | ? |
str1.center(width,[fillchar]) | 用指定寬度居中顯示字符串,如果字符串無法填滿width,將用指定字符填充字符串,默認用空格填充 | str1.center(80,'*') |
str.ljust(width[, fillchar]) | 用指定寬度居左顯示字符串 | ? |
str.rjust(width[, fillchar]) | 用指定寬度居右顯示字符串 | ? |
str.lstrip([chars]) | 去除字符串左邊指定的字符,默認是去除空格 | ? |
str.rstrip([chars]) | 去除字符串左邊指定的字符,默認是去除空格 | ? |
str.strip([chars]) | 去除字符串兩邊邊指定的字符,默認是去除空格 | ? |
4.5 其它方法
#1. 將其他類型轉換為字符串 print(str(90)) #'90' print(str([20,30])) #'[20,30]' ? #2 ord(x) 返回一個字符所對應的碼值 print(ord('a')) #97 print(ord('中')) #20013 ? #3 chr(x) 輸入一個unicode碼,返回一個對應的字符。 print(chr(20013)) #中 ? #eval,將字符串當做代碼執行 age = 1 print(eval('age + 3')) # 4 print(eval('+123')) ? #123 print(eval('3 + 2')) ? #5 ? #有安全問題 eval("__import__('os').system('dir')") #顯示當前目錄的文件列表 ? #4 repr(x) 返回一個對象的String格式,適合機器執行 a = [20,30] s1 = repr(a) list1 = eval(s1) list2 = str(a) print(a == list1) print(a == list2)
5. 字符串格式化
-
用%格式化
%[flags][width][.precision]typecode flags:對其方式,-左對齊 +右對齊(默認),0表示用0填充,默認是用空格填充 width:所占寬度,單位是列 .precision: 精度,如果帶小數點,可以指定帶幾位小數,指定后會四舍五入 typecode: d 將數值轉換為整型顯示;f 將數值轉換為浮點數顯示 s將數值轉換為字符串顯示 #大家好,我叫 ? 王尼瑪,我今年35歲了,我有5000000.69 print("大家好,我叫%+6s,我今年%d歲了,我有%10.2f" % ('王尼瑪',35,5000000.687))
-
用format格式化
[[fill]align][sign][#][width][.precision][type] fill: 填充字符,可選 align: 對齊方式 ?<左對齊 ?>右對齊 ?^居中對齊 sign:顯示符號,+正數顯示正號,負數顯示符號;-正數不顯示符號,負數顯示符號 #: 對于2、8、16進制會顯示0b 0o 0x width: 寬度 , 千分位分隔符 .precision:精度 type: s字符串 ?d整型 ?f浮點數 ? tp1 = "I am {}, age {}, {}".format("seven", 18, 'alex') tp2 = "I am {name}, age {age}, really {name}".format(name="seven", age=18) tp3 = "I am {:s}, age {:d}, money {:.0f}".format("seven", 18, 88888.1) print(tp1) #I am seven, age 18, alex print(tp2) #I am seven, age 18, really seven print(tp3) #I am seven, age 18, money 88888
二、字節
在python3中最重要的特性是對文本和二進制數據做了更加清晰的區分,文本總是Unicode,由字符類型表示,而二進制數據則由byte類型表示,python3不會以任意隱式方式混用字節型和字符型,也因此在python3中不能拼接字符串和字節包(python2中可以,會自動進行轉換),也不能在字節包中搜索字符串,也不能將字符串傳入參數為字節包的函數。
Bytes 對象是由單個字節作為基本元素(8位,取值范圍 0-255)組成的序列,為不可變對象。 bytes對象只負責以二進制字節序列的形式記錄所需記錄的對象,至于該對象到底表示什么(比如到底是什么字符)則由相應的編碼格式解碼所決定。Python3中,bytes通常用于網絡數據傳輸、二進制圖片和文件的保存等等。可以通過調用bytes()生成bytes實例,其值形式為 b'xxxxx',其中 'xxxxx' 為一至多個轉義的十六進制字符串(單個 x 的形式為:\x12,其中\x為小寫的十六進制轉義字符,12為二位十六進制數)組成的序列,每個十六進制數代表一個字節(八位二進制數,取值范圍0-255),對于同一個字符串如果采用不同的編碼方式生成bytes對象,就會形成不同的值.
1 創建字節
#創建字節 b1 = b'hello' b2 = b"ello" b3 = b'''hello''' b4 = bytes('中文','utf-8')
2 設置python文件編碼格式
# -*- coding: utf-8 -*- import sys sys.setdefaultencoding('utf-8') #修改系統默認編碼格式
3 字符串和字節的轉換
#字符串轉字節 s1 = "中文" s2 = s1.encode('utf-8') #str.encode() print(type(s2)) #<class 'bytes'> print(s2) #b'\xe4\xb8\xad\xe6\x96\x87' ? #字節轉字符串 s3 = s2.decode('utf-8') #bytes.decode() print(type(s3)) #<class 'str'> print(s3) #中文
三、元組
元組和列表相似,但元組屬于不可變序列,所以元組:
-
不能修改元素的值
-
元組用()表示
1.1 創建元組
t1 = () ? #創建一個空元組 #或者 t1 = tuple() #空元組 ? t2 = (1,) #創建帶有一個元素的元組,后面的逗號是必須的,否則無法區分是()表達式還是元組 或者:t2 = 1, t3 = (1,4,True,'hello') t4 = 10,20,30 #t4 = (10,20,30) t5 = tuple('abc')
1.2 成員訪問
t1 = (10,7,12,23) print(t1[0]) #print(t1[4]) 下標越界 IndexError ? t2 = (1,2,[4,5]) t2[2][0] = 10 #元組的元素無法修改,但元素如果是可變列表,則列表元素是可以修改的
1.3 通用操作
#1.連接 t1 = (1,2,3) t2 = (4,5,6) t3 = t1 + t2 print(t3) #(1,2,3,4,5,6) ? #2.重復 print(t1 * 2) #(1,2,3,1,2,3) ? #3.切片 print(t3[0:3]) #(1,2,3) print(t3[3:]) ? #(4,5,6) print(t3[-1::-1]) (6,5,4,3,2,1) ? #4.成員運算符 print(3 in t3) #True print(2 not in t3) #False ? #5.元素個數 print(len(t3)) ? #6.最值 print(max(t3)) #6 print(min(t3)) #1
1.4 元組其它操作
-
元組和列表的轉換
t1 = (10,20,30) l1 = [1,2,3] ? #列表轉元組 print(tuple(l1)) ? #元組轉列表 print(list(t1))
-
查找
t1 = (10,20,30,10) print(t1.index(20)) #查找值等于20的第一個元素 print(t1.count(10)) #返回元組中10的個數
-
遍歷
t1 = (10,20,30,10) for value in t1:print(value)#同時獲取下標和值 for index,value in enumerate(t1):print(index, value) ? #通過下標遍歷 for i in range(len(t1)):print(t1[i])
1.5 二維元組
t1 = ((1,2,3),(4,5,6)) ? #遍歷 for elem in t1:for value in elem:print(value, end = ' ')print('')
1.6 序列的解包
#元組解包 #變量個數和元素個數一致 t1 = (11,20) a, b = t1 print(a,b) #11 20 ? a, b = 2, 3 ? a,b,c = (1,2,3) ? #變量個數和元素個數不同 #a=10,c=50,_獲取(20,30) a, *_, c = 10,20,30,50 print(a,c,_) #10 50 [20, 30] ? #a=10,b=20,c獲得剩余的元素 a, b, *c = 10,20,30,50 print(a,b,c) #10 20 [30, 50] ? #*解包 print(*(1,2,3)) # 1 2 3 ? #range解包 a, b, c = range(3) #a=0,b=1,c=2 ? #列表解包 a,*_b,c = [1,2,3,4,5] print(a,_b,c) # 1 [2, 3, 4] 5 ? #字符串解包 a,b,c = '123' print(a,b,c) # a='1',b='2',c='3' ? ? # *解包形式 a = (1,2,3,4) print(*a) print(*[1,2,3,4])
###
四、字典
字典不屬于序列,元素存放無序,是通過哈希方式進行數據存取的,字典是一個可變容器,字典中保存一個個的鍵值對: key : value。我們通過key來獲取對應的值,很類似我們的漢語字典。
-
字典中鍵必須是唯一的,必須是不可變類型
-
字典查找速度比較快
2.1 字典的創建
d1 = {} #空字典 d1 = dict() #空字典 d2 = {'name':'麻辣龍蝦','taste':'美味'} d3 = dict(a=1,b=2) d4 = dict([('a', 1),('b', 2)]) d5 = dict({'a':1,'b':2})
2.2 字典操作
#存儲多個學生的成績 dict1 = {"jack":78,"hanmeimei":99,"lilei":60} print(dict1) ? #1.元素訪問 #獲取 ? 語法:字典名[key] print(dict1["hanmeimei"]) ? #print(dict1["tom"]) #KeyError: 'tom' ? #字典名.get() result = dict1.get("lilei",'1') # 如果沒有lilei這個鍵,返回默認值1,不會報錯 print(result) ? #2.添加:當指定的鍵不存在的時候,則表示添加 dict1["tom"] = 70 print(dict1) #但是,如果鍵已經存在,則表示修改value dict1["jack"] = 50 print(dict1) ? #3. 刪除 pop 刪除并返回指定鍵對應的值 #注意:通過鍵,直接刪除整個鍵值對 dict1.pop("jack") print(dict1) ? del dict1['lilei'] #刪除鍵值對,不返回值 dict1.clear() #清空字典 del dict1 #刪除整個字典 ? #4 字典合并 a = {1:'hello'} b = {2:'world'} a.update(b) print(a) ? #5.遍歷 dict2 = {"jack":78,"hanmeimei":99,"lilei":60} ? #方式一:只獲取鍵 for key in dict2:value = dict2[key]print(key,value) ? #方式二:只獲取值 #values,得到的結果是一個列表,當做列表處理 print(dict2.values()) ? for value in dict2.values():print(value) ? ? #方式三:同時獲取鍵和值 #items,得到的結果是一個列表,列表中的元素是元組 print(dict2.items()) #[('jack', 78), ('hanmeimei', 99), ('lilei', 60)] ? for key,value in dict2.items():print(key,value) ? #方式四 for index,key in enumerate(dict2):value = dict2[key]print(index,key,value) ? #6.獲取鍵值對的個數 print(len(dict1)) ? #7.成員操作 d2 = {'name':'麻辣龍蝦','taste':'美味'} print('name' in d2) #判斷某個鍵是否在列表中