Python易忘易混梳理

关键词:Python

有时候容易忘记的东西,记于此。

这一节,我们讨论一下Python的易忘易混知识。并进行梳理。

数据类型与变量

1
2
3
4
5
6
#转义字符
\n #换行
\t #制表符
r'' #使用r表示引号内的内容不转义
'''内容''' #使用三个引号,表示多行字符串,可以换行操作
PI = 3.1415 #通常用全部大写的变量名表示常量
1
2
3
10/3 #除法,返回浮点数,精确的小数 3.33333
10//3 #取整数,返回商 3
10%3 #取余数,返回余数 1

字符串与编码

在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码

由于Python的字符串类型是str,在内存中以Unicode表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes

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

1
2
x = b'ABC'
#此时的x已经不是一个字符串了,而是bytes格式的

要注意区分'ABC'b'ABC',前者是str,后者虽然内容显示得和前者一样,但bytes的每个字符都只占用一个字节。

牢记,str是在内存中使用的,bytes是在磁盘或者网络传输中使用的,因此,需要相互转换。

纯英文的str可以用ASCII编码为bytes,内容是一样的,含有中文的str可以用UTF-8编码为bytes。含有中文的str无法用ASCII编码,因为中文编码的范围超过了ASCII编码的范围,Python会报错。

强烈建议,所有的编码和解码都是用UTF-8

1
2
3
#内存中的数据要编码为utf-8保存到磁盘或者网络传输,如下
'中文'.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'

反过来,如果我们从网络或磁盘上读取了字节流,那么读到的数据一般是utf-8编码的bytes。要把bytes变为内存Unicode编码的str形式,就需要用decode()方法

1
2
3
#网络传输的或者磁盘中的bytes格式文件,使用decode解码(按照他现有编码格式)为可以被内存识别的Unicode编码
b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
'中文'

循环

1
2
break #作用是提前结束循环
continue #结束这一次(i = i + 1中的一次)循环,开始下一次循环

函数的参数: args *kw

返回值可以是多个

1
2
3
4
5
6
7
8
9
10
#函数的返回值可以是多个, return x,y 但是其实就是返回了一个数组
import math
def move(x, y, step, angle=0):
nx = x + step * math.cos(angle)
ny = y - step * math.sin(angle)
return nx, ny
#使用多个变量去接收这个函数的返回值
x, y = move(100, 100, 60, math.pi / 6)

默认参数的设置:降低调用函数的难度

1
2
3
4
5
6
7
8
9
10
def power(x,n=2):
print(x**n)
默认情况下,如果不输入第二个参数,就默认第二个按等于2
------
power(5)
25
------
power(5,3)
125

可变参数:使用*,传入的是一个任何长度的数组

顾名思义,可变参数就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个。

1
2
3
4
5
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum

定义可变参数和定义一个list或tuple参数相比,仅仅在参数前面加了一个*号。在函数内部,参数numbers接收到的是一个tuple,因此,函数代码完全不变。但是,调用该函数时,可以传入任意个参数,包括0个参数

1
2
3
4
5
calc(1,2)
5
------
calc()
0
1
2
3
num = [1,2,3]
#要传入现成的list或者tuple时,要加上*一起传
calc(*num)

关键字参数

可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。

1
2
3
4
5
6
7
8
9
10
11
12
13
def person(name, age, **kw):
if 'city' in kw:
# 有city参数
pass
if 'job' in kw:
# 有job参数
pass
print('name:', name, 'age:', age, 'other:', kw)
------
extra = {'city': 'Beijing', 'job': 'Engineer'}
person('Jack', 24, **extra)
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}

递归函数

在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。

1
2
3
4
5
def fact(n):
if n==1:
return 1
return n * fact(n - 1)
#注意,一定要有一个结束递归的东西