• python 知识点总结


    第一张

    1)变量
    内存空间的表达式
    命名要遵守规则
    赋值使用 = 
    2)类型转换
    str()将其他类型转成字符窜
    int() 将其他类型转成整数
    float()将其他类型转成浮点数
    3)数据类型
    整数类型 int
    浮点数类型 float
    布尔类型 True/False
    字符窜类型 str
    4)注释
    单行注释 #
    多行注释 ''' 或者 """
    中文编码声明 #coding:utf-8
    
    

    第二章

    1)程序的三种组织结构
    顺序结构
    选择结构
    循环结构
    2)选择结构
    单分支结构
    双分支结构
    多分支结构
    嵌套if
    条件表达式
    3)对象布尔值
    False
    	False
    	数值0
    	None
    	空字符窜
    	空列表、空元祖、空字典、空集合
    True
    
    

    第三章

    1)内置函数range
    	生成整数数列 
    	起始值默认为0
    	步长默认为1
    2)循环结构
    	while	
    		用于次数不固定的循环
    		初始条件不成立一次都不执行
    	for-in
    		用于遍历可迭代对象
    
    3)break continue else
    	break
    		退出当前循环结构
    	continue
    		结束当前循环进入下一次循环
    	else
    		if..else
    		while..else
    		for..else
    4)嵌套循环
    	外层循环执行一次内层循环执行完整一轮
    	while与for-in 互相嵌套
    
    示例:
    #乘法口诀表
    for i in range(1,10):
        for j in range(1,i+1):
            print(i,'*',j,'=',i*j,end='\t')
        print()
    
    #while 循环 1-100 偶数和
    sum=0
    a=1
    while a<=100:
        if a%2==0:
            sum+=a
        a+=1
    print(sum)
    
    #for 循环1-100偶数和
    zong=0
    for i in range(1,101):
        if i%2==0:
            zong+=i
    print(zong)    
    
    

    第四章

    1)列表
    	创建
    		使用中括号
    		内置函数list()
    		列表生成式
    	查询
    		查询元素索引
    		获取单个元素
    		获取多个元素
    		in/not in
    	增删改
    		增
    			append()
    			extend()
    			insert()
    			切片
    		删
    			remove()
    			pop()
    			clear()
    			del
    			切片
    		改
    			索引
    			切片
    	排序
    		方法sort()
    		内置函数sorted()
    
      2)字典
      	字典的创建
      		使用{}花括号
      		内置函数dict()
      		字典生成式
      	常用操作
      		获取value
      			字典名[key]
      			字典名.get(key)
      		删除key-value对
      			del 字典名[key]
      		修改/新增
      			字典名[key]=value
      		in/not in 
    
    3)元祖
    	创建元组
    		使用()小括号
    		内置函数tuple()
    	元组的遍历
    		for--in
    	不可变序列
    
    4)集合
    	创建集合
    		使用{}花括号
    		内置函数set()
    		集合生成式
    	集合的遍历
    		for--in
    	新增
    		add()
    		update()
    	删除
    		remove()
    		discard()
    		pop()
    		clear()		
    	可变序列
    
    
    5)
     数控结构     是否可变  是否重复       是否有序  定义符号
     列表(list)   可变      可重复          有序     []
     元组(tuple)  不可变    可重复          有序     ()
     字典(dict)   可变      key 不可重复    无序     {key:value}
                           value 可重复
     集合(set)    可变      不可重复        无序     {}
    
    

    第五章

    字符窜
    	字符窜的驻留
    		驻留的几种情况
    		驻留的优点
    		强制驻留的方法
    	常用方法
    		查询的方法
    			index(),rindex()
    			find(),rfind()
    		大小写转换
    			upper(),lower()
    		内容对其
    			center()
    		字符窜的劈分
    			split()
    		字符窜判断
    			isdecimal()
    		字符窜的替换
    			replace()
    		字符窜的合并
    			join()
    		字符窜的比较
    			>,<,>=,<=,==,!=
    		字符窜编码
    			%,format()
    
    

    第六章

    函数:
    
    函数的定义与调用
    	函数使用def 定义
    	函数定义的形参
    		* 定义个数可变的位置形参
    		** 定义个数可变的关键字形参
    		定义默认值参数
    	函数调用的实参
    		位置实参
    		关键字实参
    	函数可以多返回值
    
    变量的作用域
    	局部变量
    	全局变量
    递归函数
    	函数本身调用本身
    	递归的组成部分
    		调用条件
    		终止条件	
    
     重要知识点示例:
    1)个数可变的位置参数
    结果为一个元祖
     def fun(*args):
        print(args)
    fun(1,2)
    fun(1,2,3,4,5)
    
    结果:
    (1, 2)
    (1,2,3,4,5)
    
    2)个数可变的关键字形参
    结果为一个字典
    
    def fun1(**args):
        print(args)
    fun1(a=10)
    fun1(a=10,b=20,c=30)
    结果:
    {'a': 10}
    {'a': 10, 'b': 20, 'c': 30}
    
    3)在一个函数定义过程中,既有个数可变的关键字形参,也有个数可变的位置形参,要求,个数可变的位置形参,放在个数可变的关键字形参之前。   
    def fun1(*args1,**args2):
        print(args1,args2)
    
    fun1(1,2,3,a=10,b=20,c=30)
    
    (1, 2, 3) {'a': 10, 'b': 20, 'c': 30}
    
    4)函数内部定义的变量,局部变量,局部变量使用global声明,这个变量实际上就变成了全局变量
    def func5():
        global age
        age=20
        print(age)
    
    func5()
    print(age)
    
    

    第七章

    Bug常见类型
    	粗心导致的语法错误
    		自查宝典
    	知识点不熟悉
    		连练练
    	思路不清
    		print()语句
    		使用 # 注释
    	被动掉坑
    		try...except
    异常处理机制
    	try...except
    	try...except...except
    	try...except...else
    	try...except...else...finally
    	traceback模块打印异常信息
    
    
    1)try except 处理示例:
    try:
        a = int(input('请输入第一个整数')) #可能出现异常的代码
        b = int(input('请输入第二个整数'))
        result = a / b
    except BaseException as e: #将异常起了一个别名为 e
        print('出错了',e)
    else: #else 与 except 二者执行其中一个,如果遇到异常则执行异常,如果是正常就执行else内容
        print('计算结果为:',result)
    finally:    #无论是否异常,总会被执行的代码
        print('感谢使用')
    
    请输入第一个整数:a
    出错了 invalid literal for int() with base 10: 'a'
    感谢使用
    
    
    第二种情况,输入正常,则执行else 内容
    请输入第一个整数:10
    请输入第二个整数:2
    计算结果为: 5.0
    感谢使用
    
    

    第八章

    编程思想
    	面向过程:具体
    	面向对象:宏观
    类对象
    	类属性
    	类方法
    	实例方法
    	静态方法
    实例对象
    	类名(),创建实例对象c
    	动态绑定属性
    	动态绑定方法
    
    类对象拥有:
    类
    id
    type
    valuve
    
    1)
    类的组成
    	类属性:直接写在类里面方法之外的变量,称为类属性,访问类属性,print(Student.native_place)
    	实例方法:在类之外定义的称为函数,在类之内定义的称为方法 ,必须创建类的对象才能调用该方法,stu1=Student('张三',20)  stu1.eat() 即对象名.eat()调用
    	类方法:@classmethod ,使用类名直接访问的方法, print(Student.cm())
    	静态方法:@staticmethod,使用类名直接访问的方法,print(Student.sm())
    
    注意:
    	一个Student 类可以创建N多个Student类的实例对象,每个实体对象的属性值不同(即实例属性不同)
    
    示例:
    class Student: #Student 为类的名称(类名)由一个或多个单词组成,每个单词的首字母大写,其余小写
        native_pace='邯郸' #直接写在类里面的变量,称为类属性
    
        def __init__(self,name,age): #初始化方法
            self.name=name #self.name 称为实例属性,进行了一个赋值的操作,将局部变量的name 的值赋给实例属性
            self.age=age
    
        #实例方法,在类之内定义的称为方法必须有self
        def eat(self):
            print('学生在吃饭')
    
        #静态方法
        @staticmethod
        def method():
            print('我使用了staticmethod 进行修饰,所以我是静态方法')
    
        #类方法,必须有 cls
        @classmethod
        def cm(cls):
            print('我是类方法,因为我使用了 classmethod 进行修饰')
    
    #在类之外定义的称为函数,在类之内定义的称为方法
    def drink():
        print('喝水')
    
    #创建Student 类的对象,即类的对象的创建又称为类的实例化
    stu1=Student('张三',20)
    stu1.eat()
    
    #调用实例属性
    print(stu1.age)
    print(stu1.name)
    
    print('xxxxxxxxxxxxxxxxxxxxxx')
    Student.eat(stu1)  #stu1.eat() 与Student.eat(stu1)  功能相同,都是调用Student 中的eat 方法;
                       #类名.方法名(类的对象) --> 类的对象实际上就是方法定义处的 self
    
    #
    即类的对象的创建又称为类的实例化
    
    2)动态绑定实例属性,必须在创建实例对象之后进行绑定
    stu5=Student('倩倩',18)
    stu6=Student('果果',19)
    stu6.gender='女'
    print(stu5.name,stu5.age)
    print(stu6.name,stu6.age,stu6.gender)
    
    3)动态绑定实例方法,必须在创建实例对象之后进行绑定,当绑定在实例对象之后就叫做方法了
    def show():
        print('定义在类之外的,称为函数')
    stu5.show=show
    stu5.show()
    
    

    第九章

    面向对象的三大特征
    	封装
    	继承
    		多继承
    		方法重写
    	多态
    		动态语言
    			关注对象的行为
    		静态语言
    			继承
    			方法重写
    			父类引用指向子类对象
    object
    	所有类的父类
    	__new__()创建对象
    	__init__()初始化对象
    	__str__()对象的描述
    
    
    1.封装
    2.继承
    3.方法重写
    4.object 类
    5.多态
    6.特殊方法和特殊属性
    
    1)封装
    将实例属性和实例方法包装到类对象中,在方法内部对属性进行操作,在类对象的外部调用
    class Car:
        def __init__(self,brand):
            self.brand=brand
        def Start(self):
            print(self.brand,'is start')
    
    car=Car('宋Pro')
    car.Start()
    print(car.brand)
    结果:
    宋Pro is start
    宋Pro
    
    #不希望在外部被直接调用实例属性
    class Student:
        def __init__(self,name,age):
            self.name=name
            self.__age=age
    
        def show(self):
            print(self.name,self.__age)
    
    stu1=Student('李明',20) 
    stu1.show()
    print('----------------------------------------------')
    print(stu1.name)
    # print(dir(stu1))
    print(stu1._Student__age) #可以在外部直接调用变量
    # print(stu1.__age)
    
    
    李明 20
    ----------------------------------------------
    李明
    20
    
    
    2)继承与多继承
    默认继承 object类
    
    class Person(object): #Person 继承object 类,不写默认是object
        def __init__(self,name,age):
            self.name=name
            self.age=age
        def info(self):
            print(self.name,self.age)
    
    class Student(Person): #继承Person类
        def __init__(self,name,age,stu_nomber): #自身初始化函数,其中name,age必须与父类相同,stu_nomber 是自身独有的属性
            super().__init__(name,age) #继承父类 Person
            self.stu_nomber=stu_nomber 
    
    class Teacher(Person):
        def __init__(self,name,age,teachofyer):
            super().__init__(name,age)
            self.teachofyer=teachofyer
    
    stu1=Student('zhangsan',21,10001)
    teacher1=Teacher('lisi',32,13)
    
    stu1.info()
    teacher1.info()
    
    结果:
    zhangsan 21
    lisi 32
    
    3)方法重写
    如果子类对继承自父类的某个属性或方法不满意,可以在子类中对其(方法体)进行重新编写
    子类重写后的方法中可以通过super().xxx()调用父类中被重写的方法,例如super().info() 
        def info(self):  #info 方法重写
            super().info() #调用父类方法
            print(self.teachofyer)
    
    
    示例如下:
    class Person(object): #Person 继承object 类,不写默认是object
        def __init__(self,name,age):
            self.name=name
            self.age=age
        def info(self):
            print(self.name,self.age)
    
    class Student(Person): #继承Person类
        def __init__(self,name,age,stu_nomber): #自身初始化函数,其中name,age必须与父类相同,stu_nomber 是自身独有的属性
            super().__init__(name,age) #继承父类 Person
            self.stu_nomber=stu_nomber
        def info(self): #info 方法重写
            super().info()  #调用父类方法
            print(self.stu_nomber)
    
    class Teacher(Person):
        def __init__(self,name,age,teachofyer):
            super().__init__(name,age)
            self.teachofyer=teachofyer
        def info(self):  #info 方法重写
            super().info() #调用父类方法
            print(self.teachofyer)
    
    stu1=Student('zhangsan',21,10001)
    teacher1=Teacher('lisi',32,13)
    
    stu1.info()
    print('---------------------------------')
    teacher1.info()
    
    结果:
    zhangsan 21
    10001
    ---------------------------------
    lisi 32
    13
    
    
    #方法重写示例2:
    class Car(object): #定义的类名,默认继承object 类
        def __init__(self,type,number): #类初始化方法,包含self.自身的属性
            self.type=type #类实例属性
            self.number=number
        def start(self): #类方法
            print('我是父类---Start----------------')
        def stop(self): #类方法
            print('我是父类---Stop---------------')
    
    class TaxiCar(Car):  #继承Car 类
        def __init__(self,type,number,company): #类实例的初始化方法,新增加 company 属性
            super().__init__(type,number) #调用父类方法,就是免去了前面两个类实例属性的赋值
            self.company=company #新类实例的属性赋值
        def start(self): #类方法进行重写
            super().start() #类方法调用父类,先输出父类内容
            print('我是%s的,我的车牌号码是 %s,您要去哪里?' %(self.company,self.number)) #方法重写内容
        def stop(self): #类方法进行重写
            print('目的地到了,请您付费下车,欢迎再次乘坐') #直接重写,不调用父类
    
    
    if __name__ == '__main__':
        taxicar=TaxiCar('上汽大众','京A88888','长城出租车公司')  #给类传参
        taxicar.start()
        taxicar.stop()
    
    
    输出内容:
    我是父类---Start----------------
    我是长城出租车公司的,我的车牌号码是 京A88888,您要去哪里?
    目的地到了,请您付费下车,欢迎再次乘坐
    
    
    

    第十章

    模块与包
    模块
    	避免函数名/变量名重名
    	自定义模块
    		一个.py文件称为一个模块
    	第三方模块
    		安装:pip install 模块名
    		使用:from ..import 模块名
    包
    	避免模块名重名
    	包含__init__.py 文件
    
    

    第十一章

    编码格式
    	内存为unicode
    	.py文件为utf-8
    文件操作
    	写
    		writelines()
    		write()
    	读
    		read()
    		readline()
    		readlines()
    	打开模式
    		只读r
    		只写w
    		追加a
    		二进制是b
    目录操作
    	os模块
    	os.path
    
    
    
    读写模式
    	1)文件读 r,文件指针在文件的开头
    	file=open('a.txt','r',encoding='utf-8')
    	print(file.readlines()) #readlines 输出是列表
    	file.close()
    
    	结果:
    	['中国\n', '美丽']
    
    
    	2)文件写 w   以只写模式打开文件,如果文件不存在则创建,如果文件存在,则覆盖原有内容,文件指针在文件的开头
    	file=open('b.txt','w',encoding='utf-8')
    	file.write('Python22')
    	file.close()
    
    	3)文件追加 a ,以追加模式打开文件,如果文件不存在则创建,文件指针在文件开头,如果文件存在,则在文件末尾追加内容,文件指针在文件末尾
    	file=open('b.txt','a',encoding='utf-8')
    	file.write('Python33')
    	file.close()
    
    	b.txt 结果:
    	Python22Python33Python33
    
    	4)以二进制方式打开文件,不能单独使用,需要与其他模式一起使用,rb,或者 wb
    	src_file=open('liang.jpg','rb')
    	target_file=open('copyliang.jpg','wb')
    
    	target_file.write(src_file.read())
    
    	target_file.close()
    	src_file.close()
    
    	5)以读写方式打开文件,不能单独使用,需要与其他模式一起使用,a+
    
    文件对象的常用方法
    	1)read([size]) 从文件中读取size 个字节或字符的内容返回,若省略[size],则读取到文件末尾,即一次读取文件所有内容
    	file=open('a.txt','r',encoding='utf-8')
    	print(file.read())
    	file.close()
    
    	结果:
    	中国
    	美丽
    
    	file=open('a.txt','r',encoding='utf-8')
    	print(file.read(2))
    	file.close()
    	结果:
    	中国
    
    	2)readline(),从文本文件中读取一行内容
    	file=open('a.txt','r',encoding='utf-8')
    	print(file.readline())
    	file.close()
    	结果:
    	中国
    	3)readlines(),把文本文件中每一行都作为独立的字符串对象,并将这些对象放入列表返回
    	file=open('a.txt','r',encoding='utf-8')
    	print(file.readlines())
    	file.close()
    
    	结果:
    	['中国\n', '美丽']
    	
    	4)write(str) 将字符串str 内容写入文件
    	file=open('c.txt','a',encoding='utf-8')
    	file.write('hello')
    	file.close()
    
    	c.txt 结果:
    	hello
    
    	5)writelines(s_list) 将字符串列表 s_list 写入文本文件,不添加换行符
    	file=open('c.txt','a',encoding='utf-8')
    	lst=['a','b','c']
    	file.writelines(lst)
    	file.close()
    
    	c.txt 结果:
    	helloabc
    
    	6)seek(offset[,whence]) 把文件指针移动到新的位置,offset 表示相对于whence 的位置:
    	  offset:为正往结束方向移动,为负往开始方向移动
    	  whence 不同的值代表不同含义:
    	  0:从文件头开始计算(默认值)
    	  1:从当前位置开始计算
    	  2:从文件末尾开始计算
    
    	  注释:一个中文两个字节
    	a.txt内容:
    	pythongojava
    
    
    	file=open('a.txt','r',encoding='utf-8')
    	file.seek(2)
    	print(file.read())
    	print(file.tell())
    	file.close()
    
    	结果:
    	thongojava
    	12
    
    	7)tell() 返回文件指针的当前位置
    	print(file.tell())
    	8)flush()把缓冲区的内容写入文件,但不关闭文件
    
    	9)close() 把缓冲区的内容写入文件,同时关闭文件,释放文件对象相关资源
    
    	file=open('d.txt','a',encoding='utf-8')
    	file.write('hello')
    	file.flush()
    	file.write('world')
    	file.close()
    
    	d.txt结果: 
    	helloworld
    
    	如果将flush与 close 调换位置,则报错:
    	file=open('e.txt','a',encoding='utf-8')
    
    	file.write('hello')
    	file.close()
    
    	file.write('world')
    	file.flush()
    
    	报错:
    	ValueError: I/O operation on closed file.
    
    
    
    
    with 语句(上下文管理器)
    - with 语句可以自动管理上下文资源,不论什么原因跳出with 块,都能确保文件正确的关闭,一次来打到释放资源的目的
    	with open('liang.jpg','rb') as src_file:
    	    with open('liangliang.jpg','wb') as target_file:
    	        target_file.write(src_file.read())
    
    
    	旧代码:
    	src_file=open('liang.jpg','rb')
    	target_file=open('copyliang.jpg','wb')
    
    	target_file.write(src_file.read())
    
    	target_file.close()
    	src_file.close()
    
    
    
    OS 模块操作目录相关函数
    
    os.system('calc.exe') 调用系统计算机
    getcmd() 返回当前的工作目录  
    listdir(path) 返回指定路径下的文件和目录信息 print(os.listdir('../0330'))
    mkdir(path,[,mode]) 创建目录 os.mkdir('aaa')
    makedirs(path1/path2/...[,mode])创建多级目录  os.makedirs('A/b/C')
    rmdir(path)删除目录  os.rmdir('aaa')
    removedirs(path1/path2.....) 删除多级目录  os.removedirs('A/b/C')
    chdir(path) 将path 设置为当前工作目录 
    
    OS.path 模块操作目录相关函数
    obspath(path)  用于获取文件或目录的绝对路径
    exists(path) 用于判断文件或目录是否存在,如果存在返回True,否则返回False
    join(path,name) 将目录与目录或者文件名拼接起来
    splitext() 分离文件名和扩展名
    basename(path) 从一个目录中提取文件名
    dirname(path) 从一个路径中提取文件路径,不包括文件名
    isdir(path) 用于判断是否为路径
    import os.path
    print(os.path.abspath('demon10.py'))
    print(os.path.exists('demon04.py'),os.path.exists('demon044.py'))
    print(os.path.join('E:\\Python','demon10.py'))
    print(os.path.split('E:\\Django\\python\\a.py'))
    print(os.path.splitext('demon10.py'))
    print(os.path.basename('E:\\Django\\python\\a.py'))
    print(os.path.dirname('E:\\Django\\python\\a.py'))
    
    示例:
    1.#获取指定目录下的所有 py 文件
    import os
    path=os.getcwd()
    lst=os.listdir(path)
    
    for file in lst:
        if file.endswith('.py'): #获取以 .py 结尾的文件
            print(file)
    
    
    2.循环遍历嵌套目录下所有文件
    import os
    path=os.getcwd()
    lst_files=os.walk(path)
    for mydirpath,mydirname,myfilename in lst_files:
        # print(mydirpath)
        # print(mydirname)
        # print(myfilename)
        # for dir in mydirname:
        #     print(os.path.join(mydirpath,dir))
    
        for file in myfilename:
            print(os.path.join(mydirpath,file))
        print('------------------------------------')
    
    
    

    日常问题处理

    重点关注:
    一、列表、字符串、文本文件存入修改操作
    1) 列表中存放字典,列表可以直接append 添加字典内容,student_list列表中的每一项都是字典
    student_list=[]
    student={'id':id,'name':name,'english':english,'python':python,'java':java}
    student_list.append(student)
    结果如下:[{'id': '1010', 'name': 'jh', 'english': 21, 'python': 21, 'java': 23}, {'id': '1011', 'name': 'jk', 'english': 23, 'python': 43, 'java': 223}]
    
    2) 文本txt 文件存放列表中的字典内容,需要先将列表中的每一个字典转换为字符串存放,否则会报错: TypeError: write() argument must be str, not dict,如下:
    stu_txt=open(filename,'a',encoding='utf-8')
    for item in student_list:
    	stu_txt.write(str(item)+'\n') 
    stu_txt.close()
    
    
    3) 删除文本中的某一行,student_old 列表中的每一项字典都是字符串类型,操作需要将字符串类型转化为字典
    student_id=input('请输入要删除的学生id:')
    with open(filename,'r',encoding='utf-8') as file:
    student_old=file.readlines()
    
    
    student_old 列表内容如下,可以查看到文本里面存放的是字符串类型
    ["{'id': '1003', 'name': 'kubn', 'english': 123, 'python': 45, 'java': 67}\n", "{'id': '1004', 'name': 'bhs', 'english': 3, 'python': 4, 'java': 6}\n"]
    
    d={}
    with open(filename,'w',encoding='utf-8') as wfile:
      for item in student_old:
    	d=dict(eval(item)) #将字符串转换为字典
    	if d['id']!=student_id:
    		wfile.write(str(d)+'\n') #存放时候再将字典转换为字符串进行存放
    
    
    
    二、格式化输出
                    #定义标题显示格式
                    format_title='{:^6}\t{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^8}\t'
                    print(format_title.format('ID','姓名','英语成绩','Python 成绩','Java成绩','总成绩'))
                    #定义内容的显示格式
                    format_data='{:^6}\t{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^8}\t'
                    for item in student_new:
                        print(format_data.format(item.get('id'),
                                                item.get('name'),
                                                item.get('english'),
                                                item.get('python'),
                                                item.get('java'),
                                                item.get('总成绩')
                                                 ))
    
    输出结果:
      ID  	     姓名     	  英语成绩  	Python 成绩 	  Java成绩  	  总成绩   	
     101  	    xin     	   21   	    22    	    23    	   66  
    
    
    三、匿名函数用作数据排序展示,(reverse=True 降序,reverse=False 升序)
    student_new=[{'id': '103', 'name': 'ki', 'english': 11, 'python': 11, 'java': 11, '总成绩': 33}, {'id': '101', 'name': 'xin', 'english': 21, 'python': 22, 'java': 23, '总成绩': 66}]
    student_new.sort(key=lambda x: int(x['java']), reverse=True)
    
    
    
    
  • 相关阅读:
    经典网址记录
    Python爬虫利器三之Xpath语法与lxml库的用法
    XPath 语法
    import,reload,__import__在python中的区别
    用redis实现队列实例
    代理池抓取基础版-(python协程)--抓取网站(西刺-后期会持续更新)
    selenuim&PhantomJS&Beautifulsoup练习经典实例
    Python面向对象编程(四)
    Python面向对象编程(三)
    Python面向对象编程(二)
  • 原文地址:https://www.cnblogs.com/lixinliang/p/16082615.html
Copyright © 2020-2023  润新知