[oeasy]python0071_字符串类型_str_string_下标运算符_中括号

回忆上次内容
上次 分辨了
静态类型 语言
动态类型 语言
python 属于
也容易 弄不清变量类型
动态类型
语言对类型要求 没有那么严格的
对 初学者很友好
不过很多时候
直接 修改代码
把缩进 作为程序块的分界一样
明确起来
明确标记在 变量名上
增强 程序的可读性
把变量的类型
就像
想要 真正成为编程高手
知道 这数据类型 的特性
明确 变量的数据类型
不但 要
而且 要
比如
字符串
类型到底有些什么特性呢?🤔
字符串
s 是 字符串类型的变量

字符串
英文名称是 string

string
意思是
绳子或者琴弦

后来也指
用绳子把什么东西串起来
比如串什么东西呢?
手串
这就是一串金刚菩提串的
折中串 有长有短
这一串 多少颗金刚菩提 呢?
这一串 108 颗
代表断除一百零八种烦恼

有事没事就盘串
用猪鬃刷子清洗
放到阴凉地方阴干
用手盘包了浆
最终
证得一百零八种无量三昧
三昧就是三摩地
俗称入定
只要静心就都能入定

经常盘笔记本键盘
但是会盘出奇迹
虽然没有包浆
糖葫芦串
山楂 串起来 形成的
就是糖葫芦串

类似的还有
烤肉筋串
烤鸡心串
烤板筋串
字符串
字符串
字符串 就是 把字符串起来
就是一个字符
字符串 里面每个山楂

怎么理解字符串?
字符串
字符串就是 字符的串
把一个个字符串起来

字符串有多长呢?
长度
知道了这个串是
由字符构成的
那这个串有多长呢
可以使用函数
help(str.len)

len("oeasy")
字符串有几个字符
字符串就有多长

总共 5 个字符
具体是哪五个字符?🤔
下标
字符可以用 下标运算符
[]
进行访问就得到第n个字符
将 序号n 放入中括号里
特别注意❗❗❗
下标不是从 1 开始的
而是从
0
开始的从零开始

这样就可以用序号
访问到字符串中的每个字符
下标范围
下标从 0 开始
最后一位是 len(o)-1
也就是 5-1 = 4
写成-1 也可以
意思是 倒数第一个字符

如果我
就
想访问 o[5] 呢
下标越界
访问 o[5] 报错
IndexError
string index out of range

字符串索引 超出范围
字符串索引 下标越界
访问了 一个不存在的下标值
类型和位置
先自省一下
自省(introspection)

通过 type 函数获得 变量o 的类型
变量o的类型 是
str
就是 字符串 string

通过 id 函数获得 变量o 在内存中的地址
这个地址是一串数字
这数字 就是 o 在内存中的唯一标识
是 变量o的内存地址
初始化过程
内存地址(
140547862959216
)被赋给s_title
s_title 里面存的是
"oeasy"字符串

oeasy这5个字符
究竟是如何存储在内存中的呢?
ascii 编码
字符串中存储的是英文字符
属于ascii 字符
有七位二进制数
放在内存里面一个字节就可以

那 5 个字符
分别什么样呢?
5 个字符
id 那个位置
有一个 str 类的对象
指向五个字符连成的串
每个字符都有自己的字节

这些字节都在什么位置呢?
字符位置
字符串
有字符串的地址

下标索引到的字符
可以注意到相同字符的位置是相同的
有字符的地址

如果有回车这类的转义字符呢?
回车字符
一个转义字符也占据一个字节
序号为10
字节状态为
b"\x0a"
比如 回车字符
\n
回忆一下进制转化
int
2进制 bin
8进制 oct
16进制 hex
从十进制到其他进制
从其他进制到十进制
编码转化
chr
ord
从字符转化为序号
从序号转化为字符
字节序列与字符串转化
encode
decode
字节序列到字符串
从字符串到字节序列
转义字符
转义字符也占据一个字节
所有转义字符都如此么?
如果有中文字符呢?
中文字符
str = “a一”
总共两个字符
一个是英文字符
另一个是中文汉字字符
对应两个位置
str[0] - a
str[1] - 一
其中 a 是 ascii 字符
长度为1
一是 utf-8 编码的 unicode 字符
作为字符的长度也为1
具体占用几个字节呢?
编码
首先要知道内存中的编码方式
到底是utf-8
还是unicode
查询str的帮助
发现默认编码是系统的默认编码
所以在python3的运行环境下
目前就是utf-8
str的默认编码就是系统的编码
内存情况
可以看到
a 就是
\x61
一 就是
\xe4\xb8\x80
用变量赋值
s1 = “oeasy”
oeasy
这个字符串长度 5 个字节
s1 位于 139633377299288
s2 = “o2z”
o2z
这个字符串长度 3 个字节
s2 位于 139633366623112
s2 = s1
令s2 位于 id(s1)
s2 和 s1 都指向 原来 s1 的地址
最终引用情况
原来 s2 所指向
现在没有变量引用了
会被系统垃圾回收
有两个变量引用(s1、s2)
字符串"oeasy"
字符串 “o2z”
注意事项
str 可以
把数字转化为一个字符串
str 是类的名字
但是一旦被赋值
就无法转化了
特别注意❗❗❗
初学者要特别注意
不要将str作为变量名!📢
总结
这次了解的是字符串
字符串就是字符的串
字符串长度 可以用 len函数
字符可以用下标索引 []
可以用str
将整型数字转化为字符串
字符的长度本身有长有短
都算一个字符
可能对应 3 个字节
都对应 1 个字节
ascii 包括各种 转义字符
unicode 字符中的汉字
但不管本身是 1 字节 还是 3 字节
将字符串赋给一个字符串变量
就是字符串在内存中的地址
这就是字符串变量的id
除了字符串
还有什么变量类型?🤔
下次再说!👋
蓝桥->https://www.lanqiao.cn/courses/3584
github->https://github.com/overmind1980/oeasy-python-tutorial
gitee->https://gitee.com/overmind1980/oeasypython