部分内容复制自廖雪峰的个人博客,仅为个人笔记用途。

1 输入与输出

print()

  1. # 基本输出
  2. print('hello, world')
  3. print('The quick brown fox', 'jumps over', 'the lazy dog')
  4. print(r'hello, world/n')#忽略转义字符
  5. # 多行输出
  6. print('''line1
  7. line2
  8. line3''')

对单引号和双引号不敏感,但允许"The first alphabet of apple is 'a'."形式的字符串。

input()

输出

2 变量与基本数据类型

Python作为动态语言,相对于静态语言,允许变量本身类型不固定

  1. a = 'ABC'

此时,Python解释器干了两件事情:

  1. 在内存中创建了一个'ABC'的字符串;
  2. 在内存中创建了一个名为a的变量,并把它指向'ABC'

仅为指向,是动态的。

整数/浮点数

允许 _ 作分隔(增强可读性)
允许科学计数法
运算中,有两种除法:/ //
/ 的结果是浮点数,// 的结果是整型

  1. >>> 10 / 3
  2. 3.3333333333333335
  3. >>> 9 / 3
  4. 3.0
  5. >>> 10 // 3
  6. 3

字符串

布尔值

两种可能的值:True False
运算:andornot

空值:None

3 字符串与字符编码

允许转义字符/允许忽略转义字符

  1. # 允许通过r忽略转义字符:
  2. a=r'hello, world/n'
  3. # 允许直接简写
  4. s4 = r'''Hello,
  5. Lisa!'''
  6. 此时s4的值为'Hello,\nLisa!'

对于占位符前标%,其转义字符为%%

格式化字符串

占位符 替换内容
%d 整数
%f 浮点数
%s 字符串
%x 十六进制整数

基本适用

  1. >>> 'Hello, %s' % 'world'
  2. 'Hello, world'
  3. >>> 'Hi, %s, you have $%d.' % ('Michael', 1000000)
  4. 'Hi, Michael, you have $1000000.'

万能的%s

%s可以把任何数据类型转换为字符串

  1. >>> 'Age: %s. Gender: %s' % (25, True)
  2. 'Age: 25. Gender: True'

format()方法

另一种格式化字符串的方法是使用字符串的format()方法,它会用传入的参数依次替换字符串内的占位符{0}{1}……,不过这种方式写起来比%要麻烦得多:

  1. >>> 'Hello, {0}, 成绩提升了 {1:.1f}%'.format('小明', 17.125)
  2. 'Hello, 小明, 成绩提升了 17.1%'

f-string

最后一种格式化字符串的方法是使用以f开头的字符串,称之为f-string,它和普通字符串不同之处在于,字符串如果包含{xxx},就会以对应的变量替换:

  1. >>> r = 2.5
  2. >>> s = 3.14 * r ** 2
  3. >>> print(f'The area of a circle with radius {r} is {s:.2f}')
  4. The area of a circle with radius 2.5 is 19.62

上述代码中,{r}被变量r的值替换,{s:.2f}被变量s的值替换,并且:后面的.2f指定了格式化参数(即保留两位小数),因此,{s:.2f}的替换结果是19.62

len()函数

计算str包含多少个字符:

  1. >>> len('ABC')
  2. 3
  3. >>> len('中文')
  4. 2

计算bytes的字节数:

  1. >>> len(b'ABC')
  2. 3
  3. >>> len(b'\xe4\xb8\xad\xe6\x96\x87')
  4. 6
  5. >>> len('中文'.encode('utf-8'))
  6. 6

文件头

  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-

第一行注释是为了告诉Linux/OS X系统,这是一个Python可执行程序,Windows系统会忽略这个注释;
第二行注释是为了告诉Python解释器,按照UTF-8编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。

字符编码相关

单个字符编码表示的转换:
ord('A')==65
chr(66)=='B'
允许十六进制表示字符串:'\u4e2d\u6587' 等价于 '中文'

encode()decode()

str类型在内存中以Unicode表示。在存储or传输时则将变为以字节为单位的bytes
bytes类型数据表示:

  1. x = b'ABC'

以Unicode表示的str通过encode()方法可以编码为指定的bytes

  1. >>> 'ABC'.encode('ascii')
  2. b'ABC'
  3. >>> '中文'.encode('utf-8')
  4. b'\xe4\xb8\xad\xe6\x96\x87'
  5. >>> '中文'.encode('ascii')
  6. Traceback (most recent call last):
  7. File "<stdin>", line 1, in <module>
  8. UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

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

反过来,如果我们从网络或磁盘上读取了字节流,那么读到的数据就是bytes
要把bytes变为str,就需要用decode()方法:

  1. >>> b'ABC'.decode('ascii')
  2. 'ABC'
  3. >>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
  4. '中文'

如果bytes中包含无法解码的字节,decode()方法会报错:

  1. >>> b'\xe4\xb8\xad\xff'.decode('utf-8')
  2. Traceback (most recent call last):
  3. ...
  4. UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 3: invalid start byte

如果bytes中只有一小部分无效的字节,可以传入errors='ignore'忽略错误的字节:

  1. >>> b'\xe4\xb8\xad\xff'.decode('utf-8', errors='ignore')
  2. '中'

4 数据类型:list/tuple

list: 可变有序表

  1. >>> classmates = ['Michael', 'Bob', 'Tracy']
  2. >>> classmates
  3. ['Michael', 'Bob', 'Tracy']

获取元素个数与访问列表

len()函数用于获取list元素个数。
可以用索引访问list,索引从0开始,如:classmates[0]
末位索引为len(classmates) - 1
特别的,取最后一个元素时可以用-1作为索引:classmates[-1]
-2则为倒数第二个。以此类推。

基本操作

追加元素到末尾**append()**classmates.append('Adam')

把元素插入到指定位置(索引为1)**insert()**classmates.insert(1, 'Jack')
此时list由['Michael', 'Bob', 'Tracy', 'Adam']变为['Michael', 'Jack', 'Bob', 'Tracy', 'Adam']

删除末尾元素pop()**:classmates.pop()

删除指定位置的元素pop(i)(i是索引位置):classmates.pop(1)

替换元素操作直接赋值即可。

list内元素的数据类型可以不同,甚至可以为另一个list,通过类多维数组的方法进行调用。空list的长度为0。

tuple: 不可变有序列表

  1. classmates = ('Michael', 'Bob', 'Tracy')

访问上通list。但定义后不可再改变。
特别的,需要注意:

定义空tuple时:t = ()
定义有唯一元素1的tuple时:t = (1,),逗号用于消除歧义。