字符串的基本特点
字符串属于内置类型 字符串可以理解为字符的串
python不支持单字符类型,单字符也可以作为一个字符串使用
python中字符串是不可变的,复制创造了个新的“看起来像是修改”
字符串的编码
Python3直接支持Unicode,可以表示世界上任何书面语言的字符。Python3的字符默认就是16位Unicode编码,ASCII码是Unicode编码的子集。
- ord()可把字符转化为对应的Unicode码
- cha()可把10进制数字转换为对应的字符
print(ord("A"))
print(ord("K"))
print(chr(24935))
print(ord("嘉"))
# 65
# 75
# 慧
# 22025
引号创建字符串
a = "I'm a student"
print(a) # I'm a student
b = 'my_name is "Tom"'
print(b) # my_name is "Tom"
s = '''
I
Love
Python
'''
print(s) # 还会保留原格式
# I
# Love
# Python
# 上图中的b 如果想要my_name is 'Tom' 但是外面的符号会与内部产生冲突
# b = 'my_name is 'Tom''
# print(b)
#这种情况就会报错因为把第一个单引号当做起点下一个单引号就当做了终点使得Tom被单拎出来了
c = 'my_name is \'Tom\''
print(c)
# my_name is 'Tom'
# 使用这里的转义字符就会达到我们想要的结果
空字符串和len()函数
# python中允许定义空字符串,并且长度为0
c = ""
print(len(c))
# 0
a = "Kyle学python!"
print(len(a))
# 12
转义字符
\(在行尾时) | 续行符 |
\\ | 反斜杠符号 |
\' | 单引号 |
\" | 双引号 |
\b | 退格(Backspace) |
\n | 换行 |
\t | 横向制表符(应该相当于Tab键) |
\r | 回车 |
a = 'i\nlove\nu'
print(a)
# i
# love
# u
b = "ni\thao\tma"
print(b)
# ni hao ma
c = 'I\'m Tom'
print(c)
# I'm Tom
字符串拼接
+两边均字符串 | 拼接一起 |
+两边均是数字 | 进行加法运算 |
+两边类型不同 | 报错 |
a = 'aa'+'bb'
print(a)
# aabb
b = 13
c = '14'
# d1 = b+c # 会报错因为两边的类型不同
d2 = str(b)+c # 1314
d3 = b+int(c) # 27
字符串复制
a = "sxt"*3
print(a)
# sxtsxtsxt
不换行打印
print("hello",end="***")
print("world!")
# hello***world!
从控制台读取字符串
name = input("请输入名字:")
salary = input("请输入月薪:")
print("名字:"+name)
print("年薪:"+str(int(salary)*12))
# 请输入名字:Kyle
# 请输入月薪:30000 #前两行是你回答的结果
# 名字:Kyle
# 年薪:360000 #后两行是生成的结果 都在控制台处产生
这里要注意前面所说的字符串要和字符串才可以连接 如上式中年薪的生成
replace()实现字符串替换
a = "abcdefghijklmnopqrstuvwxyz"
print(id(a))
# a[3] = '弟'
# print(a) #这里报错了说明不支持修改
a = a.replace('d','弟')
print(id(a))
# a指向了新生成的对象,所以变了
print(a)
# 1804909025024
# 1804906304704
# abc弟efghijklmnopqrstuvwxyz
注:这里并不是对原来的字符串进行修改,而是新生成了一个对象,变量引用新对象
str()实现数字类型转化为字符串
a = str(1314)
b = str(5)
c = str(20)
print(a)
print(b)
print(c)
print(a + b + c)
# 1314
# 5
# 20
# 1314520
使用[]提取字符
正向搜索左边第一个的偏移量是0 第二个的偏移量是1 一直到len(str)-1为止
反向搜索右边第一个的偏移量是-1 第二个的偏移量是-2 一直到len(str)为止
a = "abcdefghijklmnopqrstuvwxyz"
print(a[0])
print(a[5])
# print(a[26]) #因为没有第26个偏移量 所以会报错
print(a[-1])
print(a[-5])
print(a[-26])
字符串切片slice操作(等同于后续序列切片)
[起始偏移量start:终止偏移量end:步长step] “包头不包尾”
print("abcdef"[2:4])
print("abcdef"[1:5:2])
print("abcdef"[::-1])
# cd
# bd
# fedcba
包头不包尾的解释就是如第一行式子c的偏移量是2;e的偏移量是4;但是最后的结果是cd没有取e
切片操作时,起始偏移量和终止偏移量不在[0,字符串长度-1]这个范围,也不会报错。起始偏移量小于0则会当做0,终止偏移量大于“长度-1”会被当成-1。
print("abcdefgh"[3:50])
# defgh
a = "abcdefghijklmnopqrstuvwxyz"
print(a[-10:-1])
print(a[1:10])
print(a[3:300])
print(a[3:])
print(a[:5])
print(a[::-1])
# qrstuvwxy
# bcdefghij
# defghijklmnopqrstuvwxyz
# defghijklmnopqrstuvwxyz
# abcde
# zyxwvutsrqponmlkjihgfedcba
split()分割和join()合并
a = "to be or not to be"
print(a.split()) #默认空白字符分割
print(a.split("be")) #be做分界
# ['to', 'be', 'or', 'not', 'to', 'be']
# ['to ', ' or not to ', '']
a = "I love u"
print(a.split())
print(a.split("v"))
# ['I', 'love', 'u']
# ['I lo', 'e u']
注意join()的使用是''.join()
a = ['sxt','sxt100','sxt200']
print('*'.join(a))
# sxt*sxt100*sxt200
c = ['aa','bb','cc']
d = ''.join(c)
e = '***'.join(c)
print(d)
print(e)
# aabbcc
# aa***bb***cc
join()的合并速度相对于加连接快 (在循环中显现的很明显)
import time
time1 = time.time()
a = ''
for i in range(1000000):
a += 'sxt'
time2 = time.time()
print("+连接的运算时间:"+str(time2-time1))
time3 = time.time()
li = []
for i in range(1000000):
li.append('sxt')
b = ''.join(li)
time4 = time.time()
print("join连接的时间:"+str(time4-time3))
# +连接的运算时间:315.3855969905853
# join连接的时间:0.04285097122192383
字符串驻留机制与比较
字符串驻留 常量字符串只保留一份(如下图 cd两个变量会引用一个对象)
c = 'dd#'
d = 'dd#'
print(c is d)
字符串比较和同一性
比较是 == !=
判断同一性 is not is
a = "aabbcc"
b = "aabbcc"
print(a is b)
print(a == b)
# True
# True
成员操作符判断子字符串
in not in 来判断子字符串是否位于字符串中
print("ab" in "abcdef")
# True
字符串常用方法
- 查找方法
- 去除首尾信息
- 大小写代换
- 格式排版
- 特征方法判断
常用查找方法
a = "如果这个宇宙的结局是注定的 是消亡 是归于死寂 那或许这更说明 只有过程才是最重要的 这是我们能够改变的唯一的事"
print(len(a)) # 用来测定字符串的长度
# 56
print(a.startswith("如")) # 字符串是否是以括号内的内容开头
# True
print(a.endswith("事")) # 字符串是否是以括号内的内容结尾
# True
print(a.find("改变")) # 括号中的内容第一次出现的字符串位置
# 49
print(a.rfind("最")) # 括号中的内容最后一次出现的字符串位置
# 38
print(a.count("是")) # 括号中的内容在字符串中出现了几次
# 5
print(a.isalnum()) # 括号中的内容是否全为字母和数字 al可以理解为alpha num就可以理解为数字
# False
去除首尾信息
a = "*k*e*y*"
print(a.strip("*")) # 去除字符串中首尾指定信息
print(a.lstrip("*")) # 去除字符串中左边指定信息
print(a.rstrip("*")) # 去除字符串中右边指定信息
# k*e*y
# k*e*y*
# *k*e*y
b = " k ey "
print(b.strip())
c = " love u "
print(c.strip())
# k ey
# love u
# bc都是去除首尾的空格但是两段字母中间的空格没有被去除
大小写转换
a = "Patience is key in life"
print(a.capitalize()) # 首字母大写其他均小写
print(a.title()) # 每个单词首字母大写
print(a.upper()) # 全部大写
print(a.lower()) # 全部小写
print(a.swapcase()) # 大写换小写 小写换大写
# Patience is key in life
# Patience Is Key In Life
# PATIENCE IS KEY IN LIFE
# patience is key in life
# pATIENCE IS KEY IN LIFE
格式排版
a = "Curry"
print(a.center(10,"*"))
print(a.ljust(10,"+"))
print(a.rjust(10,"-"))
# **Curry***
# Curry+++++
# -----Curry
特征方法判断
a = "I can do all things"
print(a.isalnum()) # 字符串是否由字母或数字组成
print(a.isalpha()) # 字符串是否由字母组成 注:这里的字母是Unicode码所以包括汉字
print(a.isdigit()) # 字符串是否由数字组成
print(a.isspace()) # 字符串是否是空白符
print(a.isupper()) # 字符串是否全都是大写
print(a.islower()) # 字符串是都全都是小写
# False
# False
# False
# False
# False
# False
字符串格式化
format()基本用法
a = "名字是:{0},年龄是:{1}"
b = a.format("Kyle",19)
print(b)
# 名字是:Kyle,年龄是:19
a = "名字是:{0},年龄是:{1},{0}是个好小伙"
b = a.format("Kyle",19)
print(b)
# 名字是:Kyle,年龄是:19,Kyle是个好小伙
c = "名字是:{name},年龄是:{age}"
d = c.format(age = 19,name = "Kyle")
print(d)
# 名字是:Kyle,年龄是:19
如上所示ab的用法传入是需要按顺序来进行传入
但是c的时候就可以根据名称来进行传入 不必考虑顺序
填充与对齐
- ^代表居中对齐 <代表左对齐 >代表右对齐 后面带宽度
- :后带填充的字符 只能是一个字符 不指定默认空格
- 与fromat方法一样.format()之前需要用引号括起来
a =" {:*>8}".format("123")
print(a)
# *****123
d = "我是{0},我喜欢学习{1:*^10}".format("Kyle","python")
print(d)
# 我是Kyle,我喜欢学习**python**
数字格式化
a = "我是{0},我的存款有{1:.2f}"
print(a.format("Kyle",3888.4649849))
# 我是Kyle,我的存款有3888.46
3.1415926 | {:.2f} | 3.14 | 保留小数点后两位 |
3.1415926 | {:+.2f} | 3.14 | 带符号保留小数点后两位 |
2.71828 | {:.0f} | 3 | 不带小数 |
5 | {:0>2d} | 05 | 数字补零 (填充左边, 宽度为2) |
5 | {:x<4d} | 5xxx | 数字补x (填充右边, 宽度为4) |
10 | {:x<4d} | 10xx | 数字补x (填充右边, 宽度为4) |
1000000 | {:,} | 1,000,000 | 以逗号分隔的数字格式 |
0.25 | {:.2%} | 25.00% | 百分比格式 |
1000000000 | {:.2e} | 1.00E+09 | 指数记法 |
13 | {:10d} | 13 | 右对齐 (默认, 宽度为10) |
13 | {:<10d} | 13 | 左对齐 (宽度为10) |
13 | {:^10d} | 13 | 中间对齐 (宽度为10) |
可变字符串
import io
s = "abcdefghijklmn"
sio = io.StringIO(s) #这里的sio 就是可变字符串了
print(sio)
print(sio.getvalue())
print(id(sio))
sio.seek(3)
sio.write("***")
print(sio.getvalue())
print(id(sio))
# <_io.StringIO object at 0x00000206F634CDC0>
# abcdefghijklmn
# 2228923715008
# abc***ghijklmn
# 2228923715008
# 这里的id地址没有更改可以看出是在原字符上进行的修改 并没有生成新的字符串
类型转换总结
int(x [,base]) | 将x转换为一个整数 |
long(x [,base] ) | 将x转换为一个长整数 |
float(x) | 将x转换到一个浮点数 |
complex(real[,imag]) | 创建一个复数 |
str(x) | 将对象 x 转换为字符串 |
repr(x) | 将对象 x 转换为表达式字符串 |
eval(str) | 用来计算在字符串中的有效Python表达式,并返回一个对象 |
Complex(A) | 将参数转换为复数型 |
tuple(s) | 将序列 s 转换为一个元组 |
list(s) | 将序列 s 转换为一个列表 |
set(s) | 转换为可变集合 |
dict(d) | 创建一个字典。d 必须是一个序列 (key,value)元组 |
frozenset(s) | 转换为不可变集合 |
chr(x) | 将一个整数转换为一个字符 |
unichr(x) | 将一个整数转换为Unicode字符 |
ord(x) | 将一个字符转换为它的整数值 |
hex(x) | 将一个整数转换为一个十六进制字符串 |
oct(x) | 将一个整数转换为一个八进制字符串 |
望采纳 有错误请指出 谢谢喜欢!