一、基础认识
- 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) … -1
s1='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