[toc]
导入模块 Python 下 py
后缀的文件就是模块
编写 m.py 文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 g_num1 = 100 g_num2 = 100 def main () : print("这是主函数,需要在当前为主模块的时候被执行" ) if __name__ == "__main__" : main() print(__name__) _pnumber = 10
编写 my.py 文件
使用 import
可以直接导入模块,导入模块的同时会执行其中的代码,但同一模块的代码不论 import
多少次都只执行一次,类似于 C++ 中的 include
没有使用命名空间
1 2 3 4 import mprint(m.g_num1) print(m._pnumber)
推荐使用的方法,但较为繁琐,类似于 C++ 中的 include + using std::xxx
指令
1 2 from m import g_num2print(g_num2)
直接使用指定模块内的所有对象不需要加模块名,类似于 C++ 中的 include + using std::xxx
指令
1 2 from m import *print(g_num1, g_num2)
Python 中的类 Python 中类的格式:class 类名(基类名):
python3 中所有的类都默认继承自 object
1 2 3 4 5 6 7 class Student (object) : def __init__ (self) : pass def __del__ (self) : pass
类属性 的添加和使用,可以使用类名在类内或类外动态地添加新属性,虽然类名和实例都可以访问到类属性,但推荐使用类名,不能使用实例修改类属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 class CObj (object) : class_number = 10 def add_number (self) : CObj.class_number2 = 20 cobj = CObj() print(CObj.class_number, cobj.class_number) cobj.class_number = 100 ; print(cobj.class_number, CObj.class_number) CObj.class_number = 100 print(cobj.class_number, CObj.class_number) print(cobj.__dict__, "\n" , CObj.__dict__) CObj.class_number1 = 10 print(CObj.class_number1, "\n" , CObj.__dict__) cobj.add_number() print(CObj.class_number2, "\n" , CObj.__dict__)
实例属性 就是使用 self
或实例名定义出来的属性,每个实例都会拥有自己的实例属性,同样可以使用类名或 self
动态添加属性
实例数据属性中包含类数据属性,而类数据属性不一定包含实例属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 class CObj (object) : def __init__ (self) : self.num = 10 def add_number (self) : self.num1 = 20 cobj1 = CObj() cobj2 = CObj() print(cobj1.__dict__, "\n" , cobj2.__dict__) print() cobj1.add_number() print(cobj1.__dict__, "\n" , cobj2.__dict__) print() cobj2.num2 = 30 print(cobj1.__dict__, "\n" , cobj2.__dict__) print() del cobj1.num1print(cobj1.__dict__, "\n" , cobj2.__dict__)
遍历基类:
1 2 3 4 5 6 class CObj (object) : def __init__ (self) : print(CObj.__bases__) cobj = CObj()
类方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 class CObj (object) : class_num = 10 def function1 (self) : print("实例方法" , self.class_num) @classmethod def function2 (cls) : print("类方法" ,cls.class_num) @staticmethod def function3 () : print("静态方法" , CObj.class_num) cobj = CObj() cobj.function1() cobj.function2() cobj.function3()
类的私有属性 ,所有以双下划线 开头的属性会被认为是私有的,不能直接被外界访问到。实际上私有只是解释器给属性进行更名,改为 _类名+属性名
,但不推荐使用这种方式进行访问,所有以单下划线 开头的命名约定是不可访问的
1 2 3 4 class CObj (object) : __num = 10 print(CObj.__dict__) print(CObj._CObj__num)
类的继承:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 class CBase1 (object) : def __init__ (self) : print("CBase1" ) class CBase2 (object) : def __init__ (self) : print("CBase2" ) class CObj (CBase1, CBase2) : def __init__ (self) : print("CObj" ) CBase1.__init__(self) super().__init__() super(CBase1, self).__init__() cobj = CObj() print(issubclass(CObj, CBase1)) print(CObj.__bases__) print(CObj.mro())
python 存在继承关系时不会出现二义性问题,当访问一个属性时解释器会遍历原型链首先找到谁就用谁
异常 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 try : print(a) except Exception as e: print(e) try : print("没有异常" ) finally : print("永远会执行" ) name = input("please input name:" ) if name == "hello" : raise NameError("input name error!" )
特殊函数 filter 接收一个序列,将序列中的每个元素传入到提供的函数中进行判断,若函数的返回值为真,则将此元素添加到新的序列
1 2 3 4 5 6 7 8 def filter_alpha (param) : print(param) return param.isalpha() and param.islower() print(list(filter(filter_alpha, "Adj!df#@1ASdh&*" )))
reduce 接收一个序列和函数,函数必须拥有2个参数,首先将序列的第一个元素和第二个元素作为参数传入到函数中,之后每次都将前一次的计算结果和下一个元素传入到函数中,最终返回计算结果
1 2 3 4 5 6 7 8 9 10 def add (num1, num2) : return num1 + num2 def mul (num1, num2) : return num1 * num2 from functools import reduceprint(reduce(add, range(101 ))) print(reduce(mul, range(1 , 6 )))
map 要求传入一个函数及一个或多个可迭代序列,函数的参数个数必须和序列的数量相同,map
会在内部分别将每个序列的元素传入到提供的函数中,并把函数返回值组合成一个新的可迭代序列
1 2 3 def rep_string (s, time) : return s * time print(list(map(rep_string, "abcd" , [1 , 2 , 3 , 4 ])))
lambda 语法:lambda 参数:实现
实现部分只能有一条语句,且不能有 return
,整个实现部分的结果就是函数的返回值
1 2 3 4 from functools import reduceprint(list(map(lambda a, b: a*b, "abcd" , [1 , 2 , 3 , 4 ]))) print(reduce(lambda x, y: x*y, range(1 , 11 ))) print(list(filter(lambda n: True if n.isalpha() else False , "A1!b2#C3%d4^E5&f6" )))
高阶函数 闭包 一个函数在另一个函数内,外层函数返回的是内层函数,即函数本身被返回了,返回的函数还可以访问它的定义所在的作用域,即它带着它的环境信息,这个称之为闭包
闭包指内部函数和外部函数作用域的变量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 def outer (factor) : def inner (number) : return number * factor return inner fun = outer(10 ) """ 在执行以上代码时,会返回一个内部函数 def inner(number): return number * 10 """ print(outer(10 )) print(fun(20 )) """ fun 接受了上一个函数的返回值,已经是一个函数了 def inner(20): return 20 * 10 """
装饰器 在闭包的基础上,内部函数调用了外部作用域提供的函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 def outer (func) : def inner () : print("执行前的时间" ) func() print("执行后的时间" ) return inner def f1 () : print("f1:原有功能" ) f1 = outer(f1) """ def inner(): print("这里是在原有函数上新添加的功能") return 以前的f1() """ f1() """ 这里是返回的新的函数 def f1(): print("这里是在原有函数上新添加的功能") return 以前的f1() """
有时候需要给一些特定的函数添加功能,但不能修改函数的名称,函数的参数个数和函数的调用形式,可以使用装饰器实现功能
语法糖是为了让代码可读性更高,使用更简单,如
1 array [10 ][10 ] == *(*(array + 10 ) + 10 )
模块的使用 时间模块 time 1 2 3 4 5 6 7 import timeprint(time.localtime()) time.sleep(2 ) print(time.strftime("%Y-%m-%d %H:%M:%S" , time.localtime()))
随机模块 random 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import randomfor i in range(1000 ): print(random.randrange(10 )) print(random.randint(10 , 20 )) tmp = "" for i in range(6 ): rad1 = random.randrange(4 ) if rad1 == 1 or rad1 == 3 : rad2 = random.randrange(10 ) tmp += str(rad2) else : rad3 = random.randrange(65 , 91 ) tmp += chr(rad3) print(tmp)
目录文件 os 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import osdir_path = "D:\\" file = [os.path.splitext(dir_path + f) for f in os.listdir(dir_path) if os.path.isfile(dir_path + f)] print(file) f = open("file.txt" , "w+" ) f.writelines("dfkjhsif" ) f.close() f = open("file.txt" ) print(f.readlines()) f.close()
结构体 1 2 3 4 5 6 7 8 import structb = struct.pack("ii1024s" , 1 , 2 , b"nihao" ) print(b) i1, i2, s = struct.unpack("ii1024s" , b) print(i1, i2, s)