字符串与序列
字符串
最常用的数据类型。我们可以使用引号( ’ 或 " )来创建字符串。
访问字符串中的值
不支持单字符类型,单字符在 Python 中也是作为一个字符串使用。
访问子字符串,可以使用方括号来截取字符串,如下实例:
字符串更新
字符串不可修改,但可以截取字符串的一部分并与其他字段拼接,如下实例:
转义字符
字符中使用特殊字符时,用反斜杠( \ )转义字符。
转义字符 | 描述 |
\ (在行尾时) | 续行符 |
\ \ | 反斜杠符号 |
\ ’ | 单引号 |
\ " | 双引号 |
\a | 响铃 |
\b | 退格(Backspace) |
\000 | 空 |
\n | 换行 |
\v | 纵向制表符 |
\t | 横向制表符 |
\r | 回车 |
\f | 换页 |
\oyy | 八进制数,yy 代表的字符,例如:\o12 代表换行,其中 o 是字母,不是数字 0。 |
\xyy | 十六进制数,yy代表的字符,例如:\x0a代表换行 |
\other | 其它的字符以普通格式输出 |
字符串运算符
对字符串可以进行 + 和 * 运算,以及 in 、for…in 、[ : ]、[] 、%和以下的原始字符串。
原始字符串 :在字符串前加 r 。
长字符串 :使用三重引号。
字符串格式化
与 C 中 sprintf 函数一样的语法。
字符串格式化符号:
符号 | 描述 |
%c | 格式化字符及其ASCII码 |
%s | 格式化字符串 |
%d | 格式化整数 |
%u | 格式化无符号整型 |
%o | 格式化无符号八进制数 |
%x | 格式化无符号十六进制数 |
%X | 格式化无符号十六进制数(大写) |
%f | 格式化浮点数字,可指定小数点后的精度 |
%e | 用科学计数法格式化浮点数 |
%E | 作用同%e,用科学计数法格式化浮点数 |
%g | %f和%e的简写 |
%G | %f 和 %E 的简写 |
%p | 用十六进制数格式化变量的地址 |
格式化操作符辅助指令:
符号 | 功能 |
* | 定义宽度或者小数点精度 |
- | 用做左对齐 |
+ | 在正数前面显示加号( + ) |
< sp > | 在正数前面显示空格 |
# | 在八进制数前面显示零(‘0’),在十六进制前面显示’0x’或者’0X’(取决于用的是’x’还是’X’) |
0 | 显示的数字前面填充’0’而不是默认的空格 |
% | ‘%%‘输出一个单一的’%’ |
(var) | 映射变量(字典参数) |
m.n. | m 是显示的最小总宽度,n 是小数点后的位数(如果可用的话) |
Python2.6 开始,新增了一种格式化字符串的函数 str.format(),它增强了字符串格式化的功能。
字符串内建函数
内容太多,省略。。。
详尽内容请点击此处。
序列
序列的定义
对于序列,查阅了很多资料,网上的说法不一也,总之先参考了一张图(来自:)。
这张图说的对不对,对于现在的我来说是不确定的,毕竟我还是个小白=。=,也许之后学通了 Python 会回过头来修改这篇文章。(挖了一个好大的坑
还有一个说法也不错,比较认同该说法。该文对序列是这样定义的(来自:):
- 数据结构是通过某种方式组织在一起的元素的集合。
- 容器(Container)是一种Python的数据结构,基本上是包含其他对象的任意对象。序列和映射(如字典)是两类主要的容器。集合(Set)也是容器类型。
- 序列是最基本的数据结构,是通过对数据元素进行编号将它们组织在一起的数据元素的集合。
- Python有6中种内建的序列:列表、元组、字符串、Unicode字符串、buffer对象、xrange对象。
在翻阅参考资料中,其中我认为总结的比较好的一句话是:序列类型是一个基类类型。
通用序列操作
古话说得好:求同存异。我们先放置争议,看看统一的一部分,通用序列操作。
1、索引
序列中的每个元素被分配一个序号,即元素的位置,称为索引。以正数第一个元素的索引为0,正数第二个元素的索引为1,倒数第一个元素的索引为 -1,以此类推。
这个是我们比较熟悉的特点,我就不举例子了。
2、分片
分片使用2个冒号分隔的3个数字来完成:[头下标 : 尾下标 : 步长](满足左闭右开原则)
这个特性我在学字符串时学习过,废话不多说,直接看例子:
截取步长可以为负,正负表示读取正向和逆向,数字表示截取步长。
假设步长k,则每隔(k-1)个元素取一个元素,例如:
需要注意的是:
- 通过切片我们得到的是一个新列表。
- 切片可以返回列表的浅拷贝 a[:] == a ,a[:] 将得到包含 a 所有元素的分片,是一种很有效率的复制整个列表的方法。(看不懂浅拷贝没关系,我也没看懂=。=,下面会提到)
3、加 + 和乘 *
序列连接操作,只有相同类型的序列才能进行连接操作。同样需要注意通过加和乘我们得到的是一个新列表。
4、成员资格
使用in运算符(布尔运算符)检查一个元素是否在序列中,返回布尔值True或False。
5、内建函数(BIFs)
可以对任意序列操作。
函数 | 方法 |
len() | 返回序列中的元素个数。 |
max()、 min() | 返回序列中的最大或最小元素。 |
类型转换 | list()、str()和 tuple()被用做在各种序列类型之间转换。 |
其他未探寻的BIFs | enumerate(iter)、len(seq)、reversed(seq)、sorted(iter,func=None,key=None,reverse=False)、sum(seq, init=0)、zip([it0, it1,… itN]) |
注意:
len()、reversed()和sum()函数只能接受序列类型对象作为参数,而剩下的则还可以接受可迭代对象做为参数,另外max()和min()函数也可以接受一个参数列表。
6、迭代
未知=。=
7、赋值、浅拷贝与深拷贝
- 直接赋值:其实就是对象的引用(别名)。
b = a: 赋值引用,a 和 b 都指向同一个对象。 - 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。
b =a.copy(): 浅拷贝, a 和 b 是一个独立的对象,但他们的子对象还是指向统一对象(是引用)。
如果原地修改子对象,父对象也会改变。 - 深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。
b = copy.deepcopy(a): 深度拷贝, a 和 b 完全拷贝了父对象及其子对象,两者是完全独立的。
原文链接:
其他
关于字符串(以下是使用文本编辑器时需要注意的,其他情况请忽略,我也是看完才发现的):由于Python的字符串是Unicode编码的,但Unicode的编码一个字符占用若干个字节,而储存到磁盘或上传到网络时,需要把字符串转为以字节为单位bytes类型的数据(用前缀b的单引号或双引号表示,b‘abc’),而以bytes为单位的编码有ASCII和UTF-8(ASCII<UTF-8,后者包含中文)。str可以通过encode()方法转化为指定的bytes,例如
所以纯英文的str用ASCII,有中文的用utf-8,如果有中文的用ASCII编码会超出范围并报错,如上图最后一个例子。反过来,我们从网络或磁盘上读取了字节流,那么读到的数据是bytes,要把bytes变为str用decode()方法:
有无法解码的字节会报错,忽略错误字节后加errors=‘ignore’:
为了避免乱码问题,应当始终坚持使用UTF-8编码对str和bytes进行转换。由于Python源代码也是一个文本文件,所以当你的源代码中包含中文的时候,在保存的时候就需要务必指定保存为UTF-8编码。当Python解释器读取源代码时,为了让它按UTF-8编码读取,通常在文件开头加上这两行:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
第一行告诉系统这是Python可执行程序,第二行告诉解释器按照utf-8读取源代码。