部分内容复制自廖雪峰的个人博客,仅为个人笔记用途。
1 输入与输出
print()
# 基本输出print('hello, world')print('The quick brown fox', 'jumps over', 'the lazy dog')print(r'hello, world/n')#忽略转义字符# 多行输出print('''line1line2line3''')
对单引号和双引号不敏感,但允许"The first alphabet of apple is 'a'."形式的字符串。
input()
2 变量与基本数据类型
Python作为动态语言,相对于静态语言,允许变量本身类型不固定
a = 'ABC'
此时,Python解释器干了两件事情:
- 在内存中创建了一个
'ABC'的字符串; - 在内存中创建了一个名为
a的变量,并把它指向'ABC'。
整数/浮点数
允许 _ 作分隔(增强可读性)
允许科学计数法
运算中,有两种除法:/ /// 的结果是浮点数,// 的结果是整型
>>> 10 / 33.3333333333333335>>> 9 / 33.0>>> 10 // 33
字符串
布尔值
两种可能的值:True False
运算:and、or 、not
空值:None
3 字符串与字符编码
允许转义字符/允许忽略转义字符
# 允许通过r忽略转义字符:a=r'hello, world/n'# 允许直接简写s4 = r'''Hello,Lisa!'''此时s4的值为'Hello,\nLisa!'
格式化字符串
| 占位符 | 替换内容 |
|---|---|
| %d | 整数 |
| %f | 浮点数 |
| %s | 字符串 |
| %x | 十六进制整数 |
基本适用
>>> 'Hello, %s' % 'world''Hello, world'>>> 'Hi, %s, you have $%d.' % ('Michael', 1000000)'Hi, Michael, you have $1000000.'
万能的%s
%s可以把任何数据类型转换为字符串
>>> 'Age: %s. Gender: %s' % (25, True)'Age: 25. Gender: True'
format()方法
另一种格式化字符串的方法是使用字符串的format()方法,它会用传入的参数依次替换字符串内的占位符{0}、{1}……,不过这种方式写起来比%要麻烦得多:
>>> 'Hello, {0}, 成绩提升了 {1:.1f}%'.format('小明', 17.125)'Hello, 小明, 成绩提升了 17.1%'
f-string
最后一种格式化字符串的方法是使用以f开头的字符串,称之为f-string,它和普通字符串不同之处在于,字符串如果包含{xxx},就会以对应的变量替换:
>>> r = 2.5>>> s = 3.14 * r ** 2>>> print(f'The area of a circle with radius {r} is {s:.2f}')The area of a circle with radius 2.5 is 19.62
上述代码中,{r}被变量r的值替换,{s:.2f}被变量s的值替换,并且:后面的.2f指定了格式化参数(即保留两位小数),因此,{s:.2f}的替换结果是19.62。
len()函数
计算str包含多少个字符:
>>> len('ABC')3>>> len('中文')2
计算bytes的字节数:
>>> len(b'ABC')3>>> len(b'\xe4\xb8\xad\xe6\x96\x87')6>>> len('中文'.encode('utf-8'))6
文件头
#!/usr/bin/env python3# -*- coding: utf-8 -*-
第一行注释是为了告诉Linux/OS X系统,这是一个Python可执行程序,Windows系统会忽略这个注释;
第二行注释是为了告诉Python解释器,按照UTF-8编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。
字符编码相关
单个字符编码表示的转换:ord('A')==65chr(66)=='B'
允许十六进制表示字符串:'\u4e2d\u6587' 等价于 '中文'
encode()与decode()
str类型在内存中以Unicode表示。在存储or传输时则将变为以字节为单位的bytesbytes类型数据表示:
x = b'ABC'
以Unicode表示的str通过encode()方法可以编码为指定的bytes
>>> 'ABC'.encode('ascii')b'ABC'>>> '中文'.encode('utf-8')b'\xe4\xb8\xad\xe6\x96\x87'>>> '中文'.encode('ascii')Traceback (most recent call last):File "<stdin>", line 1, in <module>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()方法:
>>> b'ABC'.decode('ascii')'ABC'>>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')'中文'
如果bytes中包含无法解码的字节,decode()方法会报错:
>>> b'\xe4\xb8\xad\xff'.decode('utf-8')Traceback (most recent call last):...UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 3: invalid start byte
如果bytes中只有一小部分无效的字节,可以传入errors='ignore'忽略错误的字节:
>>> b'\xe4\xb8\xad\xff'.decode('utf-8', errors='ignore')'中'
4 数据类型:list/tuple
list: 可变有序表
>>> classmates = ['Michael', 'Bob', 'Tracy']>>> classmates['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: 不可变有序列表
classmates = ('Michael', 'Bob', 'Tracy')
访问上通list。但定义后不可再改变。
特别的,需要注意:
定义空tuple时:t = ()
定义有唯一元素1的tuple时:t = (1,),逗号用于消除歧义。
