1_python基础

134 阅读5分钟
  1. 常用数据结构

    • list,列表,有重复有序,线程不安全
    • set,集合,无重复无序
    • dict,字典,无序
    • orderedict,有序字典,key顺序是插入的顺序。来自collections模块
    • tuple,元组,不可变对象,线程安全
    • nametuple,快速定义类对象,来自collections模块
    • dataclass,
      • 主要使用 from dataclasses import dataclass
      • nametuple高级版, 定义有默认值和可变属性的类
      • 默认属性都是公开可访问,省略__init__操作
      • 基于装饰器修饰类来实现
      • 属性可以被继承
  2. 常用的几个概念

    • 装饰器:decorator
    • 迭代器生成器
    • 深拷贝和浅拷贝
    • 动态参数 *args, *kwargs
    • is和==
    • 局部变量和全局变量
    • 正则匹配
    • 随机变量生成常用方法
    • 打印格式化:保留小数
  3. 魔法函数

    • __init__
    注意区分__init__.py文件和类里面的__init__函数
    
    - __init__.py
    	1.__init__.py的在文件夹中,可以使文件夹变为一个python模块,python的每个模块对应的包中都有一个	
        __init__.py文件的存在
    
    	2.我们在导入一个模块时候(也叫包),实际上导入的是这个模块的__init__.py文件。
    
    	3._init__.py 中还有一个重要的变量,叫做 __all__。我们有时会使出一招“全部导入”,也就是这样:from 
        PackageName import *,这时 import 就会把注册在包 __init__.py 文件中 __all__ 列表中的子模块
        和子包导入到当前作用域中来。比如: __all__ = ["Module1", "Module2", "subPackage1"]
    
    
    - __init__ 函数
    	1. 类的初始化函数,在下面和__new__做比较
    
    
    • __new__
    1. __new__方法用于创建对象并返回对象,当返回对象时会自动调用__init__方法进行初始化。
    2. __new__方法是静态方法,而__init__是实例方法, 即__new__是object调研创建对象,然后对象再调用__init__初始化属性
    3.利用__new__实现单例模式:
    
    class Singleton(object):
        _instance = None
        def __new__(cls, *args, **kwargs):
            if cls._instance is None:
                cls._instance = object.__new__(cls, *args, **kwargs)
            return cls._instance
    
    s1 = Singleton()
    s2 = Singleton()
    print(s1)
    print(s2) 
    
    • __name__
    1. __name__是内置变量,用于表示当前模块的名字,
    2. python模块既可以直接运行,也可以导入到其它模块运行。当直接运行时模块的__name__输出为main,其他为模块所在路径名
    3. 如果不写if __name__ == '__main__'时,直接写函数调用,那么这个模块被其他模块导入时也会被执行一遍。只有写了后,运行该模块才执行该语句下面的函数,
    4. 一种编码规范
    
    • __str____repr__
    1. 两个都是为了输出对象更友好,返回字符串显示
    2. __repr__: 在交互环境和print输出都会调用
    3. __str__: 只有在print时调用,在交互环境还是输出对象的内存地址形式
    4. 最好是重写 __repr__, 因为__str__只是repr的重写,str没有还是会去调用repr
    
    • __del__
    1. 类似析构函数,与__init__构造函数对应
    2. 如果没有显示调用程序执行完后会自动调用定义的del()函数
    3. 显示调研,即del obj后会触发del()函数
    4. 当一个对象有多个引用时,del obj不会调用del(),只会减少obj的引用,到引用数==0时,再del才会调用
    5. 定义了__del_()的实例无法被Python的循环垃圾收集器收集,所以尽量不要自定义__del__()
    
    • __eq__
    • __hash__
    • __call__
  4. 类 @property和@xxx.setter

    @property 把方法当做属性设置来使用, 简化get和set定义,调研score()既可以set也可以get
    
    class Student(object):
      @property
      def score(self):
          return self._score
    
      @score.setter
      def score(self, value):
          if not isinstance(value, int):
              raise ValueError('score must be an integer!')
          if value < 0 or value > 100:
              raise ValueError('score must between 0 ~ 100!')
          self._score = value
    
    

    @staticmethod

  5. 文件操作

  6. 内存管理机制

  7. 多进程与多线程、线程安全

    • 多进程
      1. 一般多进程都会复制数据,小心爆内存
    • 多进程处理共享数据
      1. 只读情况,共享内存数据用:python multiprocessing Value
      2. 读写情况:建议每个数据相互独立,并行写,然后map reduce
      3. 如果数据相互不独立,设定原子操作或者加锁,开销较大,效率第
  8. 代码优化

    • 优化方法论
    1. cProfile找瓶颈,诊断代码函数调用时间,通过line_profiler可以诊断每一行执行时间
    2. 宏观上是否可以修改(实现逻辑,数据结构,代码结构,更换工具或者模型)
    3. 逐步优化,可以使用高效的数据结构,或者用更接近底层的语言cython(numpy)或C++
    4. openmp
    5. 分布式运行,利用ray框架实现python代码分布式运行
    6. docker启动程序并行执行
  9. pycharm使用

    • .py文件注释模板
    • 远程调式设置:
      1. 设置env
      2. 设置mapping
    • 远程运行没问题,本地pycharm运行找不到路径或者路径错误分析
      1. 项目的working directory设置正确

      2. 设置成绝对路径: os.path.join(os.path.dirname(__file__), './upload/demo.xlsx')

      3. os接收相对路径作为参数时,都是看程序运行目录(os.getcwd())的路径,因此一般新建或者保存都在主程序中实现。

    • 运行代码找不到module
      1. pycharm项目根目录设置成源码目录,即把项目下的路径加入程序搜索路径
      2. 将指定模块加入到 sys.path 中
  10. 设计模式

    • 单例模式
    • 工厂模式
    • 装饰器模式