python 学习笔记 5 ----> dive into python 3

字符串

文本:屏幕上显示的字符或者其他的记号

计算机认识的东西:位(bit)和字节(byte)

文本的本质:某种字符编码方式保存的内容。

字符编码:一种映射(显示的内容  ----> 内存、磁盘内存储的内容)

编码方式:一种将计算机可读的数字映射成人类可读的字符的解码秘钥。

unicode

1 为任意语言的任意字符设计

2 4字节

3 每个数字代表唯一的符号

4 UTF-32:每1个字符使用4个字节

UTF-16:每1个字符使用2个字节(前65535个字符),空间效率比UTF-32高

5 UTF-32和UTF-16编码方式在不同的计算机系统会以不同的顺序保存字节。(大尾端和小尾端)----> 使用字节顺序标记可解决

6 UTF-8:长度变化的unicode编码系统,使用Bit-Twidding,不同的字符占用不同的字节:

  1 ASCII码:1个字符占用1个字节

  2 中文:1个字符占用3个字节

  3 不常用的“astral plane”:1个字符占用4个字节

所谓Bit-Twiddling,指的就是通过直接操作数据的字节来实现对数据的修改功能。例如,如果我们要将int类型的变量value的值变为原来的两倍,那我们既可以使用语句value *= 2,也可以使用value <<= 1的方法,后者就是Bit-Twiddling,大多数情况下,使用Bit-Twiddling的程序可以运行的更快。

参考文章

https://lfwen.site/2017/02/08/bit-hacking/

字符串

1 字符串可以用单引号或者双引号定义

2 值格式化成字符串:使用占位符将值插入字符串

3 字符串是对象,对象有方法,例如,"abc{0}{1}".format("d","e"),其中{0},{1}叫做替换字段。

格式化字符串

4 深入format()方法

"{0}'s password is {1}".format(username, password) 

{0}和{1} 叫做替换字段,它们是整型替换字段

整型替换字段可以看做是format()方法中的参数列表的位置索引。在上面的例子中,{0}会被第一个参数替换(即 username),{1}被第二个参数替换(即password)

si_suffixes = ['KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']'1000{0[0]} = 1{0[1]}'.format(si_suffixes) 

{0}代表传递给format()方法的第一个参数,即 si_suffixes。注意si_suffixes 是一个列表。所以{0[0]}指代 si_suffixes 的第一个元素,即'KB'。同时,{0[1]}指代该列表的第二个元素,即:'MB'。

通过利用(类似)Python 的语法访问到对象的元素或属性。这就叫做复合字段名。例如列表,字典,模块,类的实例等的访问到元素或属性的方式。以下是一个综合的例子:

import humansize
import sys
'1MB = 1000{0.modules[humansize].SUFFIXES[1000][0]}'.format(sys)

替换域{0}指代 sys 模块。

sys.modules 是一个保存当前 Python 实例中所有已经导入模块的字典。模块的名字作为字典的键;模块自身则是键所对应的值。所以{0.modules}指代保存当前己被导入模块的字典。

sys.modules['humansize']即刚才导入的humansize模块。所以替换域{0.modules[humansize]}指代humansize模块。(注意:在实际的Python代码中,字典sys.modules的键是字符串类型的;为了引用它们,我们需要在模块名周围放上引号(比如 'humansize')。但是在使用替换域的时候,我们在省略了字典的键名周围的引号(比如humansize)。)

sys.modules['humansize'].SUFFIXES 是在 humansize 模块的开头定义的一个字典对象。 {0.modules[humansize].SUFFIXES}即指向该字典。

sys.modules['humansize'].SUFFIXES[1000]是一个 SI(国际单位制)后缀列表对象:['KB', 'MB', 'GB', 'TB', 'PB', 'EB','ZB', 'YB']。所以替换域{0.modules[humansize].SUFFIXES[1000]}指向该列表。

最后可知,sys.modules['humansize'].SUFFIXES[1000][0]即 SI 后缀列表的第一个元素:'KB'。

if size < multiple:
    return '{0:.1f} {1}'.format(size, suffix)

{1}会被传递给 format()方法的第二个参数替换,即 suffix。

{0:.1f} 在替换域中,”的意思是四舍五入,保留一位小数。“f”的意思是定点数(与指数标记法或者其他 10 进制数表示方法相对应)。

其他字符串方法

s.splitlines():输入:多行字符串;输出:一个由字符串组成的列表

s.lower():字符串转换成小写

s.upper():大写转换操作

s.lower().count():输入:字符子串;输出:返回字符串中指定的子串数量

对url参数的处理:

param = username=rui&password=123&address=HK

1 dict([p.split('=', 1) for p in param.split('&')])

2 使用现有库urllib.parse.parse_qs()函数

字符串分片

它类似列表的分片,形如,str[a : b],表示从a位置到(b-1)位置的字符串分片

1 通过指定两个索引值来获得原字符串的一个分片,从0开始

2 可以使用负的索引值,从-1开始

3 str[a: ] == str[a : b]

3 str[ : n]:返回前n个字符,str[n : ]:返回剩余的字符

string和bytes的比较

1 一个不可变(immutable)的Unicode 编码的字符序列叫做 string。

一串由 0 到 255 之间的数字组成的序列(数字序列)叫做 bytes 对象。

2 byte字面值语法:b'',它可以用来定义bytes对象

3 bytes对象不可变。bytes对象转换为bytearray对象(可变的),这样使得可以改变某个字节

4 字符串有内置函数len(),encode(),decode()等,可以使用+操作符(连接操作)

5 bytes和strings是不同类型的数据,不能混合使用,需要转换:

bytes -> strings:str = by.decode(‘'编码格式')(by代表字节,str代表字符串)

strings -> bytes:by = str.encode('编码格式')(by代表字节,str代表字符串)

Python编码

1 Python3的.py文件默认的编码方式是UTF-8

2 可以通过代码方式改变编码方式

#!/usr/bin/python3
# -*- coding:big5 -*-

参考文档:

dive into python 3

python372.chm

上一篇:java 转换流


下一篇:BW增强数据源的两种方法