第二章
二进制运算、字符编码、数据类型
二进制与十进制转换
imgASCII表
img文字转2进制
计算机容量单位
img字符编码
列表
-
创建:
- a = list()
- a = []
-
查询:
- L2[2] 通过索引取值
- L2[-1] 通过索引从列表右边开始取值
- L2.index('a') 返回指定元素的索引值,从左右查找,找到第一个匹配值,则返回.
- L2.count('a') 统计指定元素的个数
-
切片:
- L2[0:3] 返回从索引0至3的元素,不包括3,顾头不顾尾
- L2[0:-1] 返回从索引0至最后一个值,不包括最后一个值
- L2[2:] 返回从索引2至最后一个值,包括最后一个值
- L2[3:6] 返回从索引3至6的元素
- L2[:3] 返回从索引0至3的值,不包括3
- L2[1: 6:2] 返回索引1至5的值,但是步长为2(每隔一个元素,取一个值)
- L2[:] 返回所有的值
- L2[::2] 按步长为2,返回所有的值
-
增加:
- L2.append("A") 列表最后面追加A
- L2.insert(3, "B") 在列表索引为3的位置插入一个值 B
-
修改:
- L2[3] = "boy" 把索引3的元素修改为boy
- L[4:6] = "Alex LI" 把索引4-6的元素改为Alex LI,不够的元素自动增加
-
删除:
- L2.pop() 删除最后一个元素
- L2.remove('L') 删除从左找到的第一个指定元素
- del L2[4] 用python全局的删除方法删除 指定元素
- del L2[3:7] 删除多个元素
-
循环:
- for i in L2:
- while 可以死循环,和for相比,一个无边界,一个有边界.
- for i in L2:
-
排序:
- L2.sort()
- 不能对包含了str和int的列表进行排序
- L2.sort()按照特殊字符>>>大写字母>>>>小写字母的顺序排列按照ASCII表的顺序排列
- L2.reverse() 反转
- L2.sort()
-
其他用法:
- L2.extend([1,2,3,4]) 把一个列表扩展到L2列表,进行合并
- L1+L2 两个列表直接相加,进行合并
- L2[2][1] 嵌套列表取值
- L2.clear() 清空列表
- L2.copy()
-
enumerate() 枚举
for index,p in enumerate(L2): print(index,p)
copy方法
-
通过id(a)方法查看a的内存地址
>>> a = 1 >>> b = a >>> id(a),id(b) (1615293920, 1615293920) >>> a = 2 >>> id(a) 1615293952
-
L1 = L2 将L1列表指向了L2列表的内存地址,是列表这个容器的内存地址,而不是列表中元素的内存地址.
-
L1[0] = "abc" L2列表中的第0个元素也会变为"abc"
-
相当于L1和L2里面的元素是共享的,其实也就是同一内容.
浅copy
- 通过L3 = L2.copy() 复制一个列表
- 相当于执行了一次浅copy,仅对表层的内存地址进行了copy,深层次的比如说L2中的一个列表类型的元素里面的元素是共享的
深copy
import copy
L3 = copy.deepcopy(L2)
完全copy,所有的内部元素独立复制一份,不经常用,除非特殊场景,否则尽量不要用深copy.
字符串
- 字符串是一个有序的字符的集合,用于存储和表示基本的文本信息,一对单、双、或三引号中间包含的内容称之为字符串。
- 特性:
- 有序
- 不可变
字符串的方法
- s.swapcase() 大写变小写,小写变大写,
- s.capitalize() 首字母大写,其他都小写。
- s.casefold() 全变成小写
- s.center(50,'*') 字符串s居中,使用来填充至50个字符。*
- s.count("o") 统计字符串s中“o“的个数,s.count("o",0,5)统计字符串s中从0至5字段中的o的个数。
- s.expandtabs() 如果字符串s中有\t,使用s.expandtabs(20)将\t变成20长度
- s.find("o",0,5) 在s中从0至5字段中的o的索引号,如果没有返回-1
- s.format() 格式化输出 两种方式,位置{0}{1},或者 {a}{b},
- s.format_map() 暂时略
- s.index("h",0,5) 返回0至5字段中的h的索引值,找不到h会直接程序报错
- "22dd".isalnum() 判断是否为阿拉伯字母和数字
- s.isalpha() 判断是否为纯阿拉伯字母
- s.isdecimal() 判断是否为整数
- s.isdigit() 判断是否为整数
- s.isidentifier() 判断是不是一个合法的变量名
- s.islower() 判断s是不是全是小写
- s.isnumeric() 判断是不是只有数字在s里面
- s.isprintable() 判断s是不是可打印的,比如视频数据是不可打印的
- s.isspace() 判断是否是空格
- s.istitle() 判断每个单词的首字母是不是大写
- s.isupper() 判断s是不是都是大写
- ":".join(L1) 把列表L1里面的每一个元素使用:拼接起来输出为字符串
- s.ljust(50,"-") 将字符串s变成长度50,不够的在后面用-补全
- s.lower() 全变小写
- s.upper() 全变大写
- s.strip() 把首尾的换行、\t、空格都去掉
- s.lstrip() 处理s字符串左边的换行、\t、空格
- s.rstrip() 处理s字符串右边的换行、\t、空格
- s.partition("o") 把s中的所有字符以"o"为中界线分开成三份
- s.replace("g","G") 将s中的g替换为G
- s.replace("o","-",1) 将s中的1个o替换为-
- s.rfind("o") 从右边开始找第一个o的索引值
- s.rfind()
- s.rindex()
- s.rjust()
- s.rpartition()
- s.split() 将s默认以空格分割成列表
- s.split("o")
- s.rsplit("o",1) 从
- s.rstrip()
- s.splitlines() 以换行分割成列表
- s.startswith("hell") 判断s是不是以hell开始的
- s.zfill(40) 将s长度变为40,不够的以0在开头补全
常用的字符串方法
- isdigit()
- replace()
- find()
- count()
- strip()
- split()
- center()
- froma()
- join()
必须熟练掌握
元祖
-
有序不可变的,只读列表
-
names = ("Alex","dc","jack")
-
names.count() names.index() 只有2个方法
-
可以进行切片,因为切片是取数据
-
如果元祖里面的元素是列表等可修改元素,这个列表中的内容是可以修改的.
-
a = (1,2,3,4,["dc","alex","dd"],"zz") 列表["dc","alex","dd"]中的"dc","alex","dd"是可以更改的.
元祖用途:
显示的告诉别人,此处数据不可修改
数据库连接配置信息等
-
hash 散列
- Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来唯一的确定输入值.简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数.
- 特征:
- hsah值的计算过程是依据这个值的一些特征计算的,这就要求被hash的值必须固定,因此被hash的值必须是不可变的
- 不可变类型:数字,字符串,元组
- 可变类型:列表
- hsah值的计算过程是依据这个值的一些特征计算的,这就要求被hash的值必须固定,因此被hash的值必须是不可变的
- 用途:
- 文件签名
- md5加密
- 密码验证
- hash冲突
- 如果程序中要被hash处理的数据量足够多,有可能不同的目标值产生的hash值会相同,因为hash的内部算法并不能100%使所有的值都不相同,所以要解决hash冲突
字典
- 一种key-value的数据类型,使用就像我们上学用的字典,通过笔划,字母来查对应页的内容.
- 特性:
- key-value结构
- key必须可hash,且必须为不可变数据类型,必须唯一
- 可存放任意多个值,值可以修改,值可以不唯一
- 无序
- 查找速度快
字典操作
- 增加
- info["stu1104"] = "xiao cang"
- 修改
- info["stu1101"] = "wu teng"
- 查找
- "stu1192" in info #标准用法 在字典里面的话返回True,否则返回False
- info.get("stu1102") # 获取stu1102的值
- info["stu1102"] 也是获取stu1102的值,但是如果这个key不存在,就会程序报错,get不会,get不存在的key,只会返回None
- 删除
- info.pop("key") 删除key和这个key的value,返回删除的value
- info.popitem() 随机删除info内的元素
- del info["key"]
多级字典嵌套
- 经常用到
其他方法
- info.clear()
- info.values 以列表形式输出所有的value
- info.keys() 以列表形式输出所有的key
- info.items() 将整个字典转换成了1个元组
- info.update() 合并两个字典,key和value有的话就覆盖,没有的就创建
- info.setdefault(2,"new 2") 如果有2这个key,就去查找2的value,如果没有就创建一个key为2,value为"new 2" 的元素
- info.fromkeys([a,b,c]) 批量创建a,b,c key,值为None
和list比较,dict有以下几个特点:
- 查找和插入的速度极快,不会随着key的增加而变慢;
- 需要占用大量的内存,内存浪费多。
而list相反:
- 查找和插入的时间随着元素的增加而增加;
- 占用空间小,浪费内存很少。
所以,dict是用空间来换取时间的一种方法。
dict可以用在需要高速查找的很多地方,在Python代码中几乎无处不在,正确使用dict非常重要,需要牢记的第一条就是dict的key必须是不可变对象。
这是因为dict根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那dict内部就完全混乱了。这个通过key计算位置的算法称为哈希算法(Hash)。
要保证hash的正确性,作为key的对象就不能变。在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。而list是可变的,就不能作为key
循环
for k in info: # 取info所有的key
for k in info: # 常用的取key和value的方法
print(k,info[k])
for k,v in info.items() # 低效的循环方法,请忘记
print(k,v)
作业
集合
定义:有一个或多个确定的元素所构成的整体叫做集合.
特征:
1. 确定性(元素必须可hsah)
2. 互异性(去重)
3. 无序性(集合中的元素没有先后之分)
集合存在的意义就在于去重和关系运算
集合的创建:
- s = {} 创建一个字典
- s = {1} 创建一个集合
集合的关系运算
- 交集
- 取出两个集合中共有的元素
- s.intersection(s1)
- s & s1
- 差集
- s.difference(s1)
- s - s1
- 从s中把s1中有的元素都去掉,通俗来讲就是:你有的我通通不要.
- 并集
- s.union(s1)
- s | s1
- 合并s和s1成一个新的集合
- 对称差集
- s.symmetric_difference(s1)
- s ^ s1
- 合并s和s1,并且去掉两个共有的元素成一个新集合
- 包含关系
- 两个集合之间一般有三种关系,相交,包含,不相交.
- set.isdisjoint(s) 判断两个集合是不是不想交
- set.issuperset(s) 判断集合是不是包含其他集合,等同意 a<=b
- set.issubset(s) 判断集合是不是被其他集合包含,等同于a<=b
- 两个集合之间一般有三种关系,相交,包含,不相交.
字符编码
看这篇文章前,你应该已经知道了为什么有编码,以及编码的种类情况
- ASCII 占1个字节,只支持英文
- GB2312 占2个字节,支持6700+汉字
- GBK GB2312的升级版,支持21000+汉字
- Shift-JIS 日本字符
- ks_c_5601-1987 韩国编码
- TIS-620 泰国编码
由于每个国家都有自己的字符,所以其对应关系也涵盖了自己国家的字符,但是以上编码都存在局限性,即:仅涵盖本国字符,无其他国家字符的对应关系。应运而生出现了万国码,他涵盖了全球所有的文字和二进制的对应关系,
Unicode 2-4字节 已经收录136690个字符,并还在一直不断扩张中...
- Unicode 起到了2个作用:
直接支持全球所有语言,每个国家都可以不用再使用自己之前的旧编码了,用unicode就可以了。(就跟英语是全球统一语言一样)
unicode包含了跟全球所有国家编码的映射关系,为什么呢?后面再讲
Unicode解决了字符和二进制的对应关系,但是使用unicode表示一个字符,太浪费空间。例如:利用unicode表示“Python”需要12个字节才能表示,比原来ASCII表示增加了1倍。
由于计算机的内存比较大,并且字符串在内容中表示时也不会特别大,所以内容可以使用unicode来处理,但是存储和网络传输时一般数据都会非常多,那么增加1倍将是无法容忍的!!!
为了解决存储和网络传输的问题,出现了Unicode Transformation Format,学术名UTF,即:对unicode中的进行转换,以便于在存储和网络传输时可以节省空间!
- UTF-8: 使用1、2、3、4个字节表示所有字符;优先使用1个字符、无法满足则使增加一个字节,最多4个字节。英文占1个字节、欧洲语系占2个、东亚占3个,其它及特殊字符占4个
- UTF-16: 使用2、4个字节表示所有字符;优先使用2个字节,否则使用4个字节表示。
- UTF-32: 使用4个字节表示所有字符;
总结:UTF 是为unicode编码 设计 的一种 在存储 和传输时节省空间的编码方案。
Python3的执行过程
- 解释器找到代码文件,把代码字符串按文件头定义的编码加载到内存,转成unicode
- 把代码字符串按照语法规则进行解释,
- 所有的变量字符都会以unicode编码声明****
image**想在py3里看字符,必须得是unicode编码,其它编码一律按bytes格式展示。 **
最后再提示一下,Python只要出现各种编码问题,无非是哪里的编码设置出错了
常见编码错误的原因有:
- Python解释器的默认编码
- Python源文件文件编码
- Terminal使用的编码
- 操作系统的语言设置
- 掌握了编码之前的关系后,挨个排错就好啦
小结扩展
基本数据类型
|可变数据类型|不可变数据类型|
|:|:|:|
|list|数字类(bool,int,float,complex)|
|dict|str|
|set|tuple|
|.|frozenset|
扩展数据类型collectins
- namedtuple(): 生成可以使用名字来访问元素内容的tuple子类
- deque:双端队列,可以快速的从另外一侧追加和推出对象
- Counter:计数器,主要用来计数
- OrderedDict:有序字典
- defaultdict:带有默认值的字典
网友评论