我们对所有字符串的变化,都生成了一个新的字符串给你,这就是不可变对象。
元组就是一个不可变对象。字符串是第二个不可变对象。
举例:
s1 = ‘string‘
s2 = ‘string2‘
s3 = ‘‘‘this‘s a "string"‘‘
s4 = ‘hello \n magedu.com‘
s5 = r‘hello \n magedu.com‘ # 加r就会原样输出,字符都是原本意思
s6 = ‘c:\windows\nt‘
s7 = R‘c:\windows\nt‘ # 处理目录
s8 = ‘c:\windows\\nt‘ # 转义
sql="""select * from user where name=‘tom‘""" # 处理sql语句
字符串是字符的组合,
这句话在python当中不准确,
应该是字符串是字符串的组合。
因为你用type查看单个字符的类型,就是str
Cpython和pypy的垃圾回收机制有可能是不一样的。
因为他们的效率不一样。
list和tuple都有工厂方法,上面带一个参数iteratable
字符串也是可迭代对象
+
-> str
"string".join(iterable) -> str
将可迭代对象连接起来
可迭代对象本身元素都是字符串
返回一个新字符串
lst=[‘1‘,‘2‘,‘3‘]
print(""".join(lst)) # 分隔符是双引号,转义引号,用引号分割开元素
print(" ".join(lst))
print("\n".join(lst))
lst=["1",[‘a‘,‘b‘],‘3‘]
print(" ".join(lst)) # lst里面有引用类型,报错。
使用join的时候,一定要注意可迭代对象里面的元素,不能是引用类型。
有序的序列,都是可以用‘’
s1 = ‘abc‘
s24 -> ‘abcabcabcabc‘
分割字符串的方法分为2类
字符串处理,非常重要,比如处理日志
split和partition用的都非常多。
split(sep=None,maxsplit=-1) -> list of strings
s1 = "I‘m \ta super student."
s1.split() # ["I‘m", ‘a‘, ‘super‘, ‘student.‘]
s1.split(‘s‘) # ["I‘m \ta ", ‘uper ‘, ‘tudent.‘]
s1.split(‘super‘) # ["I‘m \ta ", ‘ student.‘]
s1.split(‘super ‘) # ["I‘m \ta ", ‘student.‘]
s1.split(‘ ‘) # ["I‘m", ‘\ta‘, ‘super‘, ‘student.‘]
s1.split(‘ ‘,maxsplit=2) # ["I‘m", ‘\ta‘, ‘super student.‘]
s1.split(‘\t‘,maxsplit=2) # ["I‘m ", ‘a super student.‘]
rsplit(sep=None,maxsplit=-1) -> list of strings
s1 = "I‘m \ta super student."
s1.rsplit()
# ["I‘m", ‘a‘, ‘super‘, ‘student.‘]
s1.rsplit(‘s‘)
# ["I‘m \ta ", ‘uper ‘, ‘tudent.‘]
s1.rsplit(‘super‘)
# ["I‘m \ta ", ‘ student.‘]
s1.rsplit(‘super ‘)
# ["I‘m \ta ", ‘student.‘]
s1.rsplit(‘ ‘)
# ["I‘m", ‘\ta‘, ‘super‘, ‘student.‘]
s1.rsplit(‘ ‘,maxsplit=2)
# ["I‘m \ta", ‘super‘, ‘student.‘]
s1.rsplit(‘\t‘,maxsplit=2)
# ["I‘m ", ‘a super student.‘]
这种方式,从路径里面取文件名,最适合。
从右边开始找,按照斜杠和反斜杠切。
splitlines([keepends]) -> list of strings
\n
,‘\r\n‘,‘\r‘等‘ab c\n\nde fg\rkl\r\n‘.splitlines()
‘ab c\n\nde fg\rkl\r\n‘.splitlines(True)
s1 = "I‘m a super student.
You‘re a super teacher."
print(s1)
print(s1.splitlines())
print(s1.splitlines(True))
partition(sep) -> (head,sep,tail)
s1 = "I‘m a super student."
s1.partition(‘s‘)
s1.partition(‘stu‘)
s1.partition(‘‘) # 空分隔符,会报错
s1.partition(‘abc‘)
rpartition,处理路径当中的文件名的时候,非常适合。
‘www.magedu.com‘.replace(‘w‘,‘p‘)
‘www.magedu.com‘.replace(‘w‘,‘p‘,2)
‘www.magedu.com‘.replace(‘w‘,‘p‘,3)
‘www.magedu.com‘.replace(‘ww‘,‘p‘,2)
‘www.magedu.com‘.replace(‘www‘,‘python‘,2)
‘www.magedu.com‘.replace(‘w‘,‘p‘)
strip([chars])
s = "\r\n\t Hello Python \n \t"
s.strip()
s = "I am very very very sorry"
s.strip(‘ly‘)
s.strip(‘ly ‘)
遇到查找,就要考虑效率问题
find(sub[,start[,end]])
rfind(sub[,start[,end]])
s = "I‘m very very very sorry"
s.find(‘very‘)
s.find(‘very‘,5)
s.find(‘very‘,6,13)
s.find(‘very‘,10)
s.find(‘very‘,10,15)
s.find(‘very‘,10,-1)
index(sub[,start[,end]]) - int
rindex(sub[,start[,end]]) - int
s = "I am very very very sorry"
s.index(‘very‘)
s.index(‘very‘,5)
s.index(‘very‘,6,13)
s.index(‘very‘,10)
s.index(‘very‘,10,15)
s.index(‘very‘,-10,-1)
index和find相比,倾向于用find,因为index会抛出来异常
抛异常不处理,程序就崩了
因为异常有的时候,很难测试出来
count[sub[,start[,end]]] - int
s = "I am very very very sorry"
s.count(‘very‘)
s.count(‘very‘,5)
s.count(‘very‘,10,14)
真的给你文本(一本小说),单词有多少个,就是要用字典
如果文本是源源不断产生的,就像是日志,就要用count
s = "I am very very very sorry"
s.startswith(‘very‘)
s.startswith(‘very‘,5)
s.startswith(‘very‘,5,9)
s.endswith(‘very‘,5,9)
s.endswith(‘sorry‘,5)
s.endswith(‘sorry‘,5,-1)
s.endswith(‘sorry‘,5,100)
有正则表达式之后,慢慢都不太用这些玩意
+
拼接字符还算方便,但是非字符串需要先转换为字符串才能拼接并不是所有对象,都能够用str()函数来进行强制转换的,所以+这种方式,也有点局限
"I am %03d" % (20,) # 020
"I like %s" % ‘Python‘ # I like Python
"I an %s%%" % 20" # I am 20%
"%03.2f%%,0x%x,0X%02X" % (89.7654,10,15) # 89.77%,0xa,0X0F 有效数字,要求数量小于有效数字,按照有效打,大于补0
"I am %-5d" % (20,) # 默认右对齐,-号是左对齐
位置参数
# 这就是按照位置顺序用位置参数替换前面的格式字符串的占位符
"{}:{}".format(‘192.168.1.100‘,8888)
关键字参数或命名参数
# 位置参数按找序号匹配,关键字参数按找名词匹配
"{server}{1}:{0}".format(8888,‘192.168.1.100‘,server=‘Web Server Info:‘)
访问元素
"{0[0]}.{0[1]}".format((‘magedu‘,‘com‘))
对象属性访问
from collections import namedtuple
Point = namedtuple(‘Point‘,‘x y‘)
p = Point(4,5)
"{{{0.x},{0.y}}}".format(p) # {4,5}
字符串拼接是new出来一个字符串,format也是new一个。
‘{0}*{1}={2:<2}‘.format(3,2,2*3) # 左对齐
‘{0}*{1}={2:<02}‘.format(3,2,2*3) #
‘{0}*{1}={2:>02}‘.format(3,2,2*3) # 默认右对齐
‘{:^30}‘.format("centered") # 居中
‘{:*^30}‘.format("centered") # 居中
- 进制
```python
"int:{0:d};hex:{0:x};oct:{0:o};bin:{0:b}".format(42)
"int:{0:d};hex:{0:#x};oct:{0:#o};bin:(0:#b)".format(42)
octets=[192,168,0,1] # 点分四段十进制表示法的IPv4地址
‘{:02X}{:02X}{:02X}{:02X}‘.format(*octets) #*octets 参数解构
在python中,请优先使用format函数格式化字符串
num = input(‘>>>>‘)
print(‘这是一个{}位数‘.format(len(num)))
int_num = int(num)
count=[0]*10
for i in range(len(num)):
a = int_num % 10 # 求余数
count[a-1] += 1
print(‘第{0}位数字是{1},这个{1}出现了{2}次‘.format(i+1,a,count[a-1]))
int_num = int_num // 10 # 减少一位
原文:https://www.cnblogs.com/gnuzsx/p/12726493.html