(更新中...)

资料

语法

格式化输出

重名问题(待测试)

重名会有冲突的情况,主要分为,变量和变量同名,变量和方法同名,方法和方法同名。

  • 当变量与方法、方法与方法同名时,后定义的相当于重新定义,仅最后一个起作用。因为方法名相对与指向方法的一个指针的名称,与变量的地位“相同”,后定义的会直接覆盖前面定义的。
  • 当局部变量与全局变量同名时,需要使用关键字来区分(global,local,nonlocal等),否则运行出错。
  • 类的属性与类的公有变量同名时(尤其是有多重继承时),类按照自上而下的方式去查找,对象按自下而上的方法查找。但是当存在多重继承,尤其是菱形继承的情况时,python采用C3算法。【参考链接
class A:
    name = 'A' 
    def __init__(self):
        self.name = 'a' 

a = A() 

print('name of object a: ', a.name)
print('name of class A: ', A.name)

#运行结果
name of object a:  a
name of class A:  A
#----------------------------------------------------
class B:
    name = 'B' 
    def name(self):
        self.name = 'b' 
        return 'function name'
b = B() 

print('name method of b:', b.name)
print('name function of B:', B.name)
print('call function name: ', b.name())

#运行结果:
name method of b: <bound method B.name of <__main__.B object at 0x7fb81d8bdc70>>
name function of B: <function B.name at 0x7fb81d82f0d0>
call function name:  function name

字符串

  • str前面可以加前缀,如‘r’、‘u’、‘b’,
    前缀‘r’表示字符串内不使用转义(原始字符串,raw string),但是不能以'\'结尾【参考链接
    前缀‘u’表示使用unicode编码,与无前缀意义相同
    前缀‘b’表示使用二进制编码

序列(sequence)

  • 容器序列:list、tuple、deque,可以存储任何数据类型
  • 扁平序列:str、bytes、bytearray、array.array
  • 可变序列:list、deque、bytearray、array
  • 不可变序列:str、tuple、bytes
  • 切片(slice): 用法[start: end:step],切片返回的是新序列,不会改变原有的序列
  • append与extend函数的区别,append是将内容追加为序列的最后一个元素,而extend是将内容逐个在序列后面进行添加。

字典(dict)

  • dict与set均使用哈希表来实现,1)查找字典的时间复杂度为O(1),2)其key值必须是可哈希的(不能重复), 3) 会申请较大的空间,当剩余空间小于1/3时,会重新申请新的空间 4)插入新元素时,元素的顺序可能发生变化(触发重新分配空间,数据迁移时,映射位置会发生变化)
  • dict为C语言实现,创建时,不会使用魔法函数,因此如果直接继承,新写得魔法函数不会被调用,不建议直接进行继承;但是可以继承Userdict类型,它具有dict所具有的所有熟悉

集合(set)

  • set与dict均使用哈希表来实现,1)查找元素的时间复杂度为O(1),2)其元素必须是可哈希的(不能重复)3) 会申请较大的空间,当剩余空间小于1/3时,会重新申请新的空间 4)插入新元素时,元素的顺序可能发生变化(触发重新分配空间,数据迁移时,映射位置会发生变化)
  • set具有数学中集合所有的特性,比如:差集(a - b),交集(a & b), 并集(a | b)
  • frozenset:不可变集合,主要用于数据处理。

魔法函数

  • __hash__:实现此函数,可使用hash查找
  • __eq__:实现此函数,可使用 == 比较
  • __iadd__:实现此函数,可使用 += 运算
  • __del__:实现此函数,可以重载垃圾回收del操作
  • __getattr__:当获取某个property不存在时,会调用此函数
  • __getattribute__:当获取某个property时,会无条件的调用此函数,谨慎重载
  • __new__:创建对象,用来控制对象的生成过程,如果new方法不返回对象,则不会调用init函数
  • __init__:初始化对象
  • __str__:print打印时的内容
  • __iter__、__next__:构建Iterable必须实现的魔法函数,

装饰器

  1. property,用来定义属性。

  2. classmethod,定义类方法

    • 将类名cls作为参数传入方法中,这样方法可以将cls作为一个handle。通常方法使用此cls来创建一个新类,并返回,这个方法就相当于类cls的一个构造函数。参考链接
  3. staticmethod,定义静态方法

    • 有点类似于C++的静态函数,当方法不需要使用对象本身(即self指针)时,即可以将其定义为static方法。
  4. abstractmethod,定义抽象类方法

    • 类似于C++中的抽象基类中的纯虚函数,其方法可以不用实现,子类必须实现这些方法才能实例化

关键字

  • yield:返回值,于return不同,一个函数中可以执行多个yield。只要函数中存在yield,则不是普通函数,而是生成器函数。生成器的对象是Iterable
  • metaclass:类的参数,声明使用元类。

参数传递

  • 可以将方法名做为参数,注意:不要使用括号。
    如果传递的方法(记作B)带有参数(记作args),可以将方法名称(B)和参数(args)均作为当前方法(记作A)的参数,即
def A(B,args):

符号

下划线“_”

下划线在Python中的应用比较广泛

  • 变量命名
    按Python pep8规范,需采用蛇形命名法,即变量名中各单词之间用下划线做为连接。例如:str_a,great_wall等
  • 做缺省变量,即占位符
str_a = 'str_a'
_, a = str_a.split('_')
  • 作为确实方法参数,起占位作用,可传递任何变量,但变量不会被使用
def func(_):
      print('OK')
func('a')      # 正确
func(1)        # 正确
# func()       # 错误,必须传递参数
  • 在类中,以下划线开头的变量为私有成员变量,外部无法访问

  • 用于魔法函数,以双下划线开头和双下划线结尾

函数

BIF: Build In Function

  • map:用法 result_list = map(func,input_list),即对input_list中所有元素,逐个作为func函数的变量,得到的结果,逐个放在result_list中
  • filter:用法 filter(function or None, iterable) -> list, string or tuple,对iteratble中的所有元素,逐个作为function的变量,结果为 true时,返回iterable对应的值。
  • str: 参见base64代码中的用法
  • copy:浅拷贝,用法 test.copy(); copy.deepcopy(test):深拷贝(注意,需import copy)
  • get:对dict,如果直接使用 dict["key"],当key不存在时,会抛出异常,此时可以用get代替,例如: value = dict.get("key", {}),当key不存在时,value会等于get后面设置的默认值

其它