"""
第四章 數(shù)據(jù)類型 (字符串相满、字節(jié))str
"""
"""
字符串:就是由字符組成的序列层亿,字符串中的每一個(gè)元素還是字符串。
特性:字符串是不可變的序列類型立美。字符串的元素是有序的匿又。
"""
# 一、字符串的創(chuàng)建
# 三種方式
"""
單引號(hào)
雙引號(hào)
三引號(hào)
"""
# 使用單引號(hào)和雙引號(hào)創(chuàng)建字符串建蹄,使用方式幾乎一致
# 單引號(hào)和雙引號(hào)交替使用可以達(dá)到輸出對(duì)方的效果
s="helloworld"
s="i am 'ok'"
print(s)
s2='i am "ok"'
print(s2)
# 單引號(hào)和雙引號(hào)定義字符串碌更,一般都在一行定義 ,否則需要續(xù)行符(\)
a="引號(hào)和雙引號(hào)定義字符串洞慎,一般都在引號(hào)和雙引號(hào)定義字符串痛单, "\
"一般都在引號(hào)和雙引號(hào)定義字符串,一般都在引號(hào)和雙引號(hào)定義字符串劲腿,一般都在"
print(a)
b="天行健旭绒,君子以自強(qiáng)不息。\n地勢坤焦人,君子以厚德載物"
print(b)
#三引號(hào)定義字符串挥吵,自帶換行,但是三引號(hào)不是注釋花椭。
c="""
天行健忽匈,君子以自強(qiáng)不息。
地勢坤个从,君子以厚德載物
"""
print(c)
# 練習(xí):輸出一首詩脉幢,使用雙引號(hào)和三引號(hào)分別輸出歪沃。
# 定義空字符串嗦锐,不是None
str_null=""
print(type(str_null))
print(type(None))
# 二、字符串的轉(zhuǎn)義序列(將特殊的字符轉(zhuǎn)義)
s="i am 'ok'"
# 雙引號(hào)沪曙,單引號(hào)的轉(zhuǎn)義使用\,放到要轉(zhuǎn)義字符的前面
s="i am \"ok\""
print(s)
# \n 換行
# \r 回車
# \n\r
# window下:
# \r奕污,要回到當(dāng)前行的行首,不會(huì)換到下一行液走,如果直接輸出碳默,會(huì)將之前的內(nèi)容覆蓋。
print("aaaa\rbbbbb")
print("aaaa\n\rbbbbb")
#\n 缘眶,代表換行嘱根,換到當(dāng)前位置的下一行(常用)
print("aaa\nbbbb")
# r:在字符串定義的前面加r,能夠讓字符串原樣輸出
print(r"aaa\bbbbbb")
# 三巷懈、字符串的操作
"""
1. 運(yùn)算符
2. 索引
3. 切片
"""
# 1. 運(yùn)算符? +? *?? in? not in??? is? is not?? ==? >? < !=
# + 合并? 新創(chuàng)建字符串進(jìn)行合并
a="abc"
b="bcd"
print(a,b,a+b,a,b)
# * 重復(fù)该抒,返回的是新字符串
print(a*3,a)
print(a*3+b*2)
#in? not in 成員運(yùn)算符
print("ab"? in a)
print("ac"? in a)
# is? is not 身份運(yùn)算符
a="abc"
b="abc"
c=b
print(a is b)
print(c is a)
print(a ==b )
print(a ==c )
# 按元素進(jìn)行比較,按照元素的ascii碼進(jìn)行比較
# 逐個(gè)比較
print("abc"<"abcd")
print(ord("a"))
print(ord("b"))
# 2. 索引
# 獲取字符串中的單個(gè)字符串顶燕,需要使用索引
# 格式:字符串名[index]: index 可以是正數(shù)凑保、負(fù)數(shù)冈爹、0
# 第一個(gè)元素:索引從0開始
# 正數(shù):從左到右
# 負(fù)數(shù):從右到左,最后一個(gè)元素是-1
# 索引是不能越界欧引,越界會(huì)報(bào)異常频伤。
s="abcdefg"
print(s[0])
print(s[3])
print(s[-3])
# print(s[100])
# len(o):獲取字符串的長度
print(len(s))
# 索引范圍: [-len(s)---len(s)-1]
# 最后一個(gè)元素:s[len(s)-1]?? s[-1]
# 字符串中的元素不能修改
# s[2]="6"
# 3. 切片:獲得字符串中的多個(gè)元素(按照某一個(gè)規(guī)則獲得指定區(qū)域的元素)
# 格式:字符串名[start:end]
# 切片包含start,但是不包含end芝此,到end-1
# start 和end都可以取正數(shù)憋肖、負(fù)數(shù)、0
# 區(qū)別在于方向
# start:省略癌蓖,默認(rèn)是0
# end:省略瞬哼,默認(rèn)的len(s),千萬注意,不是-1
s="abcdefg"
print(s[0:3])? # end-start=截取的長度
# print(s[0:1],s[1:3])
print(s[-1:-3],"dddd")
print(s[-3:-1],"ccc")
print(s[:3],s[0:3])
print(s[1:],s[0:len(s)])
# print(s[1:],s[0:-1])
# 切片是新創(chuàng)建字符串(非整切片)
# 字符串的整切片指向的就是字符串本身的對(duì)象租副,不是新創(chuàng)建對(duì)象
s1=s[1:3]
print(s1,id(s1))
s2=s[:]
print(id(s[:]),id(s),id(s2))
#練習(xí):使用字符串的切片 對(duì)日期進(jìn)行獲取? 2018-08-20
d="2018-08-20"
year=d[:4]
print(year)
month=d[5:7]
print(month)
day=d[8:]
day=d[-2:]
print(day)
#4. 字符串的相關(guān)方法
st="abcdabcd"
# (1)count(str,start,end)統(tǒng)計(jì) 返回參數(shù)字符串在原串中出現(xiàn)的次數(shù)
# 當(dāng)不寫start和end參數(shù)時(shí)坐慰,默認(rèn)統(tǒng)計(jì)的是按原字符串統(tǒng)計(jì)
print(st.count("a"))
# start=1 end=5? 范圍從1---4
print(st.count("a",1,5))
# 如果只傳遞一個(gè)參數(shù) 那么認(rèn)為是start,結(jié)束默認(rèn)為len(st)? 范圍是從1--len(st)
print(st.count("a",1))
# 跟切片一樣用僧,當(dāng)索引(下標(biāo))超過范圍時(shí)结胀,不會(huì)報(bào)錯(cuò)。
print(st.count("a",20,50))
# (2) index 查找责循,如果查找到則返回原中的位置糟港,如果找不到會(huì)報(bào)錯(cuò)
# 默認(rèn)從左到右查找,查找第一次出現(xiàn)的位置
st="abcdabcd"
print(st.index("b"))
# print(st.index("b",2,5))
print(st.index("b",2))
# (3)find 查找院仿,返回查找內(nèi)容再原串中的位置秸抚,如果找不到不報(bào)錯(cuò),會(huì)返回-1
st="abcdabcd"
print(st.find("b"))
print(st.find("b",2,5))
# 如果查找的是子串歹垫,會(huì)返回子串中第一個(gè)字符出現(xiàn)的位置
st="abcdabcd"
print(st.find("bc"))
print(st.find("bd"))
# (4) join:拼接字符串:將序列中的各個(gè)元素按照字符串連接剥汤。
st="abcd"
a="-"
print(a.join(st))
# (5)replace: 替換:會(huì)新創(chuàng)建字符串進(jìn)行存儲(chǔ),替換結(jié)果是replace的返回值
# old:需要替換的內(nèi)容
# new:替換成的內(nèi)容
# count:替換的最大次數(shù)排惨,如果不寫吭敢,會(huì)將字符中符合的字符全部替換
# 會(huì)從左到右的順序,按照替換的次數(shù)進(jìn)行替換
st="abcdabcd"
print(st.replace("a","-",1))
print(st.replace("a","-",4),st)
#(6)strip 剪切暮芭,從兩端去掉指定的符號(hào)
st=" abcd? "
# strip參數(shù)不寫鹿驼,則默認(rèn)去掉空格
print(st.strip())
# 去掉兩端符合條件的字符串(按挨個(gè)檢索),一直去掉到不符合條件的位置辕宏。
st="aafbbcdeeafaf"
print(st.strip("a"))
print(st.strip("af"))
# 從左邊剪切
print(st.lstrip("af"))
# 從右側(cè)剪切
print(st.rstrip("af"))
#(7)split 切割:切割完的字符就沒有了畜晰。
# 按照切割的參數(shù),一分為二
# 返回值是列表
st="ab cd ef? gh d"
print(st.split(" "))
#如果split中不寫參數(shù)瑞筐,默認(rèn)按照空格切割凄鼻,會(huì)將所有的空格都切割掉。
print(st.split())
st="abababaabbaabb"
print(st.split("a"))
#(8)upper? lower
print("abcd".upper())
print("ABCDdd".lower())
# (9)isnumeric: 判斷是不是數(shù)值類型
print("8".isnumeric())
print("a".isnumeric())
#(10)isalpha: 判斷是不是字符
print("8".isalpha())
print("a".isalpha())
#(11)center(width,char)
#width:占位
#char: 填充的字符
s="hello world"
# 當(dāng)字符串長度是奇數(shù),填充會(huì)從右側(cè)開始
# 當(dāng)字符串長度是偶數(shù)野宜,填充會(huì)從左側(cè)開始
print(s.center(13,"*"))
s="hell"
print(s.center(5,"*"))
"""
字節(jié) (序列)bytes
字節(jié):由一些列的單字節(jié)組成
單字節(jié):占用8個(gè)數(shù)據(jù)位: 數(shù)字 特殊的符號(hào)? 英文字母等扫步。。匈子。不能存儲(chǔ)漢字
"""
# 00000000
# 00000001
# 11111111
# 最多存儲(chǔ)255種不同內(nèi)容
# 一河胎、字節(jié)創(chuàng)建
s="hello"
print(type(s))
# 定義字節(jié)跟字符串類似,但是需要在定義的單引號(hào)或者雙引號(hào)前面加b
b=b"hello"
print(type(b))
# b=b"中國"
# 二虎敦、字節(jié)的操作:參看字符串
# 運(yùn)算符游岳、索引、切片
print(b"abc"+b"bcd")
print(b"abc"
# is ==
b=b"hello"
b1=b"hello"
b2=b1
print(b == b1)
print(b is b1)
print(b2 is b1)
print(id(b),id(b1),id(b2))
# 索引輸出的是ascii
print(b[0])
# 切片不是ascii碼
print(b[0:2])
# 相關(guān)方法
b=b"hello"
print(b.count(b"h"))
print(b.split(b"e"))
"""
格式化
"""
print("hello"+" world")
print("hello"+ str(8))
name="tom"
score=90
# print(name+"的成績是"+score)
# 三種:
"""
1. %
2. format
3. 3.6之后可以是用f
"""
# 1. %
# %s === str()
# %s代表一個(gè)變量占位其徙,后面如果有多個(gè)變量胚迫,是依次填入
name="tom"
score=90
print("%s的成績是%s" % (name,score))
print("成績是%s" % score)
#2.format
#{} 代表一個(gè)變量占位,后面有多個(gè)變量依次填入
s="{}的成績是{}"
s="{0}的成績是{1}"
print(s.format(name,score))
s="{1}的成績是{0}"
print(s.format(score,name))
#3.f
name="tom"
score=90
print(f"{name}的成績是{score}")
print("i am 'ok'? and 'addf'")
print(len(""))
print(bool("111"))
print("akdfjalj\\djdlkjf")