Python基础
Python基础
主要内容
主要的学习内容包含有字符编码、常用的容器(list、tuple、set、dict)、条件判断&循环三部分内容
1.字符编码
由于计算机最早由美国人发明,因此字符编码最早是ASCII码,最早只有$127$个字符被编码到计算机中。然而后来各个国家都分别使用计算机,因此每个国家都分别制定相应的标准满足各国的字符,例如中国制定的GB2312,用来将中文编码进去,而一个中文最少需要两个字节。这样的结果是各个国家都有复杂的标准,在多语言混合的文本中,显示出来会有乱码。
因此为了解决该问题出现了Unicode字符集,该字符集将所有的语言编码到一套编码中,Unicode的主要思想则是将字符编码为两个字符,例如:

然而,该编码存在的问题是会浪费一定的存储空间,例如原有的ASCII只需要一个字节,然而Unicode编码会导致多浪费一个字节,为了解决这种问题,产生了UTF-8编码,UTF-8编码是一种“可变长编码”,该编码可以根据不同的数字大小编写为$1\sim6$个字节。该编码虽然减少了内存的占用,并且兼容ASCII码,但出现的问题是操作起来比较复杂,操作起来耗时较多。最终三种编码的关系如下图:
.assets/image-20221126211330149.png)
因此在使用过程中,需要存储到硬盘或者传输时,采用的是UTF-8编码,而在进行内存中编辑时采用的Unicode编码。
1 | 注:之所有在内存中使用Unicode编码而不是使用UTF-8编码是因为,Unicode编码的长度统一方便,内存操作便捷。 |
下面举例几个使用场景:
1)记事本编辑文本。记事本在操作时为了操作的速度,采用字符长度统一的Unicode编码,但是在保存到硬盘中时将其转换为UTF-8编码。

2)浏览网页。在服务器端存储Unicode编码,而在传输时采用UTF-8编码,为了传输快速。

2.Python中的字符编码
Python3中字符编码是以Unicode编码的。Python中提供了如下字符编码函数:
ord(char)用于获取字符的整数表示。chr(int)用于将编码转换为对应的字符。

Python中的字符串时str,在内存中是以Unicode表示的,一个字符对应若干个字节,因此如果在网络上传输或者保存在磁盘上时,需要将str变成以字节为单位的bytes。
Python中对bytes类型的数据用b前缀的单引号或者双引号表示:
1 | x=b'abc'; |
str.encode('utf-8/ascii');表示将以Unicode编码的字符串编码为bytes。bytes.decode('acsii')表示将bytes转换为str。
.assets/image-20221127112256558.png)
len(str)用于判断字符串中存在几个字符。len(b'str')用于计算字符串占用几个字节。

1 | # 注:为了避免乱码问题应该始终坚持UTF-8编码对str和bytes进行转换。此外再含有中文的文件中应该制定保存为UTF-8编码。当Python解释器读取文件时应该在开头加入如下注释。 |
3.格式化字符串
方式一:采用%运算符格式化。在字符串内部,%s表示用字符串替换,%d表示用整数替换,有几个%?占位符,后面跟几个变量或者值,顺序要对应好。如果只有一个%s,则括号可以省略。常用的占位符如下所示:


案例:

方式二:format格式化。使用字符串中的format方法,它会用传入的参数依次替换字符串中的占位符{0}、{1}、{2}....。
案例:

方式三:采用f-string。使用以f为开头的字符串,成为f-string,如果字符串中存在有{变量},则会以变量替换该位置。
案例:

3.常用容器
主要记录list、tuple、dict和set的使用方法。
1.list
list是Python内置的一种数据类型,是一个有序的集合,可以随时添加和删除其中的元素。采用一个[元素1、元素2、...]代表一个list。其底层实现是通过双向链表结构实现的。列表是无序可重复的。
- 通过
变量名称 = []的方式定义一个链表。 len(listname)可以获得list元素的个数。listname[index]获取list中的某个元素。index为$-1$或者-index表示倒数第几个元素。append(element)向list的末尾添加一个元素。insert(pos,element)向list的指定位置添加一个元素。pop()删除末尾元素。pop(pos)删除索引位置为pos的元素。sort()排序。reverse()反转列表。
注1:列表中的元素类型可以不相同。该元素也可以是另外一个列表。
.assets/image-20221127163232384.png)
2.tuple
tuple也是一种有序列表。和list的主要区别在于tuple一旦初始化不能修改。但是如果一个可变数据类型存储在tuple中只有该元素可以修改。采用(元素1、元素2、...)代表一个tuple。
- 通过
变量名称=(元素1,元素2,...)来定义一个tuple。 - 如果定义只包含一个元素的
tuple只能通过t=(1,)元素加上逗号的方式进行定义,否则会定义为一个变量。 len(tuple)可以用来获取tuple的元素数量。del tuplename用来删除整个tuple。
3.dict
python中的dict和别的语言中的map类似,使用键-值(key-value)存储,查找速度高。底层实现是通过hashtable实现的。一个key只能对应一个value,所以多次对一个key放入value时,后面的值会将前面的值覆盖掉。
- 通过
dictname = {key1:value1, key2:value2, key3:value3}; - 还可以通过
dictname[key4]=value4来新添加一个元素。 - 通过
key in dictname或者get()方法来判断是否存在某个key,可以返回None也可以指定自己的value。

4.set
set和dict类似,也是一组key的集合,但是不存储value。由于key不可以重复,所以set中不存在重复的key。创建一个set时需要将一个list作为输入参数。
- 通过
setname = set([1,2,3])来创建一个set,当list的元素重复时,set也会自动去重。 setname.add(key)来向set中加入一个元素。setname.remove(key)从set中去除一个元素。- 对于
set也可以看成数学意义上的无序和无重复元素的集合。因此对两个set进行&和|进行数学上的交集、并集操作。

3.不可变对象修改的原理
python中str是一个不可变对象,其中包含有replace(schar,dchar)方法,用于对schar进行替换为dchar。如下所示:

在上述的案例中,ss是一个变量,指向abcd这个对象,当要进行修改其中的字符时,其实是按照新的规则新生成一个同样大小的字符串。
4.条件判断&循环
1)条件判断
1 | # 仅包含有if语句 |
2)循环结构
Python中支持for in循环和while循环
1 | # for .. in 循环 |
range(num)可以生成$0 \sim num-1$的的整数序列,可以通过list()转换为list。
1 | #while循环 |
