一、基础认识
-
python变量分为可变性和不可变性两种:
- 数字numbers、字符串string、布尔bool和元组tuple是不可变性
- 列表list、集合set、字典dict是可变性变量
-
string为不可变性,即当s1内容改变时,地址改变
不可变:即内存中某个地址的内容不可以改变,如string
可变:即内存中某个地址的内容可以改变s='python' s[0]='P' #error s1 = 'python' print(id(s1)) # 2648942513544 s1 = s1 + 's' print(id(s1)) # 2648942512032
-
同时字符串是一个松散的集合
s='python' for c in s: print(c)
二、引号
-
单引号和双引号等价,可以嵌套使用
print('tom say:\"how are you\"') # tom say:"how are you" print('tom say:"how are you"') # tom say:"how are you" a="hello world" b='hello world" print('a:%s'%a) # a:hello world print('b:%s'%b) # b:hello world
-
三引号
三引号包含多行字符串常量,所有行和合并在一起,并在每行末尾增加一个换行符。
1. 文档说明:开头第一个三引号
2. 注释:''' 这是注释 '''
-
换行:
name=''' 这是 换行 格式控制 ''' print(name)
-
三、转义字符
-
\(不在行尾时)为转义字符
-
\(在行尾时) 续行符
a=12 b=12 c=10 d=a+\ b+\ c print(d)
-
\ 反斜杠符号
四、raw 字符串
字符串前面加 r ,把它叫做raw字符串,为原始字符串
filename='c:\python\unit1'
print(filename)
#出错,把\认为是转义字符
#处理方式
#1.前面加r,表示原始字符串,不处理反斜杠\
filename=r'c:\python\unit1'
print(filename)
#2.用正斜杠/
filename='c:/python/unit1'
print(filename)
#3.两个反斜杠进行转义\\
filename='c:\\python\\unit1'
print(filename)
五、Python字符串切片
-
切片:是指对操作的对象截取其中一部分的操作。字符串、列表、元组都支持切片操作
-
切片语法:字符串[起始下标:结束下标:步长] ps: [起始下标,结束下标)
索引(正): 0 1 2 … len-1
索引(负):-len -(len-1) -(len-2) … -1s1='python' print(s1[-6:]) # python print(s1[-6:-2]) # pyth print(s1[0]) # p print(s1[0:3]) # pyt print(s1[0:5:2]) # pto print(s1[1:-1]) # 下标为1到倒数第2个 print(s1[::-1]) # 步长为负,则为倒序
-
加号(+)是字符串连接运算符,星号(*)是重复操作
s1='python' print(s*2) # pythonpython
-
两种遍历方式
for i in range(len(s1)): # range(6) [0,1,2,3,4,5] print(s1[i]) for c in s1: print(c)
六、切片高级
-
切片举例
s1='python' #从1开始到结束 print(s1[1:]) #从开始到第五个元素 print(s1[:5]) #从开始到结束的第奇数个元素 print(s1[::2]) #字符串反转 print(s1[::-1]) #反向切片 print(s1[5:3:-1]) # no print(s1[-1:-3:-1]) # no
-
demo-获取文件类型
filename=r'c:\python\map.jpg' file_type=filename[-1:-4:-1] print(file_type[::-1]) file_type=filename[-1:-4:-1][::-1] print(file_type)
-
拷贝
import copy s1='python web' s2=s1 # 不属于拷贝,直接地址传值 s3=s1[:] # 不属于拷贝,切片后发现与s1相等,直接地址传值 s4=copy.copy(s1) # 不属于拷贝 s5=copy.deepcopy(s1) # 不属于拷贝 print(id(s1)) # 1791310373168 print(id(s2)) # 1791310373168 print(id(s3)) # 1791310373168 print(id(s4)) # 1791310373168 print(id(s5)) # 1791310373168
上述id均相等,即python字符串本质上没有拷贝
在cmd中上述情况地址也均相同,因为赋值时都先找的s1,内容相同,直接地址传值
数组时,情况则不同 -
字符串也是对象
print(dir('python')) s1='python web' print(len(s1)) print(s1.__len__()) #ctrl+shift+i 查看__len__函数详细说明
七、内建函数(string方法)
-
count():返回 str在start和end之间 在 mystr里面出现的次数
# 父字符串.count(子字符串,start,end) mystr='hello world hello china' ct=mystr.count('o w',0,8) print(ct)
-
find():str 是否包含在 mystr中,如果是返回开始的索引值,否则返回-1
# 父字符串.find(子字符串,start,end) mystr='hello world hello china' index=mystr.find('world') print(index)
-
index():检测字符串是否包含在另一个字符串中,是 为索引值,否 报异常
# 父字符串.index(子字符串,start,end) print("I am a cool girl".index("cool")) #demo--统计字符串中字符出现的频率 mystr='hello world hello china' chars=[] for i in mystr.replace(' ',''): if i not in chars: chars.append(i) for j in chars: print(j,'次数为:',mystr.count(j))
-
replace:把父字符串中的子串1替换成子串2,替换不超过count次
# 父字符串.replace(子串1,子串2,count) mystr='hello world hello china' res=mystr.replace('h','H') print(res)
-
split():截断
d='1998/7/18' res=d.split('/') age=2019-int(res[0]) print(age) dt='1998/7/18 12:30:20' m=dt.split(' ')[1].split(':')[1] print(m) #将a,b,c,d,e转换成e-d-c-b-a s='a,b,c,d,e' res=s.replace(',','-')[::-1] print(res) 如果字符串中有多个分隔符,就需要用正则表达式(后面章节)
-
join()
arr=[1,2,3,4] arr="1234" a="b" res=a.join(arr) print(res) # 1b2b3b4
-
isdigit():如果 mystr 只包含数字则返回 True 否则返回 False.
print("1248".isdigit() ) # True print("12.3545".isdigit()) # False print("12afsda5".isdigit()) #False
-
isalpha()
如果 mystr 所有字符都是字母 则返回 True,否则返回 False print("jsavufa".isalpha()) # True print("jsa.vufa".isalpha()) # False print("jsa2174fa".isalpha()) # False
-
isalnum:如果 mystr 所有字符都是字母或数字则返回 True,否则返回 False
print("fedfoi675467".isalnum()) # True print("fedfoi...??kus".isalnum()) # False
-
upper() lower()
check='afdEf' user=input('请输入验证码') if user and user.isalpha(): if user.lower()==check.lower(): print('pass') print(check.upper()) # 大写 print(check.lower()) # 小写
-
strip() lstrip() rstrip()
str = ' abc python abc ' print(str,'测试') print(str.strip(),'测试') # 删除开头和结尾空格 print(str.lstrip(),'测试') # 删除开头空格 print(str.rstrip(),'测试') # 删除结尾空格
-
补充
方法 | 描述 |
---|---|
string.capitalize() | 把字符串的第一个字符大写 |
string.center(width) | 返回一个原字符串居中,并使用空格填充至长度 width 的新字符串 |
string.count(str, beg=0, end=len(string)) | 返回 str 在 string 里面出现的次数,如果 beg 或者 end 指定则返回指定范围内 str 出现的次数 |
string.decode(encoding=‘UTF-8’, errors=‘strict’) | 以 encoding 指定的编码格式解码 string,如果出错默认报一个 ValueError 的 异 常 , 除非 errors 指 定 的 是 ‘ignore’ 或 者’replace’string.encode(encoding=‘UTF-8’, errors=‘strict’)以 encoding 指定的编码格式编码 string,如果出错默认报一个ValueError 的异常,除非 errors 指定的是’ignore’或者’replace’ |
string.endswith(obj, beg=0, end=len(string)) | 检查字符串是否以 obj 结束,如果beg 或者 end 指定则检查指定的范围内是否以 obj 结束,如果是,返回 True,否则返回 False. |
string.expandtabs(tabsize=8) | 把字符串 string 中的 tab 符号转为空格,tab 符号默认的空格数是 8。 |
string.find(str, beg=0, end=len(string)) | 检测 str 是否包含在 string 中,如果 beg 和 end 指定范围,则检查是否包含在指定范围内,如果是返回开始的索引值,否则返回-1 |
string.format() | 格式化字符串string.index(str,beg=0,end=len(string)) |
string.isalnum() | 如果 string 至少有一个字符并且所有字符都是字母或数字则返回 True,否则返回 False |
string.isalpha() | 如果 string 至少有一个字符并且所有字符都是字母则返回 True,否则返回 False |
string.isdigit() | 如果 string 只包含数字则返回 True 否则返回 False. |
string.islower() | 如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是小写,则返回 True,否则返回 False |
string.isnumeric() | 如果 string 中只包含数字字符,则返回 True,否则返回 False |
string.isspace() | 如果 string 中只包含空格,则返回 True,否则返回 False. |
string.istitle() | 如果 string 是标题化的(见 title())则返回 True,否则返回 False |
string.isupper() | 如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是大写,则返回 True,否则返回 False |
string.join(seq) | 以 string 作为分隔符,将 seq 中所有的元素(的字符串表示)合并为一个新的字符串 |
string.ljust(width) | 返回一个原字符串左对齐,并使用空格填充至长度 width 的新字符串 |
string.lower() | 转换 string 中所有大写字符为小写.、 |
string.lstrip() | 截掉 string 左边的空格 |
max(str) | 返回字符串 str 中最大的字母。 |
min(str) | 返回字符串 str 中最小的字母。 |
string.partition(str) | 有点像 find()和 split()的结合体,从 str 出现的第一个位置起,把 字 符 串 string 分 成 一 个 3 元 素 的 元 组 (string_pre_str,str,string_post_str),如果 string 中不包含str 则 string_pre_str == string. |
string.replace(str1, str2, num=string.count(str1)) | 把 string 中的 str1 替换成 str2,如果 num 指定,则替换不超过 num 次. |
string.rfind(str, beg=0,end=len(string) ) | 类似于 find()函数,不过是从右边开始查找. |
string.rindex( str, beg=0,end=len(string)) | 类似于 index(),不过是从右边开始. |
string.rjust(width) | 返回一个原字符串右对齐,并使用空格填充至长度 width 的新字符串 |
string.rpartition(str) | 类似于 partition()函数,不过是从右边开始查找. |
string.rstrip() | 删除 string 字符串末尾的空格. |
string.split(str="", num=string.count(str)) | 以 str 为分隔符切片 string,如果 num有指定值,则仅分隔 num 个子字符串 |
string.splitlines([keepends]) | 按照行(’\r’, ‘\r\n’, \n’)分隔,返回一个包含各行作为元素的列表,如果参数 keepends 为 False,不包含换行符,如果为 True,则保留换行符。 |
string.startswith(obj, beg=0,end=len(string)) | 检查字符串是否是以 obj 开头,是则返回 True,否则返回 False。如果beg 和 end 指定值,则在指定范围内检查. |
string.strip([obj]) | 在 string 上执行 lstrip()和 rstrip() |
string.swapcase() | 翻转 string 中的大小写 |
string.title() | 返回"标题化"的 string,就是说所有单词都是以大写开始,其余字母均为小写(见 istitle()) |
string.upper() | 转换 string 中的小写字母为大写 |
string.zfill(width) | 返回长度为 width 的字符串,原字符串 string 右对齐,前面填充0 |
string.isdecimal() | isdecimal()方法检查字符串是否只包含十进制字符。这种方法只存在于unicode对象。 |
-
demo–password
# A 65 Z 90 c='Eas' if 'A'<=c<='Z': print('pass') pwd='Lajffio' if pwd.strip() and 'A'<=pwd[0]<='Z' and len(pwd)>=6 and pwd.isalnum(): print('pass') #加上pwd.strip(),防止出现 #print(ord('A'))#输出ascII
八、字符串输出
语法说明:
-
格式化符号说明备注 %s 字符串输出 string
-
%10s 右对齐,占位符 10位
-
%-10s 左对齐,占位符 10 位
-
%.2s 截取 2 位字符串
-
%10.2s10 位占位符,截取两位字符串。
print('%s' % 'hello world') # 字符串输出hello world print('%20s' % 'hello world') # 右对齐,取20位,不够则补位 hello world print('%-20s' % 'hello world') # 左对齐,取20位,不够则补位hello world print('%.2s' % 'hello world') # 取2位he print('%10.2s' % 'hello world') # 右对齐,取2位 he print('%-10.2s' % 'hello world') # 左对齐,取2位he