导读
- python
- 文件编程
- 交互编程
- 开发环境配置
- windows linux mac
数据结构
- 列表
- 列表推导式可以嵌套
- 列表推导不会产生副作用
- 如同php般python的字符串也是一个伪列表
- 正常循环中的临时变量在循环结束后依然存在
- 列表推导本质上是向list函数传入一下映射对象,该对象接收一个lambda函数
- 列表推导式只是一个语法糖而已,map接收函数与列表,返回处理后的列表
- 列表推导式由包含一个表达式的中括号组成,表达式后面跟随一个 for 子句,之后可以有零或多个 for 或 if 子句
squares = list(map(lambda x: x**2, range(10))) // 进化等价 squares = [x**2 for x in range(10)]
- 元组
- 元组是由逗号分割的的值组成
- 元组是不可变类型,即不能在元组内改变任何值
- 要创建一个元素的元组,在值的后面添加一个逗号
- 内建函数
- type() 知悉任意数据变量的类型
- len() 查询任意序列数组的长度
- set()创建集合,空集合必须用它
- dict() 从包含键值对的元组中创建字典
- 集合
- 一个无序不重复元素的集
- 功能关系测试,消除重复元素
- 支持联合,交,差,对称差集等数学运算
- {}可创建非空集合,其空元素意味着是在创建空字典
- | & ^
- ^ 表示不同时存在,python中的集合是无序的
- 字典
- 字典中的键必须是不可变类型
- del 关键字删除, in 关键字查询字典的键是否存在
- 字典是无序的键值对集合,同一字典内的键必须是互不相同的
- 类似php中的关联数组,只不过是用{}创建空,可使用del关键字删除任意指定的键值对
- 在向字典中添加元素时,先用判断元素是否存在,
- 通常用
dict.setdefalult(key,default)
添加 - 使用
dict.get(key, default)
来索引键 - 遍历任何序列类型同时获取元素索引值,使用
enumerate()
zip()
同时遍历两个序列类型
- 通常用
- 其它
->
类型提示- 描述允许关联函数的参数和返回值的元信息(即python语言中的函数级别注释)
- 用列表构成栈和队列数据结构
- 列表类似于双向链表,在此基础上构建其它常用数据结构
函数与类
- 局域或全局变量
global
关键字,同php一样局部变全局- 函数内部变量只能在内使用,函数完成时销毁
- 默认参数,关键字参数,强制关键字参数(只允许使用的关键字参数)
def hello(*,name='User')
- 函数
- 在python中,函数名本身也是变量
- 文档字符串"""
- 高阶函数
- 使用一个或多个函数作为参数
- 返回一个函数作为输出
- map() 接受一个函数和迭代器作为输入,应用函数返回一个序列(迭代器)
- 类
- init 初始化, 在它之前还有 prepare ,new
- 类的实例化使用函数符号
- python中存在多继承
- @property装饰器(本质上是高阶函数)
- 把一个方法变成属性调用,应用场景数据校验
- @classname.setter 在property数据写时会调用此法
- 模块
- 默认模块 os,str
- argparse 命令行参数处理模块
- sys 系统模块 PYPI众多模块可供选择
- Requests 模块,非默认模块,python常用包
- 含有__init__.py文件的目录可以用来作为一个包
- whl格式本质上是一个压缩包,里面包含了py文件,以及经过编译的pyd文件。类似java中的jar,php中的phpar
- collections 模块
- 内建集合模块
- Counter 类 常用方法 elements(),most_common()
- defaultdict类
- 解决一对多的问题
- 自动合并第一参数default_factory属性默认为字典的数据类型
- 若defaultdict 对象不存在某个键,它会自动创建一个空列表
- namedtuple命名元组类
- 相关器
- 迭代器协议
- 实现了魔法方法 iter(),返回一个迭代对象,这个对象有一个next()方法
- 实现 next() 方法,返回当前的元素,并指向下一个元素的位置,当前位置已经没有元素的时候,抛出StopIteration异常。
- 迭代器
- 将类作为迭代器协议需要持有以下二种方法
- next() 方法设置循环次数,返回迭代值或决定是否终止迭代
- iter() 方法返回可迭代对象自身的引用,其方法是操作在iterator对象上
StopIteration
异常用于标识迭代的完成- 本质不是自执行,而是被其它代码所调度执行
- py3中
iter()
创建迭代器对象,next()
迭代对象 - 字符串,列表或元组的对象都可以用来创建迭代器
- 可迭代对象实现了__iter__方法
- 迭代器是一个懒加载工厂,需要的时候才会生成值进行返回,没调用时处于休眠状态,等待下一次调用
- 特点:
- 实现的迭代器不需要准备所遍历的所有元素,没错,这就是迭代器的一大魅力,惰性计算。
- 生成器函数(节省内存)
- 生成器函数只能用作迭代操作
- 调用生成器函数时返回一个生成器对象
- 生成器是创建迭代器的方法,通过在函数中使用
yield
关键字完成 - 任何一个生成数据的含有__iter__方法的类都可以用作对象生成器,其实例则是一个可迭代对象
- 应用场景:
- 使用生成器进行惰性求值,即一次只传递一部分数据
- list元素动态计算出来,而非直接得到一个完整的list来节省内存
- 特点:
- 生成器不可重复循环使用,用过就丢
- 带有yield的生成器函数通常与循环配合使用
- 生成器创建新的迭代模式,for能够直接操作生成器,其隐式的将生成器转化为了迭代器
- 不用for循环执行迭代器时,需要用iter()函数将可迭代对象转为迭代器,然后使用next()进行下一个
- 生成器本质
- 生成器的堆栈帧实际上不在堆栈上,它在堆(内存)上
- 这意味着,它不需要遵循常规函数执行时遵循的先进后出顺序
- 生成器一定是迭代器,反之不一定成立
- 生成器表达式
- 迭代器协议
- 外形类似列表推导式,但返回的是一个生成器对象而不是列表对象
- 直接在在一对括号内,并且不能在两边有逗号
sum(x*x for x in range(1,10))
- 闭包
- 返回的内部函数(闭包)持有外部函数的引用数据
- 装饰器
- 给一些对象动态的添加一些新的行为
- @a(d)@b© 实际上是 a(d)(b©)
- 可迭代对象(解压赋值)
- 列表或者元组(可迭代对象)
- 字符串,文件对象
- 迭代器和生成器
- 可迭代对象-> iter() -> 迭代器 -> next() -> 迭代结果
- 魔术方法(所谓魔术其实是一种实现协议的机制)
- python的魔术方法并非是实例的一个具体方法,不能用常规操作方法直接调用,它是在不同使用场景下适时调用
- 比如可迭代对象,是指持有__iter__方法的对象,若要迭代需要获取该对象的迭代器 通过内建函数iter获得
- python中一般情况下,魔术方法由内置函数简化操化操作触发
- 迭代器协议
- 代理迭代
- 构建自定义容器
- 可迭代对象,列表,元组或其它
- 在新容器对象上执行迭代操作
- 迭代器协议:
- 协议需要 iter() 方法返回一个实现了 next() 方法的迭代器对象
- with…as
- 上下文管理协议
- enter() 进入上下文返回对象
- exit()
- 支持该协议的对象要实现这两个方法
- 上下文管理器
- 定义执行with语句时要建立的运行时上下文,负责执行with语句块上下文中的进入与退出操作
- with语句应用场景
- 文件操作
- 进入线程之间互斥对象,例如互斥锁
- 支持上下文的其他对象
- 上下文管理协议
- 异常
- 捕获异常基于运行时错误
- 语法错误则属于运行前错误
- 捕获指定类型异常
- 应用场景:
- 猜数字
- 目的允许用户输入错误并给出提示
类与对象
-
魔术方法
- 所有的魔术方法不能用常规的调用形式去执行,通常将其实例作为相关内置函数参数,由内置函数调用
- repr 将实例转化为代码形式的字符串,原样输出
- str 将实例转换为一个字符串
- 应用场景:使用内置函数
str()
或print()
函数会输出这个字符串
- 应用场景:使用内置函数
- 示例
// {}位置参数,{0}第一个,0类似正则第一个(format内)参数 // {0!s} !转换标志, s表示对第一个参数(实例)用str()函数执行 // . 则为属性分割符,即self实例属性分别为x,y def __repr__(self): return 'Pair({0.x!r},{0.y!r})'.format(self) def __str__(self): return '({0.x!s},{0.y!s})'.format(self)
- format() 方法, format
- 使一个对象能支持自定义的格式化操作
- format()方法给Python字符串格式化提供了一个钩子
- 附加string模块
- 对格式化的一些标准约定
-
让对象支持上下文管理协议(with 语句)
- 不同的协议调用形式不一样
- 出现with语句块时,对象的__enter__方法被触发
- 需要实现__enter__()和__exit__()方法
def __enter__(self)
def __exit__(self, exc_ty, exc_val, tb)
- 如若__exit__内返回true,异常会被清空
- contextmanager 模块标准的上下文管理方案
- 应用场景:
- 打开关闭资源操作
- 初始化时,并不会做任何事情
- 打开关闭资源操作
-
创建大量对象时节省内存方法
__slots__
- 最初的目的:内存优化工具,
__slots__
属性,限制该class能添加的属性(仅对当前类起作用)- 应用场景:简单数据结构类
-
在类中封装属性名
- 原理:
- python不依赖语言特性封装数据,而是遵循命名规范达到效果
- 任何以单下划线开头的名字都应该是内部实现
- 使用双下划线开始会导致访问名称变成其他形式,运行时变成类名+_+双下划线名
- 此类属性名是不能被覆盖的
- 规范
- 使用单下划线为了防止命名冲突而非属性私有
- 原理:
-
创建可管理的属性
- 需求:属性类型检查或合法性验证
- 方案:定义property装饰器
- Getter func 访问
- @property
- setter func 修改
- @func.setter
- deleter func 删除(可选)
- @func.deleter
- Getter func 访问
- property属性是一系列相关绑定方法的集合
- 在python中只有访问property时才会自动被触发,而并不是所有的访问!!!
-
描述器
- 定义:实现三个核心属性访问操作的类
- get, set, delete 三个特殊方法,接受实例参数,操作实例底层的字典
- 注意区分类变量与实例变量,描述器只能在类级别中被定义
- 使用:
- 将描述器的实例作为类属性放到类的定义中
-
实现数据模型的类型约束
- 需求:定义某些在属性赋值上面有限制的数据结构
- 方案:
- 自定义属性赋值函数,使用描述器
-
特殊方法
- 特殊方法定义在class中
- 不需要直接调用
- python的某些函数或操作符会调用对应的特殊方法
- 正确实现特殊方法
- 只需要编写用到的特殊方法
- 有关联的特殊方法都必须实现
- 比如:getattr, setattr, delattr
-
小结
- python中的另类代码
- 生成代码字符串
- 操作其它代码
- 供其它代码使用的代码
- 用于调度的代码
- 格式化的代码
- python类java存在内部类
- python中的另类代码
函数
- python 函数
- 任意位置或关键字参数(*arg元组或字典**argv)
任意关键字**参数只能出现在最后一个参数
- 强制关键字参数(可读性强)
- 将某个强制关键字参数放到某个*参数之后,即可达成此效果
def recv(maxsize, *, block)
// block为强制关键字参数,不是形参是必传的关键字参数
- 任意位置或关键字参数(*arg元组或字典**argv)
- 函数参数增加元信息
- 符号
->
- 函数注解存储在函数的
__annotations__
属性中 - python支持多值返回
- 默认参数的值应该是不可变的对象(即非引用对象)
- 例如:None,True,False,数字或字符串
- 符号
- 匿名或内联函数
- lambda表达式
- 应用场景
- 排序或数据reduce等
- 只能指定单个表达式,它的值就是最后的返回值
- 应用场景
- lambda表达式中的形参变量
- 是自由变量
- 在运行时绑定值,而非定义时绑定
- 使用函数默认值参数形式,lambda函数在定义时就能绑定到值
- lambda表达式
- 减少可调用对象的参数个数
- 需求:callable对象参数太多,导致调用时出错
- 方案:
- functools.partial()
- 该函数允许给一个或多个参数设置固定的值,减少被调用时参数的个数
- functools.partial()
- 闭包
- 在函数内部带上了一个额外的变量环境
- 闭包特点:
- 会记住自己被定义时的环境。
- 自由变量,引用自由变量的函数
- 应用场景:
- 单方法类转化为函数
- 需要给某个函数增加额外的状态信息的问题时,可考虑使用闭包
- 带额外状态信息的回调函数
def apply_async(func, args, *, callback)
- 需求:
- 代码需要依赖回调函数
- 需要让回调函数拥有额外的状态值,以便内部使用到
- 不同方案
- 使用一个闭包捕获状态值
apply_async(add, ('hello', 'world'), callback=handler
- 使用一个绑定方法代替一个简单回调函数(callback)
apply_async(add, (2, 3), callback=r.handler)
- 高级方案使用协程
- 协程使用之前需要调用next()
- 对于协程使用它的
send()
方法作为回调函数apply_async(add, ('hello', 'world'), callback=handler.send
- 使用一个闭包捕获状态值
- 协程(生成器)
- yield在协程中的用法
- 在协程中yield通常出现在表达式的右边,默认产出的值是None
- 协程可从调用方接收数据,调用方是通过**send(datum)**的方式把数据提供给协程使用,而不是next(…)函数
- 使用协程同生成器一样,需要(prime)预激活协程
- 协程需要被激活,通常用next
- yield操作会使一个生成器函数产生一个值并暂停,接下来调用生成器的__next__()或send()方法又会让它从暂停处重新继续执行
- yield在协程中的用法
- 访问闭包中定义的变量
- 需求:
- 扩展函数中的某个闭包,允许能访问和修改函数的内部变量
- 方案:
- 通过编写访问函数并将其作为函数属性绑定到闭包上来实现此目的
- 需求:
元编程
- 定义(不要重复)
- 创建操作源代码(比如修改,生成或包装原来的代码)的函数和类
- 在python中主要使用装饰器,类装饰器和元类
- 亦包括:签名对象,使用exec()执行代码及对内部函数和类的反射技术等
- 装饰器
- 装饰器并不会修改原始函数的参数签名以及返回值
- 装饰器是一个函数,接收一个被装饰函数作为参数并返回一个新的闭包函数,新的闭包函数是与原始函数同名的函数变量
- 闭包函数使用
*args,**kwargs
确保任何参数都能适用,闭包内部执行原始函数调用并返回结果,在闭包内做其他额外逻辑 - 为保证原始函数的元信息不被丢失,通常使用
functools.wraps
工具函数包装器进行包装
- 创建装饰器时保留函数的元信息
functools
库中的@wraps装饰器来注解底层包装函数,保留原始函数的元数据- 编写装饰器的时候复制元信息是一个非常重要的部分
- @wraps的__wrapped__属性
- 通过它可直接访问被包装函数
- 能让被装饰函数正确暴露底层的参数签名信息
- 解除装饰器
- 若装饰器通过@wrap来实现的,可以访问__wrapped__属性来访问原始函数
@somedecorator def add(x,y): return x + y origin_add = add.__wrapped__
- 若装饰器通过@wrap来实现的,可以访问__wrapped__属性来访问原始函数
- 带参数的装饰器
- 函数名也是变量名
@decorator(x, y, z) def func(a, b): pass // 其处理效果如下 def func(a,b): pass func = decorator(x,y,z)(func)
- functools.partial 返回一个未完全初始化的自身函数,本质闭包含有确定下来的参数状态
- 有参vs无参装饰器
- 无参装饰器,被装饰函数会被当做第一个参数直接传递给装饰器,
- 有参装饰器,装饰器初始调用时被包装函数并没有被传递进来
-
@logged(level=logging.CRITICAL, name='example') def spam(): print('Spam!') // 调用序列等价如下 // 需要装饰器内部多加一层函数,以便将装饰器参数与原始函数参数分开 def spam(): print('Spam!') spam = logged(level=logging.CRITICAL, name='example')(spam)
-
- 让装饰参数可选
- 将默认参数作为装饰器的强制关键字参数
- 被装饰函数作为首参,内部使用偏函数functools.partials将默认参数合并为装饰器的私有状态
- 利用装饰器强制函数上的类型检查
- 能对参数类型进行断言
- 装饰器只会在函数定义时被调用一次
- insepct.signature()函数,可调用对象的参数签名信息(需要用到inspect包)
- 将装饰器定义为类的一部分
- 关键确认装饰器的使用方式
- 实例方法装饰器
- 类方法装饰器
- @classmethod
- 装饰器被定义成类方法,在继承时,必须在子类中显式的使用父类名去调用
- 装饰器方法
- 第一参数为类或实例
- 第二参数通常为被装饰函数
- 应用场景
- 需要在装饰器中记录或绑定信息
- self或cls
- 最外层的装饰器函数需要提供一个self或cls参数
- 关键确认装饰器的使用方式
- 将装饰器定义为类
- 需求:用装饰器包装函数,但希望返回一个可调用的实例
- 方案:
- 将装饰器定义成一个实例,需要装饰器实现了__call__()和__get__()方法
- __get__描述器协议
- 创建一个绑定方法对象,确保绑定方法对象能被正确创建
- 为类和静态方法提供装饰器
- 需要确保装饰器在@classmethod 或@staticmethod之前(即离被装饰的原始方法更近)
- 理由:@classmethod和@staticmethod实际上并不会创建可直接调用的对象,而是创建特殊的描述器对象
- 装饰器顺序有时强调一致
-
from abc import ABCMeta, abstractmethod class A(metaclass=ABCMeta): @classmethod @abstractmethod def method(cls): pass
-
- 其它
- 装饰器为被包装函数增加参数
- 为避免包装器参数与被包装函数的参数重复,可使用
inpsect.getargsepc(func).args
进行检测
- 为避免包装器参数与被包装函数的参数重复,可使用
- 使用装饰器扩充类的功能
- 需求:重写类定义的某部分来修改行为,不希望继承或元类
- prepare()
- 在开始定义类和它的父类的时候被执行,
- 在所有类定义开始执行前首先被调用,用来创建类命名空间
- 必须返回一个映射对象以便在类定义体中被使用到
- 应用场景:
- 返回 OrderedDict类而不是一个普通的字典,实现捕获定义的顺序
- 通常在框架中使用顺序定义将对象映射到元组或数据库表中的行
- new()
- 被用来实例化最终的类对象
- init()
- 最后被调用,用来执行其他的一些初始化工作
- 装饰器为被包装函数增加参数
- 定义有可选参数的元类
- python允许使用metaclass关键字参数来指定特定的元类
- 使用关键字参数配置的一个元类可被视作对类变量的一种替代方式
- 操作函数调用签名问题
- 应用inspect模块的签名特性
- Signature类
- Parameter类
- 签名对象bind方法可将绑定到
*args,**kwargs
上
- 应用inspect模块的签名特性
- 元类
- type
- 元类允许在定义的时候检查类的内容
- 应用场景
- 元类用来检测重载方法
- 元类可以监控类的定义
- 特殊方法在元类中重新定义区别
- new()方法在类创建之前被调用
- 通常用于某种方式(比如通过改变类字典内容)修改类的定义
- init()方法在类被创建之后被调用
- 通常是需要完整构建类对象的时候
- new()方法在类创建之前被调用
- 当使用元类时,self实际上是一个类对象
- 以编程的方式定义类
- type 类的母亲
- types 模块创建元类,生产类
- types.new_class()函数
- 用来初始化新的类对象,其参数如下
- 类的名字,父类元组,关键字参数,以及一个用成员变量填充类字典的回调函数
- 用来初始化新的类对象,其参数如下
- python中的__new__是用来创建类之前被调用
- 框架魔法
- sys._getframe()来获取调用者的模块名
- 利用函数注解实现方法的重载
- python允许参数注解
-
class Spam: def bar(self, x:int, y:int): print('Bar 1:', x, y) def bar(self, s:str, n:int = 0): print('Bar 2:', s, n) s = Spam() s.bar(2, 3) # Prints Bar 1: 2 3 s.bar('hello') # Prints Bar 2: hello 0
-
- 元类和描述器的底层工作原理
- types
- 内部函数和闭包
- 类型系统描述器
- python允许参数注解
- 其它
- send vs next
- next与send作用相仿,send可以和生成器互动,传入一个值
- next只能将生成器进行下一次值
- next通常用来启动生成器, g.send(None)
- send通常是python中协程的标志,发送+迭代功能
- 使用send方法发送的值,会在本次迭代过程中被用;其值会被发送到上次yield表达式的位置
- 生成器接收值,上次从哪中断就在中断的后续位置接收外部传进来的值
- yield返回值 VS yield表达式 !!!
- 前者是调用者迭代生成器时的返回值,后者是生成器接收调用者发出的值
- 二者数据流向不同,生成器->调用者;调用者->生成器
- yield 表达式的值由调用者传入,在下次生效
- yield 关键字后的值,即是其本次需要返回给调用者的值
- yield 执行完毕不会释放掉生成器内的状态
- yield from
- 处理了各种异常,方便迭代
- async 和 await
- Python 能够计算或执行字符串形式的源代码
- ast 模块能被用来将 Python 源码编译成一个可被分析的抽象语法树
- 分析源码树
- 拆解python字节码 dis模块
- 协程
- 一个线程中的一个个函数叫做子程序
- 线程是系统级别的,它们是由操作系统调度;协程是程序级别的,由程序员根据需要自己调度
- 那么子程序在执行过程中可以中断去执行别的子程序,别的子程序也可以中断回来继续执行之前的子程序,这就是协程
- A子程序执行中断-> 跳转执行另一段代码 -> A子程序再次回来,从之前中断的地方开始执行
- 协程专业术语
- 协程拥有自己的寄存器上下文和栈
- 协程调试切换时,会保存现场,保留上次调用时的状态(即所有局部状态的一个特定组合)
- 协程回来时,会进入上一次离开时所处逻辑流的位置
- send vs next
模块与包
- 构建模块包
- 确保每个目录都定义了一个__init__.py文件
- 包含不同运行级别的包的可选初始化代码
- 该文件将在同级其它文件被导入之前导入
- 其常见用法将多文件合并到一个逻辑命名空间
- 模块变量__all__
- 明确地列出需要导出的内容
- example
# somemodule.py def spam(): pass def grok(): pass blah = 42 # Only export 'spam' and 'grok' __all__ = ['spam', 'grok']
- import语句支持包的相对或绝对导入
- 确保每个目录都定义了一个__init__.py文件
- 模块分割
- 用模块名作为目录名来替换模块文件
- 在该目录下创建__init__.py文件
- 在__init__.py文件内将其他逻辑文件合并,其内容如下
# __init__.py from .a import A from .b import B
- 惯例:
- 使用包的相对导入来避免将顶层模块名硬编码到源代码中
- 延迟加载
- 优点
- 在需要的时候被加载
- 缺点
- 继承和类型检查可能会中断
- 优点
- 利用包命名空间导入目录分散的代码
- 关键
- 确保顶级目录中没有__init__.py文件作为共同的命名空间
- 其他
- 缺失__init__.py文件,解释器创建了一个由所有包含匹配包名的目录组成的列表
- 只读目录列表副本被存储在其__path__变量中
- 包命名空间检查
- 检查包的__file__属性
- 关键
- 运行目录或压缩文件
- 解释器将执行__main__.py文件作为主程序
- 将代码打包成zip文件也适用
- 读取位于包中的数据文件
- pkgutil.get_data(package,‘somedata.dat’)
- 将文件夹加入到sys.path
- 使用pythonpath环境变量来添加
- 创建一个.pth文件,将目录举出来,将该文件置于python的site-packages目录
- 其它
- 通过字符串名导入模块
- 通过钩子远程加载模块
- 方法一 urllib.request, sys, imp
- 方法二创建自定义导入
- 元路径导入器
- 编写一个钩子直接嵌入到sys.path变量中去,识别某些目录命名模式
- 导入模块的同时修改模块(关键依赖于导入的钩子)
- 支持安装私有包
- 创建新的python环境pyvenv
- 分发包
python脚本路径
- sys.path[0]
#!
声明执行当前脚本的命令,会加入环境变量#每次执行脚本时,python会将执行脚本目录加入PYTHONPATH环境变量中(sys.path获取) #!/usr/bin/python3 import os import sys
- sys.args[0]
- 获取脚本执行本身路径
- file
- 获取脚本执行本身路
- 获取脚本执行本身的绝对路径
- os.path.abspath(file)
- os.path.realpath(file)
- os.path 系统环境变量
- sys.path
- 模块搜索路径字符串列表
- 由python环境变量初始化得到
- sys.path[0]
- 调用python解释器的当前脚本所在目录
- 关键 充当执行者的角色
- sys.path
- python启动器
- 安装 Python 3.3 以上的版本时
- Python会在C:\Windows文件夹下安装启动器py.exe
网络与web编程
- HTTP客户端代码
- 应用场景
- 下载数据
- 与基于RESET的API进行交互
- 解决方案
- 简单 urllib.request模块
- 复杂 requests库
- 支持以多种方式从请求中返回响应结果的内容
- resp.text 以Unicode解码的响应文件
- resp.content 原始的二进制数据
- resp.json json格式响应
- 支持多个http谓词
- 基本认证,cookie,session,HTTP 头、编码方式等
- 支持高级的 HTTP 客户端协议,如OAuth等
- 支持以多种方式从请求中返回响应结果的内容
- 原生底层的模块 http.client
- 应用场景
- 服务器
- TCP服务器
- 应用场景
- 通过TCP协议和客户端通信
- 解决方案
- 简单
- 使用 socketserver库
- 简单
- 应用场景
- UDP服务器
- UDPServer 模块
- 实现socketserver.BaseRequestHandler类的handle方法
- 地址转换
- 通过 CIDR 地址生成对应的 IP 地址集
- ipaddress 模块
- 可表示IP地址,网络和接口
- 创建RESET接口
- 基于WSGI
- TCP服务器
- REST接口
- 应用场景
- 使用REST API实现监控或诊断
- 大数据应用构建数据查询或提取系统
- REST控制硬件设备
- WSGI函数,最返回的必须是字节字符串
- 签名
def wsgi_app(environ, start_response)
- environ属性是一字典,包含从web服务器提供的 CGI接口中获取的值
- 签名
- python关键字
- python区分大小写
- nonlocal,global,raise,with
- True,False,None 关键字
- elif :语法
- in 判断一个元素是否在列表中
- is assert
- python字符串索引存在正反
- 正向从0开始,反向从-1开始
- evel() 评估函数将最外侧的引号去掉,变成python语句进行执行
- 应用场景
- 远程调用
- df
python公开课
- 语言初心
- C,C++,汇编依赖于硬件cpu型号,计算机指令,适合开发底层,性能
- java 跨平台,代码语言与硬件无关, 适合开发中间件
- Go,php,node 等 适合特定领域
- python 胶水语言
- 初心就是为了整合,更类似于一种连接器,库足够多
- 最佳适用场景:数据挖掘,机器学习,
- php 面向web语言
- 静态与动态
- 静态编译后源代码不参与
- 动态一边编译一边还需要源代码
- python
- python在面向对象上无法保持简洁
- 使用了一大堆特殊方法,属性,变量,语法糖泛泛
- 库解析
- turtle 海龟库
- 图形绘制体系
- 在画布中空间坐标中间点(0,0)
- 海龟坐标
- 窗体坐标
- 色彩体系
- RGB模式
- 0到1小数值
- 0到255整数值
- RGB模式
- 控制函数
- 画笔控制
- penup() pendown() pencolor() pensize()
- 运动控制
- forward() 别名fd() circle()
- 方向控制
- setheading(angle) 角度函数
- 海角角度
- 画笔控制
- 图形绘制体系
- time 库
- 时间获取
- 模板字符串
- time.ctime time.gmtime strptime 反格式化
- 程序计时
- perf_counter() 返回cpu精确时间单位秒
- sleep(s)
- 文本进度条
- 时间获取
- PyInstaller 库打包
- 将.py源码转换成无需源码的可执行文件,如.exe文件
- 生成的执行程序,对方电脑无需再安装python执行环境
- jieba 库
- 中文分词第三方库,英文不需要
- 依靠中文词库
- 分词模式
- 精确模式
- 全模式
- 搜索引擎模式
- 常用函数
- jieba.lcut(s) 接受一个字符串返回一个分词列表
- jieba.lcut_for_search(s)
- jiba.add_word(w)
- 文本词频统计
- turtle 海龟库
- 关注点
- 浮点数运算时存在不确定尾数,通常用四舍五入函数进行比较
- 复数,虚部,科学计算中会经常用到
- 0O,0X,3e5 八进制,十六进制
- x**=3 <=> xxx 二元增强赋值操作符
- 运算函数
- 数值 divmod,pow,round
- [::-1] 复制反向字符串切片,第三参数为步长
- 字符串处理函数
- hex(x) 十六进制
- oct(x) 八进制
- len(x) python unicdoe
len('123强')
运算结果为4
- str.center(width,[,fillchar])
- str.strip(chars)
- 格式化format
- 槽
- :引导符号 填充 对齐 宽度 ,千位分隔符 .精度 类型
- 语言结构
- 二分支紧凑形式
- 表达式的使用而分语句使用
- <表达式1> if <条件> else <表达式2>
- 异常处理
- try except else finally
- random
- 随机种子,目的让随机再现
- 蒙特卡罗方法在求圆周率
- 基本思想:大量实验,模拟概率
- 使用随机数据点,求得近似解(涉及到微积分,无穷大)
- 函数
- IPO input process out 输入处理输出
- 七段数码管
- 绘制线
- 绘制单个数字
- 获取系统时间,绘制
- 递归
- 递归链条
- 递归基例 最小形式
- 数学归纳法
- 基本思想:函数+分支结构
- 实例
- 科赫雪花
- 汉诺塔
- 组合数据类型
- 集合类型set
- set() 空集合
- 元素不可变,无序,没有相同元素
- 支持 并叉交补操作
- 应用场景
- 包含关系比较
- 数据去重 list() set()
- 序列类型
- 其类型扩展分为列表,元组,字符串
- 序列是具有先后关系的一组元素
- 序列是一维元素向量,元素类型可以不同
- 序列存在序号
- 序列类类型操作
- in, not in
- len
- 元组创建不可修改(指其值)
- () 或 tuple()
- 所有序列类型的方法在元组类型上皆可用
- 应用场景
- 数据保护
- 不希望数据被程序改变,转换成元组类型
- 数据返回
- // 返回商的部分
- 数据保护
- 列表
- [] list()
- 列表变量赋值只是引用传递
- ls.append(x),ls.clear(x),ls.copy(x), ls.reverse(),ls.insert(),ls.index()
- 应用场景:
- 对一组数据的表达
- 字典
- 键值对类型是“映射”的实现
- 字典无序
- 字典类型操作函数和方法
- del d[k]
- k in d 判断键k是否在字典d中
- d.keys()
- d.values()
- d.items()
d.get(k, <default>)
- d.popitem()
- 应用场景
- 文本词频统计
- 集合类型set
- 文件
- 数据抽象和集合
- 文本文件与二进制文件
- 文本文件有统一编码,字符串,可读性 rt
- 由0与1组成的存储格式,二进制文件存储性 rb
- 占用状态 vs 存储状态
- seek
- 调整对文件操作的指针
- seek(0) 标志位
- 数据操作周期
- 数据存储 -> 存储格式
- 一维数据(列表,集合)存储
- 一维数据处理
- 二维数据是一种表现形式
- CSV通用数据存储格式
- Comma-Separated Values
- 如果某个元素缺失,逗号仍然要保留
- 用换行表示另一维度元素
- 逗号为英文半角逗号,逗号与数据之间无额外空格
- 数据表示 -> 数据类型
- 数据操作 -> 操作方式,算法
- 数据存储 -> 存储格式
- wordcloud库
- 词云库
- 配置词云对象参数 空格构成的字符串
- 加载词云文本
- 输出词云文件
- 词云库所作的操作
- 分隔:以空格分割单词
- 统计:单词出现次数并过滤
- 字体:根据统计配置字号
- 布局:颜色环境尺寸
- 词云应用背景
- 政府工作报告词云分析
- 支持不同背景形状的词云
- 词云库
- 二分支紧凑形式
- 程序设计方法学
- 工具决定思维
- 计算思维:
- 抽象+自动化
- 模拟N场,得到收敛结果
- 自顶向下(设计)
- API
- 分而治之,系统思维
- 将一个总问题表达为若干小问题组成的形式
- 自底向上(执行)
- 集成计算生态
- 逐步组建复杂系统的有效测试方法
- 分单元测试,逐步组装
- 按照自顶向下相反的路径操作
- 计算思维:
- 应用场景
- 体育竞技分析
- 思维模式
- 逻辑思维
- 推理和演绎,以数学为代表,A->B,B->C, A->C
- 实证思维
- 实验和验证,以物理为代表,引力波<-实验
- 计算思维
- 抽象问题的计算过程
- 自动化执行求解
- 关键:模拟计算过程(关注)
- 计算生态
- 竞争发展
- 相互依存
- 迅速更迭
- numpy库
- 逻辑思维
- 程序设计模式
- IPO
- 模块化设计(松紧耦合)
- 配置化设计
- 引擎 + 配置
- 核心:程序执行和配置分离,将可选参数配置化,关注接口
- 应用开发
- 产品定义
- 系统架构
- 设计与实现
- 用户体验
- python第三方库安装
- pip安装工具
- 集成安装 anaconda(即批量安装)
- 文件安装 需要编译再安装,或直接下载编译后的文件,打补丁
- os库
- 提供通用的,基本的操作系统交互功能
- 路径操
- 进程管理
- os.system()具备调用其他程序的能力
- 环境参数等
- os.chdir(path)
- os.getpwd()
- os.getlogin()
- os.getinfo()
- os.urandom(n)
- 提供通用的,基本的操作系统交互功能
- python生态
- 计算库
- Numpy 表达N维数组的最基础库
- Pandas 数据分析高层次应用库
- Scipy 数学,科学和工程相关功能库
- 可视化
- Matplotlib 二维数据可视化功能库
- Seaborn 统计类数据可视化功能库
- Mayavi 三维科学数据可视化功能库
- 文本处理
- Pypdf2 用来处理pdf文件的工具集
- NLTK 自然语言文本处理第三方库
- Python-docx 创建或更新msword文件的第三方库
- 机器学习
- Scliki-learn 机器学习方法工具集
- TensorFlow 机器学习计算框架
- MXNet 基于神经网络的深度学习计算框架
- web解析与网络空间
- 网络爬虫
- Requests 页面级别
- Scrapy 网络爬虫框架
- 支持定时,批量
- pysipder web页面爬取系统
- web信息提取
- Beautiful Soup HTML和XML的解析库
- 上下行遍历,平行遍历
- Re 库 正则表达式库和处理功能库
- Python-Goose 提取文章类型web页面的功能库
- Beautiful Soup HTML和XML的解析库
- 网络爬虫
- web网站开发
- Django Web应用框架MTV,大规模
- Pyramid 规模适中的应用框架
- flask web应用开发微框架
- 网络应用开发
- WeRoBot 微信公众号开发框架
- aip 百度AI开放平台python功能接口
- 语音,人脸,OCR,NLP,知识图谱,图像搜索等领域
- MyQR 二维码生成第三方库
- PyQT5,wxPython,PyGObject 人机交互库
- PyGame, Panda3D,cocos2d 游戏库
- VR Zero, pyovr,Vizard 人机虚拟现实库
- Quads,ascii_art,turtle 图形艺术库
- 计算库
- 其它
- 刷新的本质
- 打印的字符覆盖之前的字符
- 不能换行:print()需要被控制
- 要能回退:打印后光标回退到之前的位置\r
- \r return 本义光标重新回到本行开头
- \n newline 本义光标往下一行(不一定到下一行行首)
- 进度条实例
#! py -3 import time # 进度条 scale = 50 # // 取商 # s.center(填充的宽度,填充字符) print("执行开始".center(scale//2, "-")) # 返回浮点数的计时器 start = time.perf_counter() for i in range(scale+1): a = '*' * i b = '.' * (scale -i) c = (i/scale) * 100 dur = time.perf_counter() - start print("\r{:3.0f}%[{}->{}]{:.2f}s".format(c, a, b,dur), end="") time.sleep(0.1) print() print("执行结束".center(scale//2, "-"))
- 技巧
- 数据需要排序,需要先转为list类型,有序
- 数据需要去重,需要先转为集合类型set(),去重
- 对于格式化输出,如果字符串超过规定的列宽长度,则以字符串长度显示
- 每个递归函数可能存在多个基例
- 创建字典时,如果相同键对应不同值,字典采用最后(最新)一个键值对
- 字典一般用来表示高维数据
-+打开模式关键在于它能够同时赋予文件的读写权限 - 计算思维是基于计算机快速计算装置出现后才出现的思维模式
- 刷新的本质
- 工具决定思维