1. 语言特点
- 面对对象
- 解释性
- 免费开源
- 可移植性
- 胶水语言:可以调用C语言
- 丰富的库
- 代码规范性
- 支持函数式编程
- 动态类型:不会检查数据类型,在变量声明无需指定数据类型
…
2. 应用场景
- 桌面应用开发:wxPython、Tkinter...
- Web应用开发:Django、Flask、Tornado...
- 自动化运维
- 数据可视化:Matplotlib
- 网络爬虫
- 人工智能
- 大数据
- 游戏开发
…
3. 语法基础
3.1. 标识符——命名规则:
- 区分大小写
- 首字符不能是数字,可以是下划线或字母
- 关键字不能作为标识符
- 不能使用Python内置函数作为自身标识符
-
$
、#
不能构成标识符:room#
、$Name
属于非法标识符
3.2. 关键字
Python语言中有33个关键字,只有三个首字母大写:False
、True
和None
,其他全部小写。
3.3. 变量和常量
Python是动态类型语言,不能定义真正意义的常量。
3.4. 语句
- 一行代码表示一条语句,语句结束可以加分号,但没必要
- 多个变量赋值可以用链式结构:
a = b = c =10
,但没必要 -
if
、for
和while
内代码块不通过大括号界定,而是通过缩进if (a > b): print(a)
- 考虑到不同编辑器Tab键缩进程度存在区别,编程规范建议采用4个空格代替Tab键
3.5. 模块
-
import <模块名>
:使用模块元素时需加模块名为前缀 from <模块名> import <代码元素>
3.6. 包(package)命名空间
- 通过目录的方式组织众多的模块,用来管理和分类模块
- 包含
__init__.py
文件(可以为空文件),阐释该目录文件夹属性是包 - 同名的模块可以放在不同的包下,以避免名称冲突
4. Python编码规范
4.1. 命名规范
-
包名:全部小写字母,通过点连接分隔,不推荐使用下划线;包名应具有唯一性;推荐采用公司或组织域名的倒置,如
com.apple.quicktime.v2
。 -
模块名:全部小写字母,如果是多个单词构成,可以用下划线隔开,如
dummy_threading
。 -
类名:采用大驼峰法命名,如
SplitViewController
。 -
异常名:异常属于类,命名同类命名,但应该使用Error作为后缀,如
FileNotError
。 - 变量名:全部小写字母,如果是多个单词构成,可以用下划线隔开。如果变量应用于模块或函数内部,则变量名可以单下划线开头;如果变量类内部私有使用变量名可以双下划线开头。不要命名双下划线开头和结尾的变量,这是Python保留的。另外,避免使用小写L、大写O和大写I作为变量名。
-
函数名和方法名:同变量命名,如
balance_account
、_push_cm_exit
。 -
常量名:全部大写字母,多个单词构成通过下划线隔开,如
YEAR
和WEEK_OF_MONTH
。
4.2. 注释规范
-
文件注释:在每个文件开头添加注释,采用多行注释。通常包括:版权信息、文件名、所在模块、作者信息、历史版本信息、文件内容和作用等。(给能编辑源代码的人看的)
# # 版权所有 2015 ****有限公司 # 许可信息查看LICENSE.txt文件 # 描述: # 实现日期基本功能 # 历史版本: # 2015-7-22:创建 # 2015-8-20:添加socket库 # 2015-8-22:添加math库 #
-
文档注释:文档字符串,注释内容能够生成API帮助文档,可以使用Python官方提供的pydoc工具从Python源代码文件中提取这些信息,也可以生成HTML文件。所有公有的模块、函数、类和方法都应该进行文档注释。(生成API帮助文档给人看)
文档注释推荐使用一对三重双引号("""
)包裹起来,注意不推荐使用三重单引号('''
)。 - 代码注释:注释太多 = 代码质量差
-
TODO注释:有些地方不能确定,或未完成。
# TODO 有待解决
4.3. 导入规范
- 导入语总是放在文件顶部,位于模块注释和文档注释之后,模块全局变量和常量之前
-
每一个导入语句只能导入一个模块
推荐使用:
不推荐使用:import re import struct import binascii
但是import re, struct, binascii
from import
后面可以多个代码元素from codeop import CommandCompiler, compile_command
-
导入顺序:从通用到特殊,标准库→第三方库→自己模块,每一组之间有一个空行,且组中模块按照英文字典顺序进行排序
Pycharm快捷键:Ctrl+Alt+O,可自动识别排版# 标准库 import io import os import pkgutil import sys import time from html import unescape # 第三方库 from com.pkg1 import example # 自定义库
4.4. 代码排版:包括空行、空格、断行和缩进等
- Pycharm快捷键:Ctrl+Alt+L,可自动进行格式排版
- 空行:
①import
语句块前后保留两个空行;
②函数声明之前保留两个空行;
③类声明之前保留两个空行;
④方法声明之前保留一个空行;
⑤两个逻辑代码块之前应该保留一个空行。 - 空格:
①赋值符号=
前后各有一个空格;
②所有的二元运算符都应该使用空格与操作数分开;a = 10 c = 10
③一元运算符:算法运算符取反a += c + d
-
和运算符取反~
;
④括号内不要有空格,包括:b = 10 a = -b y = ~b
()
、[]
、{}
;
⑤不要在逗号、分号、冒号前面有空格,而是要在他们后面有一个空格,除非该符号已经是行尾。doque(cat[1],{dogs:2},[]) # 推荐用法 doque(cat[ 1 ],{ dogs:2 },[ ]) # 不推荐
⑥参数列表、索引或切片的左括号前不应有空格;# 推荐 if x == 88: print x, y x, y = y, x # 不推荐 if x == 88 : print x , y x , y = y , x
# 推荐 doque(1) dogs['key'] = list[index] # 不推荐 doque (1) dogs ['key'] = list [index]
- 缩进:4个空格常被作为缩进排版的一个级别。默认情况下一个制表符等于8个空格,且不同的IDE工具中一个制表符与空格对应的个数会有不同,所以尽量不要使用制表符缩进
- 断行:一行代码最多79个字符。对于文档注释和多行注释时一行最多72个字符,超过需断行(若包含URL地址则不受限制)
# 在逗号后面断开 bar = long_function_name(name1, name2, name3, name4) def long_function_name(var_one, var_two, var_three, var_four): # 在运算符前面断开 name1 = name2 * (name3 + name4 - name5) + 4 * name6 # 尽量不要使用续行符(\),当有符号(包括:大括号、中括号和小括号)则在括号中断开,这样可以不使用续行符。 def long_function_name(var_one, var_two, var_three, var_four): return var_one + var_two + var_three \ + var_four # 推荐加入括号换行 return (var_one + var_two + var_three + var_four)
5. 数据类型
在Python中所有的数据类型都是类,每一个变量都是类的“实例”。没有基本数据类型的概念,所以整数、浮点和字符串也都是类。
Python有6种标准数据类型:数字、字符串、列表、元祖、集合和字典。
5.1. 数字类型
包括整数类型、浮点类型、复数类型和布尔类型
- 整数类型:Python中整数类型为int,范围只受计算机硬件的限制。表示方式如下:
①二进制数:以0b或0B为前缀,注意0是阿拉伯数字
②八进制数:以0o或者0O为前缀,第一个字符是阿拉伯数字0,第二个字符是英文字母o或O
③十六进制数:以0x或0X为前缀,注意0是阿拉伯数字 - 浮点类型:Python中浮点类型为float
- 复数类型:Python中复数类型为complex,例如
1+2j
表示的是实部1
、虚部2
的复数 - 布尔类型:Python中布尔类型为bool,只有两个值:
True
和False
任何类型数据都可以通过bool()
函数转换为布尔值,“没有的”、“空的”值会转换为False
,反之转换为True
5.2. 数字类型相互转换
-
隐式类型转换:多个数字类型数据之间可以进行数学计算,由于参与进行计算的数字类型可能不同,此时会发生隐式类型转换。
a = 1 + True
-
显式类型转换:
int()
、float()
和bool()
函数int(19.4) float(5) bool(2)
5.3. 字符串类型
-
字符串表示方式:
①普通字符串:采用单引号'
或双引号"
包裹起来的字符串
②原始字符串:在普通字符串前加r
,字符串中的特殊字符不需要转义,按照字符串的本来“面目”呈现a = "Hello \n world" print(a) a = r"Hello \n world" print(a)
③长字符串:字符串中包含了换行缩进等排版字符,可以使用三重单引号
'''
或三重双引号"""
包裹起来a = '''Hello world''' print(a)
-
字符串格式化:
format()
方法,字符串格式化控制符,以及占位符{}
name = 'Mary' age = 18 money = 1234.5678 "{0}芳龄是{1:d}岁。".format(name, age) "{0}今天收入是{1:10.2f}元。".format(name, money)
-
字符串查找
str.find(sub[,start[,end]])
str.rfind(sub[,start[,end]])
source_str = "THere is a string accessing example." len(source_str) source_str.find('r') source_str.rfind('r') source_str[16]
字符串与数字相互转换
①字符串转换为数字
int()
和float()
②数字转换为字符串
str()
6. 运算符
6.1. 算数运算符
一元运算符:取反运算符
-
-
二元运算符:加减乘除、取余
%
、幂**
以及地板除法//
3 % 2 10 ** 2 3 // 2 # 比商小的最大整数,此处结果为1
6.2. 关系运算符
有6种:==
、!=
、>
、<
、>=
和<=
6.3. 逻辑运算符
有3种:与and
、或or
、非not
6.4. 位运算符
- 位反
~
:~x
:将x的值按位取反 - 位与
&
:x&y
:x与y位进行位与运算 - 位或
|
:x|y
:x与y位进行位或运算 - 位异或
^
:x^y
:x与y位进行位异或运算 - 有符号右移
>>
:x>>a
:x右移a位,高位采用符号位补位 - 左移
<<
:x<<a
:x左移a位,低位用0
补位
6.5. 赋值运算符
用于简写,主要包括:+=
、-=
、*=
、/=
、%=
、**=
、//=
、&=
、|=
、^=
、<<=
和>>=
6.6. 其他运算符
- 同一性测试运算符:
is
和is not
注意:==
与is
区别
==
:测试两个对象内容是否相等
is
:测试两个对象是否是同一个对象 - 成员测试运算符:
in
和not in
6.7. 运算符优先级
7. 控制语句
7.1. 分支语句
if
结构:
-
if
结构:if 条件: 语句组
-
if-else
结构:if 条件: 语句组1 else: 语句组2
-
elif
结构,类似switch
语句:if 条件1: 语句组1 elif 条件2: 语句组2 elif 条件3: 语句组3 ... elif 条件n: 语句组n else: 语句组n+1
-
三元运算符替代品——条件表达式
表达式1 if 条件 else 表达式2
7.2. 循环语句
while
和for
:
-
while
语句while 循环条件: 语句组 [else: 语句组]
-
for
语句for 迭代变量 in 序列: 语句组 [else: 语句组] for num in range(1, 10): print('{0} * {0} = {1}'.format(num, num * num))
7.3. 跳转语句
break
、continue
和return
:
-
break
语句:遇到break
跳出循环体for item in range(10): if item == 3: break print('Count is: {0}'.format(item)) # 打印 0、1、2
-
continue
语句:遇到continue
语句结束当次循环,continue
之后的语句不再执行,接着执行下次循环for item in range(10): if item == 3: continue print('Count is: {0}'.format(item)) # 打印 0-9,除了3
-
while
和for
中的else
语句:while
和for
正常循环结束时走的else
语句while i * i < 10: i += 1 print('{0} * {0} = {1}'.format(i, i * i)) else: print('While Over!') # 打印 0-9,除了3
7.4. 使用范围
范围在Python中类型是range
,表示一个整数序列,创建范围对象使用range()
函数,range()
函数语法如下:
range([start,]stop[,step])
注意:start
≤整数序列取值<stop
,步长step
可以为负数,可以创建递减序列