2019-08-13 | 备忘录 | UNLOCK

Python备忘录

我收藏夹“python/学习重难点”中项目太多了,在此整理方便查阅。

  • Python3中/为浮点数除法,a//b相当于math.floor(a/b),舍弃小数部分用math.trunc()round(number[,ndigits])保留ndigits位小数,并四舍五入,且“奇进偶不进”。(字符串格式化中保留小数位数规则相同)

  • Python3中十六进制字面量以0x开头,八进制和二进制分别为0o0b

  • Python中函数调用时可指定参数名而无视参数顺序(定义时有默认顺序和默认值); 定义函数时使用*args**kwargskw为惯例,非语法强制要求)使函数中args成为包含所有未命名参数的listkw成为所有有名但未在函数定义中声明的参数的dictfunc(*args,**kw)使argslist)和kwdict)被“拆开”并将其元素传入函数funcdef func(a, b, *, c='see', d)使cd必须以命名的方式传入,称为命名关键字参数c有默认值'see'; 如果参数列表中有*kw,则其后的参数皆被认为是命名关键字参数。

  • Python模块(module): 标准写法为(来自使用模块 - 廖雪峰的官方网站):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-

    ' a test module '

    __author__ = 'Michael Liao'

    import sys

    def test():
    args = sys.argv
    if len(args)==1:
    print('Hello, world!')
    elif len(args)==2:
    print('Hello, %s!' % args[1])
    else:
    print('Too many arguments!')

    if __name__=='__main__':
    test()

    其中模块的文档注释可用__doc__访问。

  • Python 用下划线作为变量前缀和后缀指定特殊变量。

    • _xxx :模块中此变量不能用from module import *导入 ,在类中为protected成员
    • __xxx__:系统定义名字
    • __xxx: 类中的私有变量名 类成员名称以__开头的如__name无法用此名从外部直接访问,但实际上可通过_classname__membername的名字访问(不同版本的Python解释器可能会把__name改成不同的变量名)
  • sys模块中的变量argv为命令行参数的列表,第一个元素为文件名; sys.path为列表,储存所有引入模块时搜索的路径,可在运行时添加。亦可增加环境变量PYTHONPATH。

  • isinstance()可判断一个对象是否是一个类的实例,第二个参数可为以类名为元素的元组以判断对象是否为其中之一。

  • 给类绑定的成员和方法(初始设定或运行时添加)其实例皆可使用,除非实例将其覆盖;被同名变量/函数覆盖的成员被删除后将重新指向类所带成员。

  • 可使用__slots__限制类成员,在定义类时将__slots__绑定给类并赋值为一个tuple(经测试list亦可,但定义之后改变__slots__并无作用),tuple中含有被允许的成员名(字符串形式)。 __slots__特性不被继承,如果子类也定义__slots__,则子类被允许的成员名为子类和父类的__slots__之和。

  • Python中0''[](){}None为假(False);其它任何东西都为真(True)。但是可以在类中定义特定的方法使得类实例的演算值为假。

  • andor运算并不直接返回bool值,而是返回比较对象,具体为:

    • and:从左到右扫描,返回第一个为假的表达式值,无假值则返回最后一个表达式值。
    • or:从左到右扫描,返回第一个为真的表达式值,无真值则返回最后一个表达式值。 可用(condition and [a] or [b])[0]当做C中的condition?a:b,注意[a]恒为True
  • for中迭代dict: 默认情况下,dict迭代的是key,即直接for k in dictk遍历dict的所有key。如果要迭代value,可以用for value in d.itervalues(),如果要同时迭代key和value,可以用for k, v in d.iteritems()

  • Python中函数enumerate(iterable[, start])可每次yield一个tuple(index,value)使iterable配上索引,如for i,v in enumerate(list1),可选参数start为索引初始值,默认为0。 应用示例——利用其统计文件行数:

    1
    2
    3
    count = -1 
    for index, line in enumerate(open(filepath,'r')):
    count += 1

    这个方法快于count = len(open(filepath, 'r').readlines())

  • python中重新加载模块的方法为reload(),2.7以下为内置函数,3.3以下在imp中,3.4以上在importlib中。

  • python标准库的itertools

    • count(start[, step]) 无限计数递增迭代。
    • cycle(p) 无限循环周期性迭代,p为可迭代对象。
    • repeat(elem [,n]) 重复迭代,对elem重复迭代n次,默认无限次。
    • product(* iterables,repeat = 1 生成*iterables中的对象之间的笛卡尔积,repeat表示重复的次数。
    • permutations(iterable [, r]) 长度为r的排列,有顺序
    • combinations(iterable , r) 长度为r的组合,无顺序
  • python的集合类型

    • 可用{a,b,c,...}初始化集合,但{}是空字典,空集合是set
    • 集合操作:
      • s.add( x ) 添加单个元素。
      • s.update( iterable ) 添加多个元素
      • s.remove( x ) 移除元素,不在集合中会报错
      • s.discard( x ) 移除元素且不报错
      • s.pop() 移除并返回一个元素,空集报错
    • 集合间操作: