天天看点

Python随记一些遇到的东西

一些遇到的东西

all(iterables)和any(iterables)

两个内建函数

  • 本质上讲,any()实现了或(OR)运算,而all()实现了与(AND)运算。
  • 对于

    any(iterables)

    ,如果可迭代对象iterables中任意存在每一个元素为True则返回True。特例:若可迭代对象为空,比如空列表[],则返回False。
  • 对于

    all(iterables)

    ,如果可迭代对象iterables中所有元素都为True则返回True。特例:若可迭代对象为空,比如空列表[],则返回True。

f-string使用中如果出现无需转义的{xxxx}字符的解决办法

  • 在{xxxx}字符串外再套一个{}来取消转义

assert语句 断言

  • assert

    可以用来做一个condition的判断,如果为False则raise一个Error。
  • assert condition [,ErrorMessage]

    用法就是如果condition为True则正常pass;如果为False则raise一个AssertionError,且该错误的信息为ErrorMessage设置的信息
    In [3]: assert 1==0,'1 not like 0'
    ----------------------------------------------------------------------
    
    AssertionError                       Traceback (most recent call last)
    
    <ipython-input-3-54d3c5adefe2> in <module>()
    ----> 1 assert 1==0,'1 not like 0'
    
    AssertionError: 1 not like 0
               

Python的True和False

  • 在Python中如果

    ''

    ,

    ()

    ,

    []

    ,

    {}

    ,

    None

    ,

    set()

    , 这些值都是False
  • 非空对象以及1都是True

Python 字符串去空

  • str.strip()

Python for 循环中的索引的作用域问题

  • 本人一直认为for 中的临时索引变量,只在for中有效出了for循环就被删除了,实则不然
  • python的for循环的索引变量能泄露到外围的函数范围
  • for循环将变量赋值到目标列表中。……当循环结束时,赋值列表中的变量不会被删除,但如果序列是空的,它们将不会被赋值给所有的循环。
for i in range(3):
    pass
print(i)

>>>2
           

os.getpid()

获取当前进程的id,

os.getppid()

获取当前进程的父进程的id

random.random()

  • 产生0-1范围内的随机实数

注意py文件的命名

  • 一定不能与某些模块的名称相同,会出很奇怪的错误

IO文件操作时路径问题

  • 对文件进行操作时填写的相对路径并不是相对当前文件,而是相对于当前的工作路径而言

PyInstaller打包程序

  • 个人推荐新建一个虚拟环境并安装Pyinstaller,使用新的环境去打包,可以有效控制体积,因为个人感觉Pyinstaller打包时会将当前Python环境中所有的库都打包,所以需要构建一个最低库需求的环境去打包以亚索exe文件的体积

Python del用法

  • del用来删除一个对象的引用,其作用于一个变量,删除一个对象的引用
  • python每次引用对象就会有一个计数器为该对象加1,如果引用为0了就会被python自动处理回收。

Python 魔术方法 (magic method)

  • 构造与初始化
    • __new__

      是用来创建类并返回这个类的实例
    • __init__

      只是将传入的参数来初始化该实例
    • __del__

      当一个对象的生命周期结束时,调用来删除该对象的引用,对象本身的删除交由python自己处理
    • 在创建一个对象时先执行

      __new__

      之后才执行

      __init__

      来初始化对象,最后执行

      __del__

      来删除对象的引用
  • 可调用的对象

Python enumerate() 函数

  • enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标
    >>>seasons = ['Spring', 'Summer', 'Fall', 'Winter']
    >>> list(enumerate(seasons))
    [(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
    >>> list(enumerate(seasons, start=1))       # 下标从 1 开始
    [(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]
    
               

Python 编码

  • 计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理;由于计算机是美国人发明的,因此,最早只有127个字母被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,ASCII码是一个Byte的。
  • Unicode : Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。Unicode通常是2个Bytes

  • Unicode包含了所有字符,但是如果纯英文的使用Unicode就很浪费,在存储和传输上就十分不划算。所以,又出现了把Unicode编码转化为“可变长编码”的UTF-8编码。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间
  • 计算机内存中,统一使用Unicode编码
  • Python 3版本中,字符串是以Unicode编码的,也就是说,Python的字符串支持多语言
  • 由于Python的字符串类型是str,在内存中以Unicode表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes。
  • 以Unicode表示的str通过encode()方法可以编码为指定的bytes
    >>> 'ABC'.encode('ascii')
    b'ABC'
    >>> '中文'.encode('utf-8')
    b'\xe4\xb8\xad\xe6\x96\x87'
    >>> '中文'.encode('ascii')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
               
  • 如果我们从网络或磁盘上读取了字节流,那么读到的数据就是bytes。要把bytes变为str,就需要用decode()方法
    >>> b'ABC'.decode('ascii')
    'ABC'
    >>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
    '中文'