一、字符串
是一組由字符組成的序列,每一個字符都是字符串中的一個元素。
注意:不存在字符str,最小單位為字符串
字符串是不可修改類型(基本數據類型)
1. 字符串的創建-----單引號、雙引號、三引號
- 單引號和雙引號交替使用可以到輸出雙引號的和單引號的作用
- 三引號----自帶換行
- 續行符"\"可以換行
- 空字符串 strnull = '
2. 字符轉義----(可以轉義的字符由' " \)
在需要轉義的字符前面添加"\",對特殊字符進行轉義
# 換行\n, \t, \r----換行,制表符,回車
b = 'nnnnn\n'
3. 字符串的操作(運算符、索引、切片)
(1) 運算符 ---- + * in is < >
+ |
合並的字符串(新創建字符串) |
print('a'+'b')
* |
重復 |
in/not in |
值判斷 |
print('a' in 'asdasda')
is/is not |
對象判斷 |
eg:
a = 'asd'
b = 'asd'
print(a is b)
< > <= >= |
比較運算 |
print('a' < 'b') # 比較ASCII碼
*****
print('absdc' < 'abd') # 按照元素順序,依次比較
(2) 索引----獲取單個元素
格式: 變量名[index]
- index的第一個元素是0,最后一個元素是-1
- index 為正數從左往右,負數從右往左
- index范圍(-len(), len()-1)
- 字符串長度可以通過len()獲得
(3) 切片----獲得字符串中的多個元素
格式: 變量名[start:end:step],三個參數都可以省略
注意start方向問題
注意start對應字符輸出、end對應字符不輸出
[:] |
提取從開頭(默認位置0)到結尾(默認位置-1)的整個字符串 |
[start:] |
從start 提取到結尾 |
[:end] |
從開頭提取到end - 1 |
[start:end] |
從start 提取到end - 1 |
[start:end:step] |
從start 提取到end - 1,每step 個字符提取一個左側第一個字符的位置/偏移量為0,右側最后一個字符的位置/偏移量為-1 |
Example:
a[:] # 整切片
a[0:]
a[-4:] # 切片索引可以越界
a[:4]
a[-5:-1]
a[-1:-5:-1]
a[::-1] # 顛倒
局部切片新創建對象,整體切片不新建對象
print(a is a[:]) ------ True
print(id(a), id(a[:]), id(a[1:4]) )
Practice:
使用切片工具,截取data中的年月日,data = '2018-06-28'
4. 字符串的相關方法
定義的字符串,相當於創建的一個str對象
s = 'fssdfgsdfg'
print(tpye(s))
-
count()統計一個字符在字符串中的數量
x 待統計自字符串
start 起始位置
end 結束為止默認從頭到尾
# 幾乎在所有包含start和end的地方都是包含start,不包含end
-
index() 返回查找字串的位置,默認輸出第一次子串出現為止
當查不到查找字串時報錯
index(sub, start, end)
sub 為查找字串
- find() 如果找不到,返回 -1
-
join() 將序列中的每一個元素,使用字符串拼接起來
# 填充元素在前,被填充序列在括號中
s = '123'
b = '-'
print(b.join(s))
-
replace(old, new, count)
old 待替換字符串
new 要替換的字符串
count 不寫全部替換,指定后從左往右替換,可以超出實際次數
# replace不修改原數據,而是新創建字符串存儲
-
strip(chr) 剪切,按照傳入的參數,去掉兩端的對應字符串
chr 默認空格
剪切時按照剪切字符的所有單子符,從兩端一直剪切到不存在符合字符為止
s = ' adasdferasda '
print(s.strip('ad'))
# 左剪切 lstrip()
# 右剪切 rstrip()
-
split(sep, max) 切割:被切割的字符會去掉
sep 切割字符
max 最大切割次數
# 默認按照空格切割,返回值為列表類型
s = ' adasdferasda '
print(s.split('er'))
對字符串的所有操作都不會原地去做(修改字符串),而是新建。
- upper() / lower() 變成大寫或小寫
- capitalize() 首字母大寫
-
isnumeric() 判斷字符串是否完全是數字[漢字數字返回True]
- 數字包括羅馬數字、中文數字、Unicode數字、byte數字(單字節)、全角數字(雙字節)
isdigit() 判斷字符串是否完全是數字[漢字數字返回Flase]
isdecimal()
- isalpha() 判斷是否完全都是字符[中文/英文]
- isidentifier() 判斷字符串是否是合法標識符[變量名[字符、數字、下划線]、]
-
isupper() 判斷是字符串內字母否完全是大寫
islower() 判斷是字符串內字母否完全是小寫
isspace() 判斷是否完全是空格
-
center(width, fillchar) 向兩端填充字符,先左后右
width 填充完畢后的寬度
fillchar 填充字符
二、字節
字節是一系列單字節的組合,每一個字節都是[0, 255](無符號)范圍內組成。
單字節:一個字節8個數據位
字節也不支持修改(類似字符串、簡單變量)
1. 字節的創建
b = b'abc'
c = b'打' --------- 漢字報錯,因為漢字不能以字節形式報錯
8個數據位,最多存儲256不同內容
2. 字節的操作 運算符、索引、切片
(1) 運算符 + - * / is in >
eg:
print(b'abc' in b'abcsd')
print(b'abc' >= b'abcsd')
(2) 索引 索引顯示ASCII碼
eg:
print(b'b')
(3) 切片 切片顯示字節
三、格式化 format:
方便打印輸出的時候顯示
# 將數字格式化成字符串
方法1: %
s% == str()
print('jj %s' % 1)
print('jj %s %s' % (1, 3))
方法2:format
print("'jj', 'java', {}, {}".format(1,2,4))
# 1.輸出如下內容:分別使用雙引號,和三引號
# A:are you "tom"
# B:no
a = ''''
A:are you "tom"
B:no
'''
b = "A:are you \"tom\"\n" \
"B:no"
print(a , b)
print('第二題=========================\n')
# 2.定義兩個字符串,a="hello" b="hello",令c=a,
# 思考:是否能對a中的h進行修改
# 輸出abc三個變量的值
# 使用is和==判斷abc之間的關系,並畫出內存圖
m = 'hello'
n = 'hello'
t = m
idx = m.index('h')
chang = input('To change \'h\' as what:\n')
m_new = chang + m[idx:]
print('m修改后的結果是:',m_new)
############################
# def namestr(obj, namespace = globals()):
# return [name for name in namespace if namespace[name] is obj]
# import inspect
# import re
#
# def get_variable_name(variable):
# loc = locals()#把locals()方法移到函數內
# for key in loc:
# if loc[key] == variable:
# return loc
###############################
def judge(a, b):
if a is b:
return '{}和{}同一對象'.format(a, b)
elif a == b:
return '{}和{}是同一值'.format(a, b)
else:
return '{}和{}沒半毛錢關系'.format(a, b)
print(judge(m, n))
print(judge(m, t))
print(judge(n, t))
print(judge(m_new, t))
print('第三題=========================\n')
# 3.分別輸入3個愛好,打印出來"我的愛好是**、**、**" ,
# 使用格式化輸出
hobby1 = 'hiking'
hobby2 = 'biking'
hobby3 = 'computer'
print('Method1:\n My hobby is {}, {} and {}'\
.format(hobby1, hobby2, hobby3))
print('Method2:\n My hobby is %s %s and %s' % (hobby1, hobby2, hobby3))
print('第四題=========================\n')
# 4.這是一個地址,http://news.gzcc.cn/html/2017/xiaoyuanxinwen_1027/8443.html
# 其中1027/8443是新聞編號,想辦法獲得新聞編號。至少兩種方法。
website = 'http://news.gzcc.cn/html/2017/xiaoyuanxinwen_1027/8443.html'
# 第一種方案:split
cut1 = website.split('_')
cut1 = cut1[1].split('.')
print('采用split方法:', cut1[0])
# 第二種方案,切片(已知數字位數)
cut_back = website[-13: -5]
print('倒數位置固定的話,采用位數:', cut1[0])
# 第三種方案,切片(倒數第一個反斜杠)
lens = len(website)
website_back = website[::-1]
slash = website_back.index('/')
result = website_back[slash-4 : slash+4]
result = result[::-1]
print('采用尋找倒數第一個'/'方法:', cut1[0])
print('第五題=========================\n')
# 5.做如下練習:
# # 1.輸入一種水果,如葡萄
# # 2.打印類似"吃葡萄不吐葡萄皮,不吃葡萄倒吐葡萄皮"的效果
# # 3.使用切片,切出自己輸入的水果
# # 4.使用strip,剪切到自己輸入的水果
# # 5.統計打印的的文本中,水果出現的次數
fruit = input('>>>>>>step1\nPlease input a fruit name\n')
# 替換
lyric = '吃葡萄不吐葡萄皮,不吃葡萄倒吐葡萄皮'
lyric_new = lyric.replace('葡萄', fruit)
print('>>>>>>step2\nreplace方案:'+ lyric_new)
# 格式化輸出
print('>>>>>>step2\nformat方案:'+'吃{}不吐{}皮,不吃{}倒吐{}皮'.format(fruit, fruit, fruit, fruit))
# step3,切出水果
# 模擬索引index()函數,尋找第一個相符點
def my_index(lyric_new, fruit):
index_list = []
count= 0
# 遍歷句子,判斷和水果名的比較
for stri in range(len(lyric_new)-len(fruit)+1):
for dexi in range(0, len(fruit)):
# print(stri, lyric_new[stri + dexi], fruit[dexi],lyric_new[stri + dexi] == fruit[dexi])
if lyric_new[stri + dexi] == fruit[dexi]:
count += 1
index_list.append(stri)
# 計算出現次數
# print(count, len(fruit))
count_total = count // len(fruit)
# 修改出現位置列表
index_list = index_list[::len(fruit)]
# 切片獲得隨機一個fruit
import random
dex_redom = random.randint(0, len(index_list)-1)
fruit_cut = lyric_new[index_list[dex_redom]:index_list[dex_redom] + len(fruit)]
print('>>>>>>step3\n使用切片法獲得的第{}個fruit為:{}'.format(dex_redom,fruit_cut))
# 使用strip獲得fruit名稱
lyric_new_split = lyric_new.split('不吐', 1)
lyric_new_split = lyric_new_split[0].strip('吃')
print('>>>>>>step4\n采用split方法獲得的fruit名稱:' + lyric_new_split)
#輸出
print('>>>>>>step5\n在第{} / {} / {} / {}位置出現fruit'.format(index_list[0],\
index_list[1], index_list[2], index_list[3]))
print('出現次數: {}'.format(len(index_list)))
return index_list, count_total, fruit_cut
(my_index(lyric_new, fruit))
# print('尋找+切片,得出結果:'+my_index(lyric_new, fruit)[1])