Python基础

主要内容

主要的学习内容包含有字符编码、常用的容器(listtuplesetdict)、条件判断&循环三部分内容

1.字符编码

由于计算机最早由美国人发明,因此字符编码最早是ASCII码,最早只有$127$个字符被编码到计算机中。然而后来各个国家都分别使用计算机,因此每个国家都分别制定相应的标准满足各国的字符,例如中国制定的GB2312,用来将中文编码进去,而一个中文最少需要两个字节。这样的结果是各个国家都有复杂的标准,在多语言混合的文本中,显示出来会有乱码。

因此为了解决该问题出现了Unicode字符集,该字符集将所有的语言编码到一套编码中,Unicode的主要思想则是将字符编码为两个字符,例如:

image-20221126210643803

然而,该编码存在的问题是会浪费一定的存储空间,例如原有的ASCII只需要一个字节,然而Unicode编码会导致多浪费一个字节,为了解决这种问题,产生了UTF-8编码,UTF-8编码是一种“可变长编码”,该编码可以根据不同的数字大小编写为$1\sim6$个字节。该编码虽然减少了内存的占用,并且兼容ASCII码,但出现的问题是操作起来比较复杂,操作起来耗时较多。最终三种编码的关系如下图:

image-20221126211330149

因此在使用过程中,需要存储到硬盘或者传输时,采用的是UTF-8编码,而在进行内存中编辑时采用的Unicode编码。

1
注:之所有在内存中使用Unicode编码而不是使用UTF-8编码是因为,Unicode编码的长度统一方便,内存操作便捷。

下面举例几个使用场景:

1)记事本编辑文本。记事本在操作时为了操作的速度,采用字符长度统一的Unicode编码,但是在保存到硬盘中时将其转换为UTF-8编码。

image-20221126211725833

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

image-20221126212046939

2.Python中的字符编码

Python3中字符编码是以Unicode编码的。Python中提供了如下字符编码函数:

  • ord(char)用于获取字符的整数表示。
  • chr(int)用于将编码转换为对应的字符。

image-20221126213014043

Python中的字符串时str,在内存中是以Unicode表示的,一个字符对应若干个字节,因此如果在网络上传输或者保存在磁盘上时,需要将str变成以字节为单位的bytes

Python中对bytes类型的数据用b前缀的单引号或者双引号表示:

1
x=b'abc';
  • str.encode('utf-8/ascii');表示将以Unicode编码的字符串编码为bytes
  • bytes.decode('acsii')表示将bytes转换为str

image-20221127112256558

  • len(str)用于判断字符串中存在几个字符。
  • len(b'str')用于计算字符串占用几个字节。

image-20221127112734728

1
2
3
4
5
6
7
8
# 注:为了避免乱码问题应该始终坚持UTF-8编码对str和bytes进行转换。此外再含有中文的文件中应该制定保存为UTF-8编码。当Python解释器读取文件时应该在开头加入如下注释。

#一般在文件写如下开头
#!/usr/bin/env python3
#-*- coding: utf-8 -*-

#注释1:告诉Linux/OS X系统,这是一个Python可执行程序,Windows下会忽略该注释。
#注释2:告诉Python解释器,按照UTF-8编码,否则可能会出现乱码。

3.格式化字符串

方式一:采用%运算符格式化。在字符串内部,%s表示用字符串替换,%d表示用整数替换,有几个%?占位符,后面跟几个变量或者值,顺序要对应好。如果只有一个%s,则括号可以省略。常用的占位符如下所示:

image-20221127155629299

案例:

image-20221127135734494

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

案例:

image-20221127135845893

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

案例:

image-20221127140032496

3.常用容器

主要记录listtupledictset的使用方法。

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:列表中的元素类型可以不相同。该元素也可以是另外一个列表。

image-20221127163232384

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

image-20221127165911210

4.set

setdict类似,也是一组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进行&|进行数学上的交集、并集操作。

image-20221127172631929

3.不可变对象修改的原理

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

image-20221127173933004

在上述的案例中,ss是一个变量,指向abcd这个对象,当要进行修改其中的字符时,其实是按照新的规则新生成一个同样大小的字符串。

4.条件判断&循环

1)条件判断

1
2
3
4
5
6
7
8
9
10
11
12
 # 仅包含有if语句
if 条件:
执行语句

# ifelse结构
if 条件1:
执行语句1
elif 条件2:
执行语句2
else:
执行语句3

2)循环结构

Python中支持for in循环和while循环

1
2
3
4
# for .. in 循环
for 变量名 in 容器:
执行语句

  • range(num)可以生成$0 \sim num-1$的的整数序列,可以通过list()转换为list
1
2
3
4
5
#while循环
while 条件:
执行语句;

# break可以用于跳出循环。