String
在 C/C++ 等语言中,有字符与字符串两种数据类型,但是在 Python 中统一当作字符串处理,即字符就是只含有一个元素的字符串。
我们可以使用单引号或者双引号来创建字符串
1. 不可变数据类型
String 属于不可变数据类型,即我们无法对字符串进行修改:
>>> s = "hello python"
>>> s[0] = "H"
TypeError Traceback (most recent call last)
<ipython-input-25-fddebcffc74c> in <module>
1 s = "hello python"
----> 2 s[0] = "H"
TypeError: 'str' object does not support item assignment
虽然不可以修改,但是我们可以通过方括号访问子串以及截取字符串。(这一特点与Python中另外两种序列类型List、Tuple相同)
(1)访问某一个字符:
>>> s = "hello python"
>>> print(s[6])
p
(2)截取子串:
>>> s = "hello python"
>>> print(s[:4])
hell
>>> print(s)
hello python
2. 转义字符
当我们在字符串中需要使用特殊字符时,Python 用反斜杠( \ )转义字符
例如:
>>> s = "hello\npython"
>>> print(s)
hello
python
例子中的 \n 代表换行符,在此我仅列举几个常用转义字符:
(1)\n 换行
(2)\t 横向制表符
(3)\r 回车
(4)\\ 反斜杠符号
如果想让字符串原样输出,可以使用 r :
>>> s = r"hello\npython"
>>> print(s)
hello\npython
另一种情况,如果我们想让字符串多行显示,但是用转义字符 \n 又太麻烦,不用担心,Python 对多行字符串也有支持,Python三引号允许一个字符串跨多行,并且字符串中可以包含换行符、制表符以及其他特殊字符。
>>> s = """hello
>>> python""" #此处python前使用了一个横向制表符
>>> print(s)
hello
python
3. 字符串格式化
熟悉 C 语言的同学可能知道,C 语言中通过 % 格式化输出字符串,Python 中同样提供了这一基本用法。但是由于Python2.6 开始,新增了一种格式化字符串的函数 str.format(),它增强了字符串格式化的功能。因此我们跳过 % 格式化字符串的方法,直接来讲解 str.format()
(1) str.format
话不多说,我们先看一个例子:
>>> "{} {}".format("hello", "python")
'hello python'
>>> "{0} {1}".format("hello", "python")
'hello python'
>>> "{1} {0}".format("hello", "python")
'python hello'
>>> "{0} {0} {1}".format("hello", "python")
'hello hello python'
细心的你一定发现了,原来 {} 中的数字对应着传入 format() 中的参数的位置
此外,我们还可以以不同的方式传入参数:
>>> print("博客名:{name}, 地址 {url}".format(name="飞翔的红猪", url="https://blog.csdn.net/WangWeb1998"))
博客名:飞翔的红猪, 地址 https://blog.csdn.net/WangWeb1998
# 通过字典设置参数
>>> site = {"name": "飞翔的红猪", "url": "https://blog.csdn.net/WangWeb1998"}
>>> print("博客名:{name}, 地址 {url}".format(**site))
博客名:飞翔的红猪, 地址 https://blog.csdn.net/WangWeb1998
# 通过列表索引设置参数
>>> my_list = ['飞翔的红猪', 'https://blog.csdn.net/WangWeb1998']
>>> print("网站名:{0[0]}, 地址 {0[1]}".format(my_list))
博客名:飞翔的红猪, 地址 https://blog.csdn.net/WangWeb1998
# 还可以传入对象
>>> class AssignValue(object):
>>> def __init__(self, name, url):
>>> self.name = name
>>> self.url = url
>>> my_value = AssignValue("飞翔的红猪", "https://blog.csdn.net/WangWeb1998")
>>> print("博客名:{0.name}, 地址 {0.url}".format(my_value))
博客名:飞翔的红猪, 地址 https://blog.csdn.net/WangWeb1998
当然了,还有最最常用的格式化呢?
别着急,首先我们来介绍一下str.format() 中最基本的两个符号 {}、:
如果你仔细观察了上面的例子,你一定已经明白了,大括号就相当于我们要输出的字符串中的一个占位符,其中的第一个数字就代表着我们传入的参数的索引,例如 {0} 就代表着我们想要将传入format中的第一个参数放在这个大括号里。
当然了,仅仅将参数放到对应的位置远远达不到我们的要求,通常我们想要做的是将参数格式化显示出来,什么叫格式化呢?限定宽度,左右居中对齐,限定小数点后的位数等等。这个时候,我们的 :冒号就要出场了!同样,直接上例子:
>>> print("{0},{1}".format("hello", "python"))
hello,python
>>> print("{0:10s},{1}".format("hello", "python"))
hello ,python
>>> print("{0},{1:x>10s}".format("hello", "python"))
hello,xxxxpython
如果你是第一次接触 str.format 你可能已经被这个例子整懵了,但是,想必顽强的你也注意到了一点:似乎加了冒号的位置参数输出格式不一样了?恭喜你,答对了!
我们可以这样来理解,{} 告诉计算机我这个位置将来要传入参数,而 : 则告诉计算机我要控制这个参数的输出格式!
接下来,我尽量为大家总结一个万能公式
1. 当传入的参数是字符串时:{<index>:<completion><alignment><width>s}
<index> 已经介绍过,代表着对应的参数的位置索引
之后我们先暂且跳过<completion>
<alignment>此处取值有3种 > < ^,分别代表右对齐,左对齐以及居中
<width>代表着输出宽度,好了,我们来看个例子:
>>> print("{0:>15s},{1}".format("hello", "python"))
hello,python
>>> print("{0:<15s},{1}".format("hello", "python"))
hello ,python
>>> print("{0:^15s},{1}".format("hello", "python"))
hello ,python
看完这个,相信你一定已经理解了<alignment><width>的意义,那么<completion>对你来说也不成问题了:
>>> print("{0:A^15s},{1}".format("hello", "python"))
AAAAAhelloAAAAA,python
没错,<completion>就是指补全字符!
最后,{} 中的 s 想必不必过多地解释了,s 代表着此处参数类型是字符串,此外 d 代表整数,f 代表浮点数
讲到这里,字符串常用的格式化输出方式就讲解完毕了,接下来我们看一下数字格式化输出
2. 当传入的参数是数字时:
{ <index>:<completion><alignment> <sign> <width>\ <.precision | only in f> [d/f] }
<index> <completion> <alignment> <width> 与在字符串中的含义相同,不再赘述
<sign> 代表是否输出正负号,当取值为 + 时,表示输出数字的正负号
>>> print("{0:x>+10d},{1:+d}".format(-46, 12))
xxxxxxx-46,+12
<.precision | only in f> 表示当数字类型为 float 时,我们可以通过这个选项来控制小数点后的位数
>>> print("{0:<+15.2f},{1:.3f}".format(-32.6844, 12.1))
-32.68 ,12.100
此外我们可以使用大括号 {} 来转义大括号,如下实例:
>>> print ("{} 对应的位置是 {{0}}".format("python"))
python 对应的位置是 {0}
如果你坚持看到了这里,那么恭喜你,你已经掌握了 str.format() 格式化输出的基本用法,之后只需要多多实践加深理解就可以了。
4. 字符串常用内建函数
1. 字符串查找
(1) find(str, beg=0, end=len(string))
检测 str 是否包含在字符串中,如果指定范围 beg 和 end ,则检查是否包含在指定范围内,如果包含返回开始的索引值,否则返回-1
(2) rfind(str, beg=0,end=len(string))
类似于 find()函数,不过是从右边开始查找.
(3) index(str, beg=0, end=len(string))
跟find()方法一样,只不过如果str不在字符串中会报一个异常.
(4) rindex( str, beg=0, end=len(string))
类似于 index(),不过是从右边开始.
(5) endswith(suffix, beg=0, end=len(string))
检查字符串是否以 obj 结束,如果beg 或者 end 指定则检查指定的范围内是否以 obj 结束,如果是,返回 True,否则返回 False.
(6) startswith(substr, beg=0,end=len(string))
检查字符串是否是以指定子字符串 substr 开头,是则返回 True,否则返回 False。如果beg 和 end 指定值,则在指定范围内检查。
(7) count(str, beg= 0,end=len(string))
返回 str 在 string 里面出现的次数,如果 beg 或者 end 指定则返回指定范围内 str 出现的次数
(8) max(str)
返回字符串 str 中最大的字母。
(9) min(str)
返回字符串 str 中最小的字母。
(10) len(string)
返回字符串长度
2. 字符串处理
(1) join(seq)
以指定字符串作为分隔符,将 seq 中所有的元素(的字符串表示)合并为一个新的字符串
(2) str.split(str="", num=string.count(str))
以 str 为分隔符截取字符串,如果 num 有指定值,则仅截取 num+1 个子字符串
(3) lower()
转换字符串中所有大写字符为小写.
(4) upper()
转换字符串中的小写字母为大写
(5) swapcase()
将字符串中大写转换为小写,小写转换为大写
(6) capitalize()
将字符串的第一个字符转换为大写
(7) lstrip()
截掉字符串左边的空格或指定字符。
(8) rstrip()
删除字符串字符串末尾的空格.
(9) strip([chars])
在字符串上执行 lstrip()和 rstrip()
(10) replace(old, new [, max])
replace() 方法把字符串中的 old(旧字符串) 替换成 new(新字符串),如果指定第三个参数max,则替换不超过 max 次。
3. 字符串判别
(1) isalnum()
如果字符串至少有一个字符并且所有字符都是字母或数字则返 回 True,否则返回 False
(2) isalpha()
如果字符串至少有一个字符并且所有字符都是字母则返回 True, 否则返回 False
(3) isdigit()
如果字符串只包含数字则返回 True 否则返回 False
(4) isnumeric()
如果字符串中只包含数字字符,则返回 True,否则返回 False
这两个函数乍一看好像完全是一个作用,为了展示它俩的区别,我们来看一个例子:
>>> a = "152649"
>>> b = "一二三四五"
>>> print(a.isdigit())
>>> print(b.isdigit())
>>> print(a.isnumeric())
>>> print(b.isnumeric())
True
False
True
True
想必你已经猜到了,isnumeric() 函数中的数字字符代表的含义更广,可以是: Unicode 数字,全角数字(双字节),罗马数字,汉字数字。
(5) islower()
如果字符串中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是小写,则返回 True,否则返回 False
(6) isupper()
如果字符串中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是大写,则返回 True,否则返回 False
4. 字符串编码、解码
(1) encode(encoding=‘UTF-8’,errors=‘strict’)
以 encoding 指定的编码格式编码字符串,如果出错默认报一个ValueError 的异常,除非 errors 指定的是’ignore’或者’replace’
(2) bytes.decode(encoding=“utf-8”, errors=“strict”)
Python3 中没有 decode 方法,但我们可以使用 bytes 对象的 decode() 方法来解码给定的 bytes 对象,这个 bytes 对象可以由 str.encode() 来编码返回。