python进阶指引

导读

  1. python
    • 文件编程
    • 交互编程
  2. 开发环境配置
    • windows linux mac

数据结构

  1. 列表
    • 列表推导式可以嵌套
    • 列表推导不会产生副作用
    • 如同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)]
    
  2. 元组
    • 元组是由逗号分割的的值组成
    • 元组是不可变类型,即不能在元组内改变任何值
    • 要创建一个元素的元组,在值的后面添加一个逗号
  3. 内建函数
    • type() 知悉任意数据变量的类型
    • len() 查询任意序列数组的长度
    • set()创建集合,空集合必须用它
    • dict() 从包含键值对的元组中创建字典
  4. 集合
    • 一个无序不重复元素的集
    • 功能关系测试,消除重复元素
    • 支持联合,交,差,对称差集等数学运算
    • {}可创建非空集合,其空元素意味着是在创建空字典- | & ^
    • ^ 表示不同时存在,python中的集合是无序的
  5. 字典
    • 字典中的键必须是不可变类型
    • del 关键字删除, in 关键字查询字典的键是否存在
    • 字典是无序的键值对集合,同一字典内的键必须是互不相同的
    • 类似php中的关联数组,只不过是用{}创建空,可使用del关键字删除任意指定的键值对
    • 在向字典中添加元素时,先用判断元素是否存在,
      • 通常用dict.setdefalult(key,default)添加
      • 使用 dict.get(key, default) 来索引键
      • 遍历任何序列类型同时获取元素索引值,使用enumerate()
      • zip() 同时遍历两个序列类型
  6. 其它
    • ->类型提示
      • 描述允许关联函数的参数和返回值的元信息(即python语言中的函数级别注释)
    • 用列表构成栈和队列数据结构
    • 列表类似于双向链表,在此基础上构建其它常用数据结构

函数与类

  1. 局域或全局变量
    • global 关键字,同php一样局部变全局
    • 函数内部变量只能在内使用,函数完成时销毁
    • 默认参数,关键字参数,强制关键字参数(只允许使用的关键字参数def hello(*,name='User')
  2. 函数
    • 在python中,函数名本身也是变量
    • 文档字符串"""
    • 高阶函数
      • 使用一个或多个函数作为参数
      • 返回一个函数作为输出
      • map() 接受一个函数和迭代器作为输入,应用函数返回一个序列(迭代器)
    • init 初始化, 在它之前还有 preparenew
    • 类的实例化使用函数符号
    • python中存在多继承
    • @property装饰器(本质上是高阶函数)
      • 把一个方法变成属性调用,应用场景数据校验
      • @classname.setter 在property数据写时会调用此法
  3. 模块
    • 默认模块 os,str
    • argparse 命令行参数处理模块
    • sys 系统模块 PYPI众多模块可供选择
    • Requests 模块,非默认模块,python常用包
    • 含有__init__.py文件的目录可以用来作为一个包
    • whl格式本质上是一个压缩包,里面包含了py文件,以及经过编译的pyd文件。类似java中的jar,php中的phpar
  4. collections 模块
    • 内建集合模块
    • Counter 类 常用方法 elements(),most_common()
    • defaultdict类
      • 解决一对多的问题
      • 自动合并第一参数default_factory属性默认为字典的数据类型
      • 若defaultdict 对象不存在某个键,它会自动创建一个空列表
    • namedtuple命名元组类
  5. 相关器
    • 迭代器协议
      • 实现了魔法方法 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中一般情况下,魔术方法由内置函数简化操化操作触发
  6. 代理迭代
    • 构建自定义容器
    • 可迭代对象,列表,元组或其它
    • 在新容器对象上执行迭代操作
    • 迭代器协议:
      • 协议需要 iter() 方法返回一个实现了 next() 方法的迭代器对象
  7. with…as
    • 上下文管理协议
      • enter() 进入上下文返回对象
      • exit()
      • 支持该协议的对象要实现这两个方法
    • 上下文管理器
      • 定义执行with语句时要建立的运行时上下文,负责执行with语句块上下文中的进入与退出操作
    • with语句应用场景
      • 文件操作
      • 进入线程之间互斥对象,例如互斥锁
      • 支持上下文的其他对象
  8. 异常
    • 捕获异常基于运行时错误
    • 语法错误则属于运行前错误
    • 捕获指定类型异常
    • 应用场景:
      • 猜数字
      • 目的允许用户输入错误并给出提示

类与对象

  1. 魔术方法

    • 所有的魔术方法不能用常规的调用形式去执行,通常将其实例作为相关内置函数参数,由内置函数调用
    • 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模块
      • 对格式化的一些标准约定
  2. 让对象支持上下文管理协议(with 语句)

    • 不同的协议调用形式不一样
    • 出现with语句块时,对象的__enter__方法被触发
    • 需要实现__enter__()和__exit__()方法
      • def __enter__(self)
      • def __exit__(self, exc_ty, exc_val, tb)
    • 如若__exit__内返回true,异常会被清空
    • contextmanager 模块标准的上下文管理方案
    • 应用场景:
      • 打开关闭资源操作
        • 初始化时,并不会做任何事情
  3. 创建大量对象时节省内存方法__slots__

    • 最初的目的:内存优化工具,
    • __slots__属性,限制该class能添加的属性(仅对当前类起作用)
    • 应用场景:简单数据结构类
  4. 在类中封装属性名

    • 原理:
      • python不依赖语言特性封装数据,而是遵循命名规范达到效果
      • 任何以单下划线开头的名字都应该是内部实现
      • 使用双下划线开始会导致访问名称变成其他形式,运行时变成类名+_+双下划线名
        • 此类属性名是不能被覆盖的
    • 规范
      • 使用单下划线为了防止命名冲突而非属性私有
  5. 创建可管理的属性

    • 需求:属性类型检查或合法性验证
    • 方案:定义property装饰器
      • Getter func 访问
        • @property
      • setter func 修改
        • @func.setter
      • deleter func 删除(可选)
        • @func.deleter
    • property属性是一系列相关绑定方法的集合
    • 在python中只有访问property时才会自动被触发,而并不是所有的访问!!!
  6. 描述器

    • 定义:实现三个核心属性访问操作的类
    • get, set, delete 三个特殊方法,接受实例参数,操作实例底层的字典
    • 注意区分类变量与实例变量,描述器只能在类级别中被定义
    • 使用:
      • 将描述器的实例作为类属性放到类的定义中
  7. 实现数据模型的类型约束

    • 需求:定义某些在属性赋值上面有限制的数据结构
    • 方案:
      • 自定义属性赋值函数,使用描述器
  8. 特殊方法

    • 特殊方法定义在class中
    • 不需要直接调用
    • python的某些函数或操作符会调用对应的特殊方法
    • 正确实现特殊方法
      • 只需要编写用到的特殊方法
      • 有关联的特殊方法都必须实现
        • 比如:getattr, setattr, delattr
  9. 小结

    • python中的另类代码
      • 生成代码字符串
      • 操作其它代码
      • 供其它代码使用的代码
      • 用于调度的代码
      • 格式化的代码
    • python类java存在内部类

函数

  1. python 函数
    • 任意位置或关键字参数(*arg元组或字典**argv)

      任意关键字**参数只能出现在最后一个参数

    • 强制关键字参数(可读性强)
      • 将某个强制关键字参数放到某个*参数之后,即可达成此效果
      • def recv(maxsize, *, block) // block为强制关键字参数,不是形参是必传的关键字参数
  2. 函数参数增加元信息
    • 符号->
    • 函数注解存储在函数的__annotations__属性中
    • python支持多值返回
    • 默认参数的值应该是不可变的对象(即非引用对象)
      • 例如:None,True,False,数字或字符串
  3. 匿名或内联函数
    • lambda表达式
      • 应用场景
        • 排序或数据reduce等
      • 只能指定单个表达式,它的值就是最后的返回值
    • lambda表达式中的形参变量
      • 是自由变量
      • 在运行时绑定值,而非定义时绑定
    • 使用函数默认值参数形式,lambda函数在定义时就能绑定到值
  4. 减少可调用对象的参数个数
    • 需求:callable对象参数太多,导致调用时出错
    • 方案:
      • functools.partial()
        • 该函数允许给一个或多个参数设置固定的值,减少被调用时参数的个数
  5. 闭包
    • 在函数内部带上了一个额外的变量环境
    • 闭包特点:
      • 会记住自己被定义时的环境。
      • 自由变量,引用自由变量的函数
    • 应用场景:
      • 单方法类转化为函数
      • 需要给某个函数增加额外的状态信息的问题时,可考虑使用闭包
  6. 带额外状态信息的回调函数
    • 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
  7. 协程(生成器)
    • yield在协程中的用法
      • 在协程中yield通常出现在表达式的右边,默认产出的值是None
      • 协程可从调用方接收数据,调用方是通过**send(datum)**的方式把数据提供给协程使用,而不是next(…)函数
      • 使用协程同生成器一样,需要(prime)预激活协程
    • 协程需要被激活,通常用next
    • yield操作会使一个生成器函数产生一个值并暂停,接下来调用生成器的__next__()或send()方法又会让它从暂停处重新继续执行
  8. 访问闭包中定义的变量
    • 需求:
      • 扩展函数中的某个闭包,允许能访问和修改函数的内部变量
    • 方案:
      • 通过编写访问函数并将其作为函数属性绑定到闭包上来实现此目的

元编程

  1. 定义(不要重复)
    • 创建操作源代码(比如修改,生成或包装原来的代码)的函数和类
    • 在python中主要使用装饰器,类装饰器和元类
    • 亦包括:签名对象,使用exec()执行代码及对内部函数和类的反射技术等
  2. 装饰器
    • 装饰器并不会修改原始函数的参数签名以及返回值
    • 装饰器是一个函数,接收一个被装饰函数作为参数并返回一个新的闭包函数,新的闭包函数是与原始函数同名的函数变量
    • 闭包函数使用*args,**kwargs确保任何参数都能适用,闭包内部执行原始函数调用并返回结果,在闭包内做其他额外逻辑
    • 为保证原始函数的元信息不被丢失,通常使用functools.wraps工具函数包装器进行包装
  3. 创建装饰器时保留函数的元信息
    • functools库中的@wraps装饰器来注解底层包装函数,保留原始函数的元数据
    • 编写装饰器的时候复制元信息是一个非常重要的部分
    • @wraps的__wrapped__属性
      • 通过它可直接访问被包装函数
      • 能让被装饰函数正确暴露底层的参数签名信息
  4. 解除装饰器
    • 若装饰器通过@wrap来实现的,可以访问__wrapped__属性来访问原始函数
          @somedecorator
          def add(x,y):
              return x + y
      
          origin_add = add.__wrapped__
      
  5. 带参数的装饰器
    • 函数名也是变量名
        @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将默认参数合并为装饰器的私有状态
  6. 利用装饰器强制函数上的类型检查
    • 能对参数类型进行断言
    • 装饰器只会在函数定义时被调用一次
    • insepct.signature()函数,可调用对象的参数签名信息(需要用到inspect包)
  7. 将装饰器定义为类的一部分
    • 关键确认装饰器的使用方式
      • 实例方法装饰器
      • 类方法装饰器
        • @classmethod
      • 装饰器被定义成类方法,在继承时,必须在子类中显式的使用父类名去调用
    • 装饰器方法
      • 第一参数为类或实例
      • 第二参数通常为被装饰函数
    • 应用场景
      • 需要在装饰器中记录或绑定信息
      • self或cls
        • 最外层的装饰器函数需要提供一个self或cls参数
  8. 将装饰器定义为类
    • 需求:用装饰器包装函数,但希望返回一个可调用的实例
    • 方案:
      • 将装饰器定义成一个实例,需要装饰器实现了__call__()和__get__()方法
    • __get__描述器协议
      • 创建一个绑定方法对象,确保绑定方法对象能被正确创建
  9. 为类和静态方法提供装饰器
    • 需要确保装饰器在@classmethod 或@staticmethod之前(即离被装饰的原始方法更近)
    • 理由:@classmethod和@staticmethod实际上并不会创建可直接调用的对象,而是创建特殊的描述器对象
    • 装饰器顺序有时强调一致
      •       from abc import ABCMeta, abstractmethod
              class A(metaclass=ABCMeta):
                  @classmethod
                  @abstractmethod
                  def method(cls):
                      pass
        
  10. 其它
    • 装饰器为被包装函数增加参数
      • 为避免包装器参数与被包装函数的参数重复,可使用inpsect.getargsepc(func).args进行检测
    • 使用装饰器扩充类的功能
      • 需求:重写类定义的某部分来修改行为,不希望继承或元类
    • prepare()
      • 在开始定义类和它的父类的时候被执行,
      • 在所有类定义开始执行前首先被调用,用来创建类命名空间
      • 必须返回一个映射对象以便在类定义体中被使用到
      • 应用场景:
        • 返回 OrderedDict类而不是一个普通的字典,实现捕获定义的顺序
        • 通常在框架中使用顺序定义将对象映射到元组或数据库表中的行
    • new()
      • 被用来实例化最终的类对象
    • init()
      • 最后被调用,用来执行其他的一些初始化工作
  11. 定义有可选参数的元类
    • python允许使用metaclass关键字参数来指定特定的元类
    • 使用关键字参数配置的一个元类可被视作对类变量的一种替代方式
    • 操作函数调用签名问题
      • 应用inspect模块的签名特性
        • Signature类
        • Parameter类
      • 签名对象bind方法可将绑定到*args,**kwargs
    • 元类
      • type
      • 元类允许在定义的时候检查类的内容
      • 应用场景
        • 元类用来检测重载方法
        • 元类可以监控类的定义
      • 特殊方法在元类中重新定义区别
        • new()方法在类创建之前被调用
          • 通常用于某种方式(比如通过改变类字典内容)修改类的定义
        • init()方法在类被创建之后被调用
          • 通常是需要完整构建类对象的时候
      • 当使用元类时,self实际上是一个类对象
  12. 以编程的方式定义类
    • type 类的母亲
    • types 模块创建元类,生产类
    • types.new_class()函数
      • 用来初始化新的类对象,其参数如下
        • 类的名字,父类元组,关键字参数,以及一个用成员变量填充类字典的回调函数
    • python中的__new__是用来创建类之前被调用
    • 框架魔法
      • sys._getframe()来获取调用者的模块名
  13. 利用函数注解实现方法的重载
    • 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
      • 内部函数和闭包
      • 类型系统描述器
  14. 其它
    • 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子程序再次回来,从之前中断的地方开始执行
      • 协程专业术语
        • 协程拥有自己的寄存器上下文和栈
        • 协程调试切换时,会保存现场,保留上次调用时的状态(即所有局部状态的一个特定组合)
        • 协程回来时,会进入上一次离开时所处逻辑流的位置

模块与包

  1. 构建模块包
    • 确保每个目录都定义了一个__init__.py文件
      • 包含不同运行级别的包的可选初始化代码
      • 该文件将在同级其它文件被导入之前导入
      • 其常见用法将多文件合并到一个逻辑命名空间
    • 模块变量__all__
      • 明确地列出需要导出的内容
      • example
            # somemodule.py
            def spam():
                pass
            def grok():
                pass
        
            blah = 42
            # Only export 'spam' and 'grok'
            __all__ = ['spam', 'grok']
        
    • import语句支持包的相对或绝对导入
  2. 模块分割
    • 用模块名作为目录名来替换模块文件
    • 在该目录下创建__init__.py文件
    • 在__init__.py文件内将其他逻辑文件合并,其内容如下
          # __init__.py
          from .a import A
          from .b import B
      
    • 惯例:
      • 使用包的相对导入来避免将顶层模块名硬编码到源代码中
    • 延迟加载
      • 优点
        • 在需要的时候被加载
      • 缺点
        • 继承和类型检查可能会中断
  3. 利用包命名空间导入目录分散的代码
    • 关键
      • 确保顶级目录中没有__init__.py文件作为共同的命名空间
    • 其他
      • 缺失__init__.py文件,解释器创建了一个由所有包含匹配包名的目录组成的列表
      • 只读目录列表副本被存储在其__path__变量中
    • 包命名空间检查
      • 检查包的__file__属性
  4. 运行目录或压缩文件
    • 解释器将执行__main__.py文件作为主程序
    • 将代码打包成zip文件也适用
  5. 读取位于包中的数据文件
    • pkgutil.get_data(package,‘somedata.dat’)
  6. 将文件夹加入到sys.path
    • 使用pythonpath环境变量来添加
    • 创建一个.pth文件,将目录举出来,将该文件置于python的site-packages目录
  7. 其它
    • 通过字符串名导入模块
    • 通过钩子远程加载模块
      • 方法一 urllib.request, sys, imp
      • 方法二创建自定义导入
        • 元路径导入器
        • 编写一个钩子直接嵌入到sys.path变量中去,识别某些目录命名模式
    • 导入模块的同时修改模块(关键依赖于导入的钩子)
    • 支持安装私有包
    • 创建新的python环境pyvenv
    • 分发包

python脚本路径

  1. sys.path[0]
    • #!声明执行当前脚本的命令,会加入环境变量
          #每次执行脚本时,python会将执行脚本目录加入PYTHONPATH环境变量中(sys.path获取)
          #!/usr/bin/python3
          import os
          import sys
      
  2. sys.args[0]
    • 获取脚本执行本身路径
  3. file
    • 获取脚本执行本身路
  4. 获取脚本执行本身的绝对路径
    • os.path.abspath(file)
    • os.path.realpath(file)
  5. os.path 系统环境变量
    • sys.path
      • 模块搜索路径字符串列表
      • 由python环境变量初始化得到
    • sys.path[0]
      • 调用python解释器的当前脚本所在目录
      • 关键 充当执行者的角色
  6. python启动器
    • 安装 Python 3.3 以上的版本时
    • Python会在C:\Windows文件夹下安装启动器py.exe

网络与web编程

  1. HTTP客户端代码
    • 应用场景
      • 下载数据
      • 与基于RESET的API进行交互
    • 解决方案
      • 简单 urllib.request模块
      • 复杂 requests库
        • 支持以多种方式从请求中返回响应结果的内容
          • resp.text 以Unicode解码的响应文件
          • resp.content 原始的二进制数据
          • resp.json json格式响应
        • 支持多个http谓词
        • 基本认证,cookie,session,HTTP 头、编码方式等
        • 支持高级的 HTTP 客户端协议,如OAuth等
      • 原生底层的模块 http.client
  2. 服务器
    • TCP服务器
      • 应用场景
        • 通过TCP协议和客户端通信
      • 解决方案
        • 简单
          • 使用 socketserver库
    • UDP服务器
      • UDPServer 模块
      • 实现socketserver.BaseRequestHandler类的handle方法
    • 地址转换
      • 通过 CIDR 地址生成对应的 IP 地址集
      • ipaddress 模块
        • 可表示IP地址,网络和接口
    • 创建RESET接口
      • 基于WSGI
  3. 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语句进行执行
  4. 远程调用
    • df

python公开课

  1. 语言初心
    • C,C++,汇编依赖于硬件cpu型号,计算机指令,适合开发底层,性能
    • java 跨平台,代码语言与硬件无关, 适合开发中间件
    • Go,php,node 等 适合特定领域
    • python 胶水语言
      • 初心就是为了整合,更类似于一种连接器,库足够多
      • 最佳适用场景:数据挖掘,机器学习,
    • php 面向web语言
  2. 静态与动态
    • 静态编译后源代码不参与
    • 动态一边编译一边还需要源代码
  3. python
    • python在面向对象上无法保持简洁
    • 使用了一大堆特殊方法,属性,变量,语法糖泛泛
  4. 库解析
    • turtle 海龟库
      • 图形绘制体系
        • 在画布中空间坐标中间点(0,0)
        • 海龟坐标
        • 窗体坐标
      • 色彩体系
        • RGB模式
          • 0到1小数值
          • 0到255整数值
      • 控制函数
        • 画笔控制
          • 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)
      • 文本词频统计
  5. 关注点
    • 浮点数运算时存在不确定尾数,通常用四舍五入函数进行比较
    • 复数,虚部,科学计算中会经常用到
    • 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
        • :引导符号 填充 对齐 宽度 ,千位分隔符 .精度 类型
  6. 语言结构
    • 二分支紧凑形式
      • 表达式的使用而分语句使用
      • <表达式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, )
          • d.popitem()
      • 应用场景
        • 文本词频统计
    • 文件
      • 数据抽象和集合
      • 文本文件与二进制文件
        • 文本文件有统一编码,字符串,可读性 rt
        • 由0与1组成的存储格式,二进制文件存储性 rb
        • 占用状态 vs 存储状态
        • seek
          • 调整对文件操作的指针
          • seek(0) 标志位
      • 数据操作周期
        • 数据存储 -> 存储格式
          • 一维数据(列表,集合)存储
          • 一维数据处理
          • 二维数据是一种表现形式
          • CSV通用数据存储格式
            • Comma-Separated Values
            • 如果某个元素缺失,逗号仍然要保留
            • 用换行表示另一维度元素
            • 逗号为英文半角逗号,逗号与数据之间无额外空格
        • 数据表示 -> 数据类型
        • 数据操作 -> 操作方式,算法
    • wordcloud库
      • 词云库
        • 配置词云对象参数 空格构成的字符串
        • 加载词云文本
        • 输出词云文件
      • 词云库所作的操作
        • 分隔:以空格分割单词
        • 统计:单词出现次数并过滤
        • 字体:根据统计配置字号
        • 布局:颜色环境尺寸
      • 词云应用背景
        • 政府工作报告词云分析
        • 支持不同背景形状的词云
  7. 程序设计方法学
    • 工具决定思维
      • 计算思维:
        • 抽象+自动化
        • 模拟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页面的功能库
      • 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(),去重
          • 对于格式化输出,如果字符串超过规定的列宽长度,则以字符串长度显示
          • 每个递归函数可能存在多个基例
          • 创建字典时,如果相同键对应不同值,字典采用最后(最新)一个键值对
          • 字典一般用来表示高维数据
            -+打开模式关键在于它能够同时赋予文件的读写权限
          • 计算思维是基于计算机快速计算装置出现后才出现的思维模式

你可能感兴趣的:(python,python,python教程,turtle)