一、代码规范
1.项目文件管理层面
2.命名
- 文件名:
- 类名:
- 函数名:
- 变量名:
3.格式排版
python中有一个小彩蛋,可以输入import this来查看~
- 缩进:python中以缩进来体现代码块的逻辑关系,一般以四个空格为基本缩进单位,某些编辑器Tab键可输出四个空格。
- 模块导入:每个import只导入一个模块,最好按标准库,扩展库,自定义库分类依次导入。
- 类和类外的函数前后增加两个空行,类内函数前后增加一个空行。
- 括号与其内部相邻字符之间不要空格。例如:if ( a==b)是不合规范的。
- if/for/while/switch/do等保留字与括号之间需要加空格。
- 逗号后增加空格。
- 任何的二目、三目运算符的左右两边都需加一个空格。例如 =,&&,加减乘除等。
- 尽量不要写过长的语句,可以拆分以增加可读性。若必须写长语句,要注意每一行的字符数不要太多,换行(续行符“\”)要遵循以下原则:1) 第二行相对第一行缩进四个空格;2) 运算符与下文一起换行;3) 方法调用的"."与下文一起换行;4)方法调用时,多个参数,需要换行时,在逗号后进行;5)在括号前不要换行。
- 注意代码重用
4.注释
- 项目注释:在项目中添加README项目说明文件。其内容可包括:基本功能;所需环境;运行方法;目录结构说明;常见问题说明;联系方式等
- 文档注释
- 类注释
- 函数注释
- 单行语句注释:#
- 多行语句注释:#(pycharm中可选中代码使用ctrl+/注释);’’‘context’’’;""“context”""。
5.代码执行速度优化
- 内置对象运行速度最快,标准库次之,用C或Fortran编写的扩展库速度也比较快,而纯python的扩展库往往速度慢一些。所以,在开发项目时。应优先使用python内置对象,其次考虑使用python标准库提供的对象,最后考虑使用第三方扩展库。
- 根据运算特点选择最合适的数据类型来提高程序的运行效率。例如,如果定义一些数据只是用来频繁遍历。最好优先考虑元组或集合;如果需要频繁的测试一个元素是否存在于一个序列并且不关心其位置,尽量采用字典或集合;列表和元组的操作时间复杂度是线性的,而字典和集合是常数级的。
- 充分利用关系运算符和逻辑运算符惰性求值的特点,合理组织条件表达式中多个条件的先后顺序,减少不必要的计算。
- 充分利用生成器对象或类似迭代对象的惰性计算特点,最小化计算机要做的工作。尽量避免将其转换为列表、元组等类型,这样可以减少对内存的占用,降低空间复杂度。
- 减少内循环中的无关计算,尽量往外层提取。
6.代码书写思路
- 由简单到复杂:验证一步一步走;多打印中间结果
- 先局部后整体:没思路时先细分
- 先粗糙后精细:变量更名;语句合并;边界处理
参考资料:
- https://www.bilibili.com/video/BV1h4411F7Kr?from=search&seid=15737321854235506787
- https://blog.youkuaiyun.com/u013159381/article/details/102826677
- https://www.bilibili.com/video/BV1zv411j7QX?p=5&spm_id_from=pageDriver
二、基础知识
- 变量可以不用声明就赋值,这一点不同于其他常见语言。变量名名不能以数字开头。区分大小写
- .缩进区分代码块,使得代码精简
- 不用;代表语句的结束
- ‘字符串’+‘字符串’可以进行字符串的拼接,单双引号均可。\为转义符号
- 条件分支:①if 条件: else : ② if 条件: elif 条件 : … else:
- 条件表达式:a = x if 条件 y 如果条件为真把x赋给a,否则把y赋给a
- while循环: while 条件:循环体
- for循环:for 目标 in 表达式:循环体 目标可以为each
- 数据类型:整形,浮点型,布尔型。type(a)返回类型,isinstance(a,str)返回bool型。python的数据类型更像是贴在变量上的标签
- 算数操作符:+ - * / % **(幂运算) //(除后向下取整)
- break 终止并跳出循环 continue终止本轮循环并开始下一轮循环
- 列表list: [ , , ] 可以存在混合列表。操作符:比较,逻辑,连接,重复,成员关系
向列表添加元素 | a.append(),a.extend([ ]),a.insert(位置, ). |
---|---|
从列表中删除元素 | a.remove(),del a[index],a.pop(index)出栈,默认最后一个 |
列表切片 | a[start:stop] |
- 元组:不如列表灵活,不能随意改变,若想添加可采用先拆后和方式。(,,,)逗号是关键
- 创建函数: def Function(): return代表返回值 *params收集参数 函数内部还可以内嵌函数
- 注意区分局部变量和全局变量(global声明)
- 字典:看作映射 键(key)->值(value) dict1={’ ‘:’ ‘,…}或dict(***=’ ',)
- 集合:集合内的元素是唯一的,无序的
- 文件对象方法:
|f.close()| 关闭文件 |
open(file,mode=’’) | 打开文件 |
---|---|
f.read(size=-1) | 从文件中读取size个字符,未给定或给定负值时读取所有 |
f.readline() | 以写入模式打开,如果文件存在,则在末尾追加写入 |
f.write(str) | 将字符串str写入文件 |
f.tell() | 返回当前在文件中的位置 |
- 模块是一个包含所有你定义的函数和变量的文件,其后缀名时.py。模块可以被别的程序引入,以使用该模块中的函数等功能。导入模块①import 模块名 ②from 模块名 import 函数名
- OS模块:有了OS模块我们不需要关心什么操作系统下使用了什么模块,OS模块会帮你选择正确的模块并调用。其具体函数用到时再查。另外还有个os.path模块
- 异常:
AssertionError | 断言语句失败 |
---|---|
AttributeError | 尝试访问未知的对象属性 |
ImportError | 导入模块失败 |
IndexError | 索引超出序列的范围 |
NameError | 尝试访问不存在的变量 |
OSError | 操作系统产生的异常 |
TypeError | 不同类型间的无效操作 |
- 异常处理:try-except语句
try:
检测范围
except Exception[as reason]:
出现异常(Exception)后的处理代码
Exception代表具体的异常名称,如果直接except:则可任意异常触发(不推荐)
try-finally语句
try:
检测范围
except Exception[as reason]:
出现异常(Exception)后的处理代码
finally:
无论如何都会被执行的代码
- else使用灵活,还可配合循环,异常处理
- with语句
- 面向对象的概念:首先要明确类和对象的概念,简单来说类是抽象的概念,对象就是类的实例化。 有了类的存在就可以实例化出很多对象。注意区分类、类对象、实例化对象
- 类名以大写字母为开头,函数名以小写字母为开头。c = Cars()实现对象的创建
- python无处不对象,OO称为面向对象,有三个特点:封装(使得信息更加安全)、继承(继承父类的方法和属性)、多态(不同类创建的对象对同一方法的响应不同)。
- 继承
class DerivedClassName(BaseClassName):...
BaseClassName称为父类或基类。子类会继承父类的方法和属性,如果出现同名则会覆盖。python支持多重继承,即可以继承自多个父类。 - 组合:把类的实例化放到新类里面,省去了没有必要的继承
- 不要试图在一个类里面定义所有的属性和方法应学会利用继承和组合机制来扩展
- 属性名跟方法名相同,属性会覆盖方法。属性名用名词,方法名用动词
- self:相当于C++或C#的this指针
- __ init__(self):默认构造函数 def __ init__(self),如果添加了其他参数,要在对象实例化时传入。返回值为None
- 在Python中定义私有变量只需要在变量名或函数名前加上“__”两个下划线。可以通过封装Get,Set方法实现访问。其实这是python内部改变了变量名还是可以通过
对象._类名__属性
进行访问,可以看作是伪私有 - 内部方法:_开始
- 绑定:python严格要求方法需要有实例才能被调用,这种限制其实就是python所谓的绑定概念
- 迭代器:iter() next()
- 生成器 yield 可以看作特殊的迭代器
if __name__ == '__main__
在本模块里__name__为__main__,导入到其他模块__name__为模块名称,设置后了之后这段代码只有在本程序运行才会执行,导入到其他模块则不会被执行- 搜索路径:作用是在这些路径下寻找模块 ,
import sys sys.path
可以查看现有搜索路径,可以通过sys.path.append("路径")
添加搜索路径 - 包(package):步骤:①创建一个文件夹存放相关模块,文件夹的名字即包的名字②在文件夹中创建一个__init__.py的模块文件,内容可以为空③将相关的模块放入文件夹中。导入时用package.model即可
常用函数
- print():打印输出
print("第一个变量%d,第二个变量%d" %(variable1,variable2))
。python3.6新特性,print(f’’)前面加个f表示格式化字符串,里面用{}括起来的内容可以作为变量输出 - randint():属于random模块,返回一个随机整数
- assert():断言,后面条件为假时抛出异常,用作检查点
- range(start,stop,step):左闭右开
- 匿名函数lambda:sum = lambda arg1, arg2: arg1 + arg2 :前为参数,后为返回值。作用是简化代码
- set():创建一个无序不重复的元素集