- Python语法采用缩进形式,有以下几点需要注意:
- 注释以
#
开头; - 当语句以冒号
:
结尾时,缩进的语句视为代码块; - 始终坚持4个空格的缩进;
- 大小写敏感;
- 注释以
1. 数据类型和变量
1.1 数据类型
1.1.1 整数
- 在程序中的写法和数学中的写法一样,如
1
,100
,-8080
,0
,等等; - 用十六进制表示整数比较方便,十六进制用
0x
前缀和0-9,a-f表示,例如:0xff00
,0xa5b4c3d2
,等等;
1.1.2 浮点数
- 浮点数也就是小数,浮点数可以用数学写法,如
1.23
,3.14
,-9.01
,等等; - 对于很大或很小的浮点数,需用科学计数法表示,如
x
就是
1.23e9
或者12.3e8
,0.000012可以写成1.2e-5
,等等;
1.1.3 字符串
- 字符串是以单引号
'
或双引号"
括起来的任意文本,比如'abc'
,"xyz"
等等; - 如果
'
本身也是一个字符,那就可以用""
括起来,比如"I'm OK"
包含的字符是I
,'
,m
,空格,O
,K
这6个字符; - 用转义字符
\
来标识字符串内部包含的'
和"
;比如:
'I\'m \"OK\"!'
表示的内容就是:
I'm "OK"!
\n
表示换行,\t
表示制表符,\\
表示的就是字符\
;- Python还允许用
r''
表示''
内部的字符串默认不转义,如:
>>> print('\\\t\\')
\ \
>>> print(r'\\\t\\')
\\\t\\
- Python允许用
'''...'''
的格式表示多行内容,此处注意...
是提示符,不是代码的一部分;
>>> print('''line1
... line2
... line3''')
line1
line2
line3
1.1.4 布尔值
- 一个布尔值只有
True
、False
两种值,在Python中,可以直接用True
、False
表示布尔值(请注意大小写);
>>> True
True
>>> False
False
>>> 3 > 2
True
>>> 3 > 5
False
- 布尔值可以用
and
、or
和not
运算; - 布尔值经常用在条件判断中,比如:
if age >= 18:
print('adult')
else:
print('teenager')
1.1.5 空值
- 用
None
表示。None
不能理解为0
,因为0
是有意义的,而None
是一个特殊的空值;
1.2 变量
- 变量不仅可以是数字,还可以是任意数据类型;
- 变量名必须是大小写英文、数字和
_
的组合,且不能用数字开头; - 等号
=
是赋值语句,可以把任意数据类型赋值给变量;同时不要将赋值语句的等号等同于数学中的等号; - 同一个变量可以反复赋值,而且可以是不同类型的变量,这种变量本身类型不固定的语言称之为动态语言,与之对应的是静态语言。静态语言在定义变量时必须指定变量类型,如果赋值的时候类型不匹配,就会报错。例如Java是静态语言,赋值语句如下(// 表示注释):
int a = 123; // a是整数类型变量
a = "ABC"; // 错误:不能把字符串赋给整型变量
1.3 常量
- 在Python中,通常用全部的大写的变量名表示常量;但Python根本没有任何机制保证
PI
不会被改变,所以全部大写的变量名只是一个习惯的用法; - Python中的除法:
/
除法计算结果是浮点数;除法计算结果是浮点数,即使是两个整数恰好整除,如:
>>> 10 / 3
3.3333333333333335
>>> 9 / 3
3.0
//
地板除,如:
>>> 10 // 3
3
%
取余,如:
>>> 10 % 3
1
2. 字符串和编码
2.1 字符编码
-
8个比特(bit)作为一个字节(byte),一个字节能表示的最大整数就是255(二进制11111111=十进制255),最初只有127个字符被编码到计算机中,即
ASCII
编码; -
显然中文以及其他国家的语言,一个字节是不够的,故
Unicode
编码应用而生,最常用的是用两个字节表示一个字符(如果非常偏僻的字符,需要4个字节); -
虽然统一成Unicode编码,乱码问题消除了,但如果写的文本全都是英文的话,用Unicode编码比ASCII编码整整多了一倍存储空间,这就不划算了;
-
于是出现了可变长编码的
UTF-8
编码,UTF-8
编码把一个Unicode
字符根据不同的数字大小编码成1-6个字节,常用的 英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节; -
总结一下计算机系统通用的字符编码工作方式:
- 在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码;
- 用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件;
- 浏览网页的时候,服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器;
2.2 Python的字符串
- 在最新的 Python3.x 中,字符串是以Unicode编码的,支持多语言。比如:
>>> print('包含中文的str')
包含中文的str
- 对于单个字符的编码,
ord()
函数获取字符的整数表示,chr()
函数把编码转换为对应的字符:
>>> ord('A')
65
>>> ord('中')
20013
>>> chr(66)
'B'
>>> chr(25991)
'文'
- 如果知道字符的整数编码,还可以用十六进制这么写
str
:
>>> '\u4e2d\u6587'
'中文'
- Python的字符串类型为
str
,在内存中以Unicode表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需要把str
变为以字节为单位的bytes
; - Python对
bytes
类型的数据用带b
前缀的单引号或双引号表示:
x = b'ABC'
bytes
的每个字符都只占用一个字节。- 以Unicode表示的
str
通过encode()
方法可以编码为指定的bytes
,例如:
>>> 'ABC'.encode('ascii') # 纯英文的str可以用ASCII编码为bytes,内容是一样的;
b'ABC'
>>> '中文'.encode('utf-8') # 含有中文的str可以用UTF-8编码为bytes;
b'\xe4\xb8\xad\xe6\x96\x87' # 在bytes中,无法显示为ASCII字符的字节,用\x##显示;
>>> '中文'.encode('ascii') # 含有中文的str无法用ASCII编码,因为中文编码的范围超过了ASCII编码的范围,Python会报错;
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)
- 反过来,如果我们从网络或磁盘上读取了字节流,那么读到的数据就是
bytes
。要把bytes
变为str
,就需要用decode()
方法:
>>> b'ABC'.decode('ascii')
'ABC'
>>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
'中文'
>>> b'\xe4\xb8\xad\xff'.decode('utf-8') # 如果bytes中包含无法解码的字节,decode()方法会报错;
Traceback (most recent call last):
...
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 3: invalid start byte
>>> b'\xe4\xb8\xad\xff'.decode('utf-8', errors='ignore') # 如果bytes中只有一小部分无效的字节,可以传入errors='ignore'忽略错误的字节;
'中'
- 通过
len()
函数计算str
包含多少个字符:
>>> len('ABC')
3
>>> len('中文')
2
len()
函数计算的是str
的字符数,如果换成bytes
,len()
函数就计算字节数:
>>> len(b'ABC')
3
>>> len(b'\xe4\xb8\xad\xe6\x96\x87')
6
>>> len('中文'.encode('utf-8')) # 此处可见1个中文字符经过UTF-8编码后通常会占用3个字节,而1个英文字符只占用1个字节;
6
- 在操作字符串时,为了避免乱码问题,应始终坚持使用UTF-8编码对
str
和bytes
进行转换; - 当python的源代码中包含中文的时候,我们通常在文件开头写上这两行:
- 第一行注释是为了告诉Linux/OS X系统,这是一个Python可执行程序,Windows系统会忽略这个注释;
- 第二行注释是为了告诉Python解释器,按照UTF-8编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
- 声明了UTF-8编码并不意味着你的
.py
文件就是UTF-8编码的,必须并且要确保文本编辑器正在使用UTF-8 without BOM编码: