一、String字符串
1.分割和合並
1.1 str1.split(str2, num)
功能:以str2爲分割截取字符串,num默認爲str1.count(str2)
若給定num 後,則截取num個字符串,剩餘的不再進行截取。
str1 = "how are you , i am fine thank you"
#使用空格進行分割
list1 = str1.split(" ")
print(list1)
#結果
['how', 'are', 'you', ',', 'i', 'am', 'fine', 'thank', 'you']
1.2 str1.splitlines([keepends])
功能:字符串會按照行(’\r’,’\r\n’,’\n’)進行分割,返回一個包含各行作爲元素的列表,如果參數keepends的值爲False,不包含換行符,如果爲True,則保留換行符。
str2 = '''how are
you ?
i am
fine
!
'''
list2 = str2.splitlines()
print(list2)
#結果
['how are', 'you ?', 'i am', 'fine', '!']
str2 = '''how are
you ?
i am
fine
!
'''
list2 = str2.splitlines(keepends=True)
print(list2)
#結果
['how are\n', 'you ?\n', 'i am\n', 'fine\n', '!\n']
1.3 str1.join(seq)
功能:以指定字符串作爲分隔符,將seq中的所有元素合併成爲一個新的字符串
list2 = ['you', 'are', 'very', 'great', '!']
str3 = ' '.join(list2)
print(str3)
#結果
you are very great !
str1 = "how are you , i am fine thank you"
str3 = "*".join(str1)
print(str3)
#結果
h*o*w* *a*r*e* *y*o*u* *,* *i* *a*m* *f*i*n*e* *t*h*a*n*k* *y*o*u
注意:如果連接的是字符串,則它會把字符串中的每個字符使用指定字符連接。
2.獲取最大最小字符
2.1 max(str)
功能: 返回字符串str中最大的字母
str1 = "how are you , i am fine thank you"
print(max(str1))
#結果
y
2.2 min(str)
功能:返回字符串str中最小字母
str1 = "how are you , i am fine thank you"
print(min(str1))
#結果
‘ ’
注意:比較的是ASCII碼值
3.字符串的替換
3.1 replace(old , new [, count])
功能:將字符串中的old替換成new,若不指定count,則默認全部替換,若指定count,則替換前count個
str1 = "how are you , i am fine thank you"
str2 = str1.replace("you" ,'me')
print(str2)
#結果
how are me , i am fine thank me
3.2 字符串映射替換
參數一:要轉換的字符 參數二:目標字符
dic = str.maketrans(oldstr, newstr)
str2.translate(dic)
str5 = "aaa bbb ccc deee"
dic = str5.maketrans("ac", "21")
# a--2 c--1
str7 = "how are you ,u ewe "
print(str7.translate(dic))
#結果
how 2re you ,u ewe
#注意:很少用
4.判斷字符串的開頭結尾
str.startswith(str1, start=0, end=len(str))
功能:在給定的範圍內判斷字符串是否以給定的字符串開頭,如果沒有指定範圍,默認整個字符串
str1 = "aaa bbb ccc deee"
print(str1.startswith("aa"))
#結果
True
str1 = "aaa bbb ccc deee"
print(str1.startswith("aa", 3, 9))
#結果
False
str.endswith(str, start=0, end=len(str))
功能:在給定的範圍內判斷字符串是否以指定的字符串結尾,若沒有指定範圍,默認爲整個字符串
str1 = "aaa bbb ccc deee"
print(str1.endswith("e"))
#結果
True
str1 = "aaa bbb ccc deee"
print(str1.endswith("e", 3 ,9))
#結果
False
5.編碼與解碼
str.encode(encoding=“utf-8”, errors=“scrict”)
功能:字符串的編碼,若不指定encoding則默認選擇utf-8
str1 = "你好嗎?"
data = str1.encode()
print(data)
print(type(data))
#結果
b'\xe4\xbd\xa0\xe5\xa5\xbd\xe5\x90\x97\xef\xbc\x9f'
<class 'bytes'>
str.decode(encoding=“utf-8”)
“hello”.encode(“utf-8”).decode()
功能:對字符進行解碼,若不指定編碼格式,則默認選擇utf-8
str1 = "你好嗎?"
data = str1.encode()
print(data)
print(type(data))
data2 = data.decode()
print(data2)
print(type(data2))
#結果
b'\xe4\xbd\xa0\xe5\xa5\xbd\xe5\x90\x97\xef\xbc\x9f'
<class 'bytes'>
你好嗎?
<class 'str'>
注意:解碼時的編碼格式要與編碼時的保持一致
拓展:errors = ignore 的時候,忽略錯誤
6.判斷是否爲字母或數字
str.isalpha()
功能:判斷字符串至少有一個字符,並且所有的字符都是字母,若爲真則返回True,否則返回False
注意:中文沒有考慮在內
str8 = "hello ni hao "
print(str8.isalpha())
#結果
False
str9 = "hellonahao"
print(str9.isalpha())
#結果
True
str.isalnum()
功能:判斷一個字符串至少有一個字符,並且所有的字符都是字母或數字則返回True否則返回False
注意:中文不考慮在內
str10 = "sc22xdcd"
print(str9.isalnum())
print(str10.isalpha())
#結果
True
False
7.判斷大小寫
str.isupper()
功能:若字符串中包含至少一個字母的字符,並且這些字母都是大寫,則返回True,否則返回False
str10 = "AA2221 111"
print(str10.isupper())
#結果
True
str10 = "AAaaa"
print(str10.isupper())
#結果
False
str.islower()
功能:若字符串中包含至少一個字母的字符,並且這所有的字母都是小寫,則返回True,否則返回False
str10 = "aa2221 111"
print(str10.islower())
#結果
True
8.判斷是否包含特殊字符
8.1 str.istitle()
功能:如果一個字符串是標題化的則返回True,否則返回False
【標題化】每個首字母大寫
str1 = "Hello World"
print(str1.istitle())
8.2 str.isdigit()
isdigit()
True: Unicode數字,byte數字(單字節),全角數字(雙字節),羅馬數字
False: 漢字數字
Error: 無
print("123".isdigit())
print("123a".isdigit())
#結果
True
False
同上
str.isnumeric()
功能:若字符串中只包含數字字符,則返回True,否則返回False
isnumeric()
True: Unicode數字,全角數字(雙字節),羅馬數字,漢字數字
False: 無
Error: byte數字(單字節)
8.3 str.isdecimal()
功能:檢查字符串是否只包含十進制字符,如果是返回True,否則返回False
isdecimal()
True: Unicode數字,,全角數字(雙字節)
False: 羅馬數字,漢字數字
Error: byte數字(單字節)
print("123".isdecimal())
print("123z".isdecimal())
#結果
True
False
num = "1" #unicode
num.isdigit() # True
num.isdecimal() # True
num.isnumeric() # True
num = "1" # 全角
num.isdigit() # True
num.isdecimal() # True
num.isnumeric() # True
num = b"1" # byte
num.isdigit() # True
num.isdecimal() # AttributeError 'bytes' object has no attribute 'isdecimal'
num.isnumeric() # AttributeError 'bytes' object has no attribute 'isnumeric'
num = "IV" # 羅馬數字
num.isdigit() # True
num.isdecimal() # False
num.isnumeric() # True
num = "四" # 漢字
num.isdigit() # False
num.isdecimal() # False
num.isnumeric() # True
8.4 str.isspace()
功能:如果字符串只包含空格,則返回True,否則返回False
print(" ".isspace())
print("\t".isspace())
print("\n".isspace())
print("\r".isspace())
print(" qq".isspace())
#結果
True
True
True
True
False
9.ASCII碼轉換
9.1 ord(str)
功能:獲取字符串的整數表示 ASCII碼值
print(ord("A"))
print(ord("你"))
#結果
65
20320
9.2 chr(str)
把編碼轉成對應的字符
print(chr(68))
print(chr(20190))
#結果
D
仞
二、dict字典
1.概述
dict也是一種存儲方式,類似於list和tuple,但是,字典採用鍵—值(key—value)的形式存儲
優點:具有極快的查找速度
2.key的特性
1.字典中的key必須唯一
2.key必須是不可變對象
例如:字符串、整數等都是不可變的,可以作爲key
list是可變的,不能作爲key
思考:保存一個班級中的童鞋的成績
思路1:使用list或者tuple,但是容易發生錯亂對不上號
思路2:使用二維list或者tuple,但是會比較慢
思路3:可以採用字典,將學生的學號或者名字作爲key,成績爲value進行存儲,方便查找
3.字典的創建
語法:
字典名 = {鍵1:值1,鍵2:值2,…}
dist1 = {'tom':90,'lili':78, 'lele':92}
print(dist1)
4.字典操作
4.1訪問元素
語法:元素 = 字典名[key]
dist1 = {'tom':90,'lili':78, 'lele':92}
print(dist1['tom'])
注意:在key不存在的情況下,會報錯
語法: 元素 = 字典.get(key)
功能:使用get的方法獲取值,若key存在,則返回value的值,若key不存在則返回None
dist1 = {'tom':90,'lili':78, 'lele':92}
value = dist1.get('tom')
print(value)
4.2 添加元素
語法:字典名[key] = value
dist1 = {'tom':90,'lili':78, 'lele':92}
dist1['lisi'] = 89
print(dist1)
注意:一個key只能對應一個value,多次對一個key的value賦值,後面的值會把前面的值覆蓋掉。
4.3 刪除元素
語法:字典名.pop(key)
dist1 = {'tom':90,'lili':78, 'lele':92}
dist1.pop('tom')
print(dist1)
5.字典的遍歷
5.1 使用for循環遍歷
語法:
獲取鍵
for key in dist:
print(key)
獲取值
for value in dist.values() :
print(value)
同時獲取鍵和值
for k, v in dist.items() :
print(k, v)
注意:字典是無序的,在內存中存儲是無序的,因此無法通過下標來獲取值
dist1 = {'tom':90,'lili':78, 'lele':92}
#獲取字典的key
for key in dist1:
print(key)
#獲取字典中的value
for value in dist1.values():
print(value)
#同時獲取字典中的key與value
for k, v in dist1.items():
print(k, v)
6.與list的區別
1.dict的查找和插入的速度極快,不會隨着key-value的增加而變慢,但是list在查找的時候需要從頭向後挨個遍歷元素,並且當數據量增大的時候,速度也會隨着變慢
2.dict需要佔用大量的內存,內存浪費多,而list只相當於存儲了字典的key或者value部分,並且數據時緊密排列的。
三、set集合
1.概述
set與dict類似,也是一組key的集合,但與dict的區別在於set不存儲value
本質:無序且無重複元素的集合
只存儲了字典的key,沒有存儲字典的value
2.set的創建
語法:
set1 = set([1, 2, 3, 4, 5])
注意:創建set需要一個list或者tuple或者dist作爲輸入集合,重複的元素在set中會被自動的過濾
s1 = set([1, 2, 3, 4, 5])
print(s1)
3.set操作
3.1 set.add()
注意:
1.可以添加重複的元素,但是不會有效果
2.add 的元素不能是列表或者字典,因爲他們是可變的
s1 = set([1, 2, 3, 4, 5])
s1.add(6)
s1.add((2, 3, 4))
print(s1)
#結果
{1, 2, 3, 4, 5, 6, (2, 3, 4)}
3.2 set.update()
功能:插入整個list、tuple、字符串打碎插入
注意:不能直接插入數字
s1 = set([1, 2, 3, 4, 5])
s1.update([4,"anam","hha"])
s1.update("hello")
print(s1)
#結果
{1, 2, 3, 4, 5, 'anam', 'l', 'o', 'h', 'e', 'hha'}
3.3 set.remove(元素)
功能:刪除元素
s1 = set([1, 2, 3, 4, 5])
s1.remove(3)
print(s1)
3.4 遍歷元素
語法:
for i in set :
print(i)
注意:set是無序的,因此不能通過下標獲取元素
for index, data in enumerate(set):
print(index, data)
可以通過這種方式,來強行添加下標
s1 = set([1, 2, 3, 4, 5])
for i in s1:
print(i)
for index,data in enumerate(s1):
print(index, data)
3.5 交集與並集
語法:
交集 newest = set1 & set2
並集 newest = set1 | set2
s1 = set([1, 2, 3, 4, 5])
s2 = set([4, 5, 6, 7])
s3 = s1 & s2
s4 = s1 | s2
print(s3)
print(s4)
#結果
{4, 5}
{1, 2, 3, 4, 5, 6, 7}
四、類型轉換
主要針對幾種存儲工具:list、tuple、dict、set
特殊之處:dict是用來存儲鍵值對的
4.1 list 轉換爲set
l1 = [1, 2, 4, 5]
s1 = set(l1)
print(type(s1))
print(s1)
4.2 tuple 轉換爲set
t1 = (1, 2, 3, 4)
s1 = set(t1)
print(type(s1))
print(s1)
4.3 set轉換爲list
s1 = set([1, 2, 3, 4])
l1 = list(s1)
print(type(l1))
print(l1)
4.4 set轉換爲tuple
s1 = set([1, 2, 3, 4])
t1 = tuple(s1)
print(type(t1))
print(t1)
五、迭代器
列表生成式
語法:
list = [result for x in range(m, n)]
需求:創建一個[1, 2, …100]的列表
>>> range(1, 101)
[1, 2, 3, 4, 5,...,100]
需求2 :生成一個[1x1, 2x2, 3x3,….100x100]的列表
>>> list1 = []
>>> for x in range(1, 101)
list1.append(x*x)
>>> list1
[1, 4, 9,....10000]
#使用列表生成式,可以這麼來寫
>>> list2 = [x*x for x in range(1, 101)]
三目運算符
xx if 判斷語句 else xxxx
本質:就是把for循環強制性的寫在一行,而輸出的結果寫在最前面,把結果使用[]括起來
5.1 可迭代對象
1.可以直接直接作用於for循環的對象統稱爲可迭代對象,我們稱之爲:Iterator
2.我們可以使用isintance()判斷一個對象是否是Iterator對象
3.可以直接作用於for循環的數據類型有以下幾種
a.集合數據類型:如list、tuple、dict、set和string
b.生成器(generator):就是一個能返回迭代器的函數,其實就是定義一個迭代算法,可以理解爲一個特殊的迭代器。
生成器:
通過列表生成式,我們可以直接創建一個列表,但是,受到內存限制,列表容量肯定是有限的,如果我們僅僅需要訪問前面幾個元素,如果列表元素可以按照某種算法推算出來,那我們是否可以在循環的過程中不斷推算出後續的元素呢?這樣就不必創建完整的list,從而節省大量的空間。在Python中,這種一邊循環一邊計算的機制,稱爲生成器(Generator)
#要創建一個generator,有很多種方法。第一種方法很簡單,只要把一個列表生成式的[]改成(),就創建了一個generator
>>> g = (x for x in range(1, 101))
>>> g
<generator object <genexpr> at 0x10124df68>
>>> g.__next__()
1
>>> [x for x in g]
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100]
注意:使用Iterator判斷的時候需要導入Iterable的包
from collections import Iterable
print(isinstance([],Iterable))
print(isinstance((),Iterable))
print(isinstance({},Iterable))
print(isinstance("",Iterable))
print(isinstance((x for x in range(10)),Iterable))
print(isinstance(1,Iterable))
#結果
True
True
True
True
True
False
5.2 迭代器
迭代器:不但可以作用於for循環,還可以被next()函數不斷調用並返回下一個值,直到最後出現StopIteration錯誤,表示無法返回下一個值
可以被next()函數調用並不斷返回下一個值得對象成爲迭代器(Iterator對象)
可以使用isinstance()函數判斷一個對象是否是Iterator對象
print(isinstance([],Iterator))
print(isinstance((),Iterator))
print(isinstance({},Iterator))
print(isinstance("",Iterator))
# 只有這個是迭代器
print(isinstance((x for x in range(10)),Iterator))
#結果
False
False
False
False
True
5.3 Iterator轉換
可以通過Iter()函數將list、tuple、dict、string轉換爲Iterator對象
>>> a = iter([1, 2, 3, 4, 5])
>>> print(next(a))
1
print(isinstance(iter([]), Iterator))
print(isinstance(iter(()), Iterator))
print(isinstance(iter({}), Iterator))
print(isinstance(iter(''), Iterator))
#結果
True
True
True
True
六、練習
2.輸入一個時間,獲取這個時間的下一秒
3.歌詞解析器