地图
地图

My Python Note

1
2
3
4
5
6
Python版本:
Python 3.7.2
[Clang 10.0.0 (clang-1000.11.45.5)] on darwin

测试平台:
macOS 10.14.2


程序 > 模块 > 语句 > 表达式 > 对象


数据类型

对象类型
关键字
实例
分类
是否可变
备注
数字 int
float

Decimal()
Fraction()
-1, 999
3.14, 4.3e-10
数值 不可变
字符串 str
bytes
bytearray
' ', " " 序列
不可变
列表 list [] 序列
字典 dict {key:value} 映射
元组 tuple (a,) 序列
不可变
集合 set {'a', 'b', 'c'} 集合 不可变对象的无序集合,
就像一个无值的字典的键。
空集只能用set()创建,因为{}是空字典。
文件 open open('1.txt', 'w') 扩展 N/A 无论文件包含的数据是什么类型,
文件的内容总是字符串
其他核心类型 bool
None
类型
True, False 每个对象,非真即假,
0None空对象 ' ', [], {}为假。
对象的类型本身,也属于type类型的对象。
  • 一个变量在赋值时创建。
  • 变量没有类型,对象才有类型。
  • 对变量赋值,变量成为对象的一个引用。
  • 赋值操作总是存储对象的引用。
  • 运行赋值语句b = a之后,b和a共享一个引用,改变a之后,b不会改变,仍然引用原始的对象。
  • 给变量赋新值,并不是替换原始的对象,而已让这个变量去引用另一个对象。
  • 不可变性指,对象创建之后,不能原位置改变。
  • 不要期待在原位置修改对象的函数会返回结果,实际上会被赋值为None。


语句和语法

语句
功能
语句
功能
赋值 创建引用 yield 生成器函数
调用 运行函数 global 命名空间
print() 打印对象 nonlocal 命名空间
if/elif/else 选择 import 导入模块
while/else 通用循环 from 获取属性
for/else 迭代 class 构建对象
pass 占位符 try/except/finally 捕捉异常
break 循环退出 raise 触发异常
continue 循环继续 assert 调试检查
def 函数与方法 with/as 上下文管理器
return 函数结果 del 删除引用
  • 复合语句首行以冒号:结尾。
  • 缩进的结束就是代码块的结束。
  • 行终止就是语句终止。
  • 括号和分号是可选的。
  • 单下划线开头的(_X)变量不会被from module import *导入。
  • 双下划线包裹的(__X__)是系统定义的名称,对解释器有特殊意义。
  • 双下划线开头的(__X)是外围类的本地变量。


选择语句

  1. if语句
1
2
3
4
5
6
if test1:
statements1
elif test2:
statements2
else:
statements3


  1. 真值和布尔测试
  • 且(and),X and Y
  • 或(or),X or Y
  • 非(not),not X
  • 短路运算,结果确定的时候停止计算
  • andor运算总会返回对象,而不是TrueFalse
  • 三元表达式,A = Y if X else Z,当X为真,执行Y,否则执行Z
  • bool()函数会把X转换成1或者0


循环语句

  1. while循环
1
2
3
4
5
6
7
while test:
statements
if test: break
if test: continue
if test: pass
else:
statements


  1. for循环
1
2
3
4
5
6
7
for x in object:
statements
if test: break
if test: continue
if test: pass
else:
statements
  • for循环可以遍历任何一种序列
  • range(i:j:k),返回一系列连续增加的整数
  • zip(),返回一系列并行元素的元组
  • enumerate(),生成可迭代对象中的元素和值的索引,不必再手动计数

  1. 迭代和推导

    1. 迭代

      • I = iter(L),I指向L的首位置
      • I.__next__()
      • next(I)
    2. 推导

      • L = [expression for x in iterable if test]



函数

  1. def语句
1
2
3
def name(a, b, ... n):
statements
return value


  1. 函数的参数

    • 参数是通过赋值传递的
    • 不变参数传入了“值”,就像创建了一个副本
    • 可变参数传入了“指针”,能在函数内部做原位置的改变
    • 避免修改可变参数,可以调用时复制对象,分片,或者.copy()
    • 参数的匹配模式
      • 位置次序
      • 关键字参数,name=value
      • 默认值参数,name=value
      • 可变长参数,(iterable)*(收集到元组),(dict)**(收集到字典)
      • 可变长参数解包,*
      • keyword-only参数

  2. 函数的高级话题

    • 递归
    • 函数的对象:属性和注解
    • map()
    • filter()
    • reduce()

  3. 匿名函数:lambda

    • eg: lambda a, b, c: a+b+c
    • lambda是一个表达式,而不是语句,返回一个值
    • lambda的主体是一个单独的表达式,而不是一个代码块。因此lambda通常比def功能小
    • lambda完全是可选的,总能用def替代它们

  4. 生成器函数

    • 使用常规的def编写,使用yield语句一次返回一个结果,在每次结果产生之间挂起和恢复它们的状态
    • 支持迭代
    • 生成器函数也可以有return语句,不过总是出现在def语句块的末尾,用于终止值的生成

  5. 生成器表达式

    • 包括在圆括号的列表推导表达式,运行时,返回一个新的生成器对象
    • 支持迭代
    • 生成器是单遍迭代对象
    • 不要过度使用生成器

  6. 作用域

    • LEGB规则,局部 < 外层 < 全局 < 内置
    • global X,全局
    • nonlocal name1, name2, ...,非本地的,“中间”,外层
    • local,本地的,局部
    • 工厂函数,闭包



模块

  • import module
  • from module import x
  1. 包的相对导入

    • from . import x
    • 主模块中不能使用相对导入
  2. __init__.py,包的目录下

    • 包的初始化
    • 模块使用的声明
    • 模块命名空间的初始化
    • __all__列表规定目录以from*语句形式导入时,需要导出什么。
  3. 模块搜索路径 sys.path

    • 主目录
    • PYTHONPATH目录(如果设置了的话)
    • 标准库目录
    • 任何.pth文件中的内容(如果存在的话)
    • 第三方扩展应用的 site-packages 目录
  4. 命名空间包

    • 允许包横跨多个目录,且不要求__init__.py初始化文件,Python3.3+
  5. if __name__ == '__main__':

    • 检测自己的__name__来确定它是在执行还是导入
    • __name__进行单元测试

  • from imp import reload
  • reload(module)
  • import modulename as name
  • from modulename import x as name



  • 类是产生对象的工厂
  1. 属性继承搜索

    • object.attribute
      找出attribute首次出现的地方,先搜索object,然后是该对象之上的所有类,由下往上,由左到右。

  2. OOP机制

    • 实例创建——填充实例属性
    • 行为方法——在类的方法中封装逻辑
    • 运算符重载——为像打印这样的内置操作提供行为
    • 定制行为——重新定义子类中的方法以使其特殊化
    • 定制构造函数——向父类的初始化步骤中添加逻辑

  3. 三个简单的思路

    • 对象树中的属性继承查找
    • 方法中特殊的self参数
    • 运算符重载对方法的自动分发

  4. class语句

1
2
3
4
class name(superclass, ...):
attr = value
def method(self, ...):
self.attr = value


  1. 方法

    • 方法是位于类主体内的函数对象,方法的第一位参数(一般命名为self, 名字不重要,第一个位置决定)总是接受方法调用的隐含主体,也就是当前的实例对象。

    • instance.method(args...) = class.method(instance, args...)

    • Python的self参数与C++的this指针很相似,不过在Python中,self必须显式写出。

  2. 构造函数 __init__

    • 给实例赋初值
    • 1
      2
      3
      4
      class Person:
      def __init__(self, name, age=20):
      self.name = Yang
      self.age = 22
    • self参数和__init__构造函数是Python中OOP的两个基石,类可以看作函数的包

  3. 抽象父类

    • 类的部分行为预期由其子类来提供

  4. 三大思想

    • 继承,is-a
    • 多态,对象接口
    • 封装,数据隐藏

  5. 类的设计

    • OOP和组合,has-a
    • OOP和委托,“包装器”代理对象
    • 多继承
    • 绑定方法
    • 工厂

  6. 类的高级主题

    • 扩展内置类型
    • “新式类”
      • property,属性访问器,类似Java中的getter和setter,在Python中最好少用
    • 静态方法
      • 大致与一个类中简单的无实例函数的工作方式类似,不传入额外的对象
    • spuer



异常和工具

  1. 异常的角色

    • 错误处理
    • 事件通知
    • 特殊情况处理
    • 终止行为
    • 非常规控制流程

  2. try/except/finally语句

    • 捕捉引起的异常并从中恢复

    • 1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      try:
      main-action
      except name1:
      statements
      except (name2, name3):
      statements
      except name4 as var:
      statements
      except:
      statements
      else:
      else-block
      finally:
      finally-block
    • finally,无论异常是否发生,常执行清理行为

  3. raise语句

    • 手动在代码中触发异常
    • raise instance
    • raise class

  4. assert语句

    • 有条件地在程序代码中触发异常,条件式的raise语句
    • assert test, data
    • =
      1
      2
      3
      if __debug__:
      if not test:
      raise AssertionError(data)


  1. with/as上下文管理器

    • 常用于try/finally模式的替代
    • 被用于定义必须执行的终止或“清理”行为
    • with基于一个对象协议,这就让with不那么常用
    • 1
      2
      with expression [as var]:
      with-block
    • expression要返回一个支持上下文管理协议的对象

    • 例子:
      1
      2
      3
      4
      with open('name.txt') as myfile:
      for line in myfile:
      print(line)
      ...



高级主题

  1. Unicode和字节串

  2. 被管理的属性

    • property
    • 描述符
  3. 装饰器

    • 当定义一个函数或类的时候插入自动运行代码的一种方式
    • @decorator
  4. 元类

    • 用来创建一个类的类
    • 常规新式类默认是type类的实例,元类通常是type类的子类



附:Python保留字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
None is class

if elif else

and or not True False

while pass break continue for in

def return yield lambda

global nonlocal

import from del

try except finally raise assert with as