美文网首页Python语言_七月在线我爱编程
(2018-03-22)0004.Python基础入门班_第4课

(2018-03-22)0004.Python基础入门班_第4课

作者: lyh165 | 来源:发表于2018-03-23 15:08 被阅读26次

    上一篇文章:(2018-03-21)0003.Python基础入门班_第3课、容器以及容器的访问使用

    关于本人

    个人信息:微博
    写作区:个人博客简书开源中国豆瓣、掘金、CSDN
    代码管理区:码云GitHubGitBookPython_NoteBook(这个仅仅限于自己的本地搭建)
    我的网络制作书籍:Python3Book(基于廖雪峰的Python教程编写成书)
    july_Oneline(基于七月在线培训机构的教程编写成书)LineCode刷题总结__GitBookEditor网络书籍


    推荐网站

    1.第三方库__scipy
    2.第三方库__sklearn(安装之前需要安装,numpy、scipy)
    3.什么是ML
    4.什么是测试集
    5.sklearn的作用


    推荐软件


    推荐书籍


    第4课 面向对象基础


    一、类和对象
    百度维基

    类和对象(class)是两种以计算机为载体的计算机语言的合称。
    对象是对客观事物的抽象,类是对对象的抽象。类是一种抽象的数据类型。
    它们的关系是,对象是类的实例,类是对象的模板。
    对象是通过new className产生的,用来调用类的方法;类的构造方法 。
    

    自身理解

    人类 是 类
    我们每个人 都是对象。
    是通过人类演化而成的一个个对象
    
    

    代码展示

    #一、类和对象
    print('一、类和对象')
    class Foo:
        # 这里我们可以创建一个类级别的变量
        # 它不会随着由此类创建的变量而变化
        name = 'lyh'
    
        def bar(self): # 第一参数的指向
            print('Bar')
        def hello(self,name):
            print('you are %s' %self.name)
            print('i am %s'%name)
            print('\n')
        pass
    
    # 根据Foo创建的对象
    obj = Foo()
    obj2 = Foo() 
    print(obj)
    obj.bar()
    obj.hello('lyh')
    obj2.hello('h')
    print('!end!\n')
    

    控制台打印

    一、类和对象
    <__main__.Foo object at 0x013D7CB0>
    Bar
    you are lyh
    i am lyh
    
    
    you are lyh
    i am h
    
    
    !end!
    

    二、构造函数
    百度维基

    构造函数:是一种特殊的方法。
    只要用来在创建对象时 初始化对象,即为对象成员变量赋初始值
    
    

    自身理解

    自己创建一些函数
    

    代码展示

    #二、构造函数
    '构造函数:是一种特殊的方法。只要用来在创建对象时 初始化对象,即为对象成员变量赋初始值'
    print('二、构造函数')
    class Foo:
        name = 'l'
        def __init__(self): #这就是构造函数,它的职责是在模型创建的初期,就完成一些动作
            # 简单的说就是,自定义的初始化步骤:
            # 同样,他需要self来指代本身这个class
            self.name = 'll'
    
        def __init__(self,name2): #你可以在这里附加上一些参数
            # 这些参数僵尸你创建一个Foo类时的必要条件
            self.name = name2
    
        def hello(self,name):
            print('you are %s' %self.name)
            print('i am %s'%name)
    
    # obj = Foo()
    obj.hello('a')
    obj2 = Foo('lll')
    obj.hello('b')
    print('!end!\n')
    

    控制台打印

    二、构造函数
    you are lyh
    i am a
    
    
    you are lyh
    i am b
    
    
    !end!
    

    三、访问限制
    自身理解

    能不能访问
    

    代码展示

    #三、访问限制
    '''
    变量 是否能给外界访问
    如果不能 怎么在创建类的时候设置
    
    在变量的前面添加两个__
    '''
    print('三、访问限制')
    class Stundet:
        def __init__(self,name,age):
            # 外界能访问的变量
            # self.name = name
            # self.age = age    
    
            # 外界不能访问的变量 
            self.__name = name # AttributeError: 'Stundet' object has no attribute 'name'
            self.__age = age    
        def detail(self):
            print(self.__name)
            print(self.__age)
    Lyh = Stundet('Lyh',12)
    Lyh.age = 20 
    Lyh.detail()
    print('!end!\n')
    

    控制台打印

    三、访问限制
    Lyh
    12
    !end!
    

    四、Getter + Setter
    getter 和 setter的作用

    setter方法,是对象引用调用setter方法,并传入参数。
    getter方法,对象调用getter方法,获取对象属性的值。
    

    自身理解

    get 获取对象属性值
    set 设置对象属性值
    

    代码展示

    #四、Getter + Setter
    '''
    如何确保安全,又能被外部修改变量
    '''
    print('四、Getter + Setter')
    class Student(object): # (object),表示该类是从哪个类继承下来的
        def get_name(self):
            return self.__name
        def get_age(self):
            return self.__age
    
        def set_age(self):
            self.__age = age
    print('!end!\n')
    

    控制台打印

    四、Getter + Setter
    !end!
    

    五、Python的面向对象三大特性、python的经典类和新类(现在基本都是用新类)
    封装、继承、多态的基本知识
    自身理解

    封装:将一些东西收藏起来
    继承:子继承父业
    多态:很多钟表示状态
    

    代码展示

    #五、Python的面向对象三大特性
    '''
    封装:指的是把内容封装到某个地方,用于日后调用
    其实就是使用构造方法将内容封装到对象中,
    然后通过对象直接 或者self间接获取被封装的内容
    
    继承:儿子继承父亲
    爸爸有的儿子都有
    
    多态:
    
    Python可以多类继承
    '''
    print('五、Python的面向对象三大特性')
    #1.封装
    class Student(object):
        def __init__(self,name,age):
            self.name = name
            self.age = age
        def detail(self):
            print(self.name)
            print(self.age)
    obj1 = Student('lyh',12)
    print(obj1.name) # 直接调用obj1对象的name属性
    print(obj1.age) # 直接调用obj1对象的age属性
    obj1.detail() #自我调用
    print('!~~~!\n')
    
    #2.继承
    class PrimaryStudent(Student): #因为是继承于学生类,所以我们卸载括号内
        # 这里我们可以不写构造函数,于是我们就是直接引用Student的构造函数
        def lol(self) : # 我们有一些新的独有方法,会被叠加起来
            print('开打开打')
    class CollegeStudent(Student):
        #改写父类的构造函数
        def __init__(self,name,age,gf):
            #于是爸爸的init会被直接 overwrite(重写掉)
            self.name = name
            self.age = age
            self.gf = gf
        def gf_detail(self):
            print(self.gf)
    
    ''''''
    obj1 = PrimaryStudent('小了',3)
    obj1.lol() #独有方法
    obj1.detail() #继承与爸爸的方法
    print('!~~~!\n')
    obj2 = CollegeStudent('李',22,'H')
    obj2.detail()
    obj2.gf_detail()    
    print('!~~~!\n')
    # Python可以多类继承
    class D:
        def bar(self):
            print('D.bar')
    class C(D):
        def bar(self):
            print('C.bar')
    class B(D):
        pass
    class A(B,C): # A 继承两个 爸爸 B、C
        pass
    
    a = A()
    # -- 经典类
    # 执行bar方法时
    # 首先去A类中查找,如果A类中没有,则继续去B类中找,如果B没用,
    # 则继续去D类中找,如果D没有,则继续去C类中找,如果还是没有找到则报错
    # 顺序 A -> B -> D -> C # 注意 这是之前python2.2的经典类顺序
    
    # ** 新类(python3.x)
    # 首先去A类中查找,如果A类中没有,则继续去B类中找,如果B没用,
    # 则继续去C类中找,如果C没有,则继续去D类中找,如果还是没有找到则报错
    # 顺序 A -> B -> C -> D # 注意 这是新类顺序
    a.bar()
    
    # 多态
    '''
    python 不支持多态并且也用不到多态,多态的概念是应用于java 和 C#这一类强类型语言
    ,而python 是 鸭子类型
    '''
    class F1:
        pass
    # 假设 ,S1是我们的正统类,它继承与根正苗红的F1,
    class S1(F1):
        def show(self):
            print('S1.show')
    # S2是路人甲
    class S2:
        def show(self):
            print('S2.show')
    def Func(obj):
        obj.show()
    s1_obj = S1()
    s2_obj = S2()
    Func(s1_obj)
    Func(s2_obj)
    print('!end!\n')
    

    控制台打印

    五、Python的面向对象三大特性
    lyh
    12
    lyh
    12
    !~~~!
    
    开打开打
    小了
    3
    !~~~!
    
    李
    22
    H
    !~~~!
    
    C.bar
    S1.show
    S2.show
    !end!
    

    六、获取对象信息(dir()的作用、实例对象和类对象、模块和包)
    自身理解

    获取人、事物的信息
    

    代码展示

    #六、获取对象信息
    print('六、获取对象信息')
    print(type(123))
    print(type('str'))
    print(type(None))
    print(type(abs))
    
    print('用语句进行获取对象信息')
    # 用语句进行获取对象信息
    print(type(123) == type(456))
    print(type('123') == type('456'))
    print(type('123') == type(456))
    print(type('123') == type(str))
    print(type([]) == type(list))
    
    print('isinstance')
    # isinstance : 可以告诉我们,一个对象是不是某种类型(包含继承关系)
    class A:
        pass
    class B(A):
        pass
    class C(B):
        pass
    k = A()
    g = B()
    y = C()
    print(isinstance(y,C))
    print(isinstance(y,B))
    
    print('## 使用dir()')
    ## 使用dir()
    '''
    如果要获取一个对象的所有属性和方法,可以使用dir()函数,
    它会返回一个包含字符串的list
    比如,获取一个str对象的所有属性和方法
    '''
    print(dir('ABC'))
    print('ABC'.__len__())
    
    # dir() 
    '''
    配合
    getattr(),
    setattr(),
    hasattr() 有没有这个属性
    '''
    class MyObject:
        def __init__(self):
            self.x = 9
        def power(self):
            return self.x * self.x
    obj = MyObject()
    
    print(hasattr(obj,'x')) # 有没有x这个属性
    print(hasattr(obj,'power')) # 有没有power这个属性
    print(hasattr(obj,'y')) # 有没有y这个属性
    print(setattr(obj,'y',19)) # 设置y这个属性
    print(getattr(obj,'y')) # 获取y这个属性
    fn = getattr(obj,'power') # 获取属性'power'并赋值到变量Fn里面
    print(fn()) # 调用 fn() 相当于调用 obj.fn()
    
    # 实例属性 和 类属性
    '''
    类创建的实例 可以任意绑定属性
    给实例 绑定属性的方法是通过 实例变量,或者通过self变量
    '''
    class Student(object):
        name = 'Student' # 类属性
        def __init__(self,name):
            self.name = name # 实例属性
    
    s = Student('boy')
    s.score = 90
    print(s.name) 
    
    
    class Student(object):
        name = 'Student' # 类属性
    s = Student() # 创建实例s
    print(s.name) # 打印name属性,因为实例并没有name属性,所以会执行查找class的name属性
    print(Student.name) # 打印类的name属性
    s.name = 'LYH' #给实例绑定name属性
    print(s.name) # 由于 实例属性优先级比类属性高,因此,他会屏蔽类的name属性
    print(Student.name) # 但是类属性并未消失,用Student.name仍然可以访问
    del s.name # 删除实例的name属性
    print('123'+s.name) # 再次调用s.name 由于实例的name属性没有找到,类的name属性就显示出来了
    
    
    
    print('## 模块 和 包')
    ## 模块 和 包
    '''
    python的程序 由 包(package)、模块(module) 和函数组成。
    包是 由 一系列模块组成的集合。
    模块是处理某一类问题的函数 和 类的集合。
    
    包 就是一个完成特定任务的工具。python提供了许多有用的工具包,如字符串处理、
    图形用户接口、web应用、图形图像处理等。
    这些自带的工具包和模块安装在python的安装目录下的Lib子目录中
    '''
    
    # 包
    '''
    包将有联系的模块组织在一起,有效避免模块名称冲突问题,让应用组织结构更加清晰。
    一个普通的python应用程序的目录结构:
    app/
    __init__.py
    a/
    __init__.py
    a.py
    b/
    __init__.py
    b.py
    
    app是最顶层的包,a和b是它的子包,可以这样导入
    from app.a import a
    from app.b.b import test
    a.test()
    test()
    
    '''
    # 模块
    '''
    在python中一个文件可以被看成一个独立模块,而包对应着文件夹。模块把python代码
    分成一些有组织的代码段,通过导入的方式实现代码重用
    import sys
    print(sys.path)
    '''
    import sys
    print(sys.path)
    # 导入模块
    # import module1
    
    #使用from-import语句导入模块的属性
    # 单行导入
    # from module import name1
    
    #多行导入
    # from module import name1,name2,name3
    # from module import * # 导入所有
    # 自定义导入模块名称
    # from A import B as BoyFunc
    print('!end!\n')
    
    

    控制台打印

    六、获取对象信息
    <class 'int'>
    <class 'str'>
    <class 'NoneType'>
    <class 'builtin_function_or_method'>
    用语句进行获取对象信息
    True
    True
    False
    False
    False
    isinstance
    True
    True
    ## 使用dir()
    ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
    3
    True
    True
    False
    None
    19
    81
    boy
    Student
    Student
    LYH
    Student
    123Student
    ## 模块 和 包
    ['C:\\Users\\Hasee\\Desktop\\Python_七月在线\\01-Python课程___Python基础入门班\\Code\\第4课 面向对象基础', 'C:\\Users\\Hasee\\AppData\\Local\\Programs\\Python\\Python35-32\\python35.zip', 'C:\\Users\\Hasee\\AppData\\Local\\Programs\\Python\\Python35-32\\DLLs', 'C:\\Users\\Hasee\\AppData\\Local\\Programs\\Python\\Python35-32\\lib', 'C:\\Users\\Hasee\\AppData\\Local\\Programs\\Python\\Python35-32', 'C:\\Users\\Hasee\\AppData\\Local\\Programs\\Python\\Python35-32\\lib\\site-packages']
    !end!
    

    七、实战
    自身理解

    将学习的东西 用在战场上。
    

    代码展示

    print('七、实战')
    #七、实战
    '''
    下载 sklearn 包
    http://scikit-learn.org/stable/install.html
    
    iris(鸢尾花)
    http://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_iris.html
    
    在ML里面 
    基本都会 X 判断 Y 的问题
    X 基本就是
    
    Y 基本就是
    
    ML:
    机器学习[1]  (Machine Learning),是研究计算机怎样模拟或实现人类的学习行为,
    以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。
    它是人工智能的核心,是使计算机具有智能的根本途径,
    其应用遍及人工智能的各个领域,它主要使用归纳、综合而不是演绎。
    '''
    from sklearn import svm,datasets 
    # datasets数据库、svm:upport Vector Machine 分类器(支持向量机)
    '''
    最好把 dataset 写成一个文件
    '''
    class Dataset:
        # 我们创建一个dataset的类,这个类会帮我们下载相关的数据集
        # 并给我们分类好x,y
        def __init__(self,name):
            # 告诉类,我们需要那个数据集
            # 我们有两个选择,一个是'iris',一个是'digits'
            self.name = name
        def download_data(self): # 1、下载数据
            # 从sklearn的自带集中下载我们制定的数据集
            if self.name =='iris':
                # 这里是sklearn自带的数据集下载方法,更多信息可以参考官网
                self.download_data = datasets.load_iris()
            elif self.name == 'digits':
                self.download_data = datasets.load_digits()
            else:
                # 如果不是我们预想的两个数据集,则报错
                print('DataSet Error : No Named datasets')
    
        def generate_xy(self): # 2、创造x,y
            # 通过这个过程 来把我们的数据集 分为原始数据 以及他们的label
            # 我们先把数据下载下来
            self.download_data() # 传接download_data参数
            x = self.download_data.data # data 是 x
            y = self.download_data.target # target 是 y
            print('\n Original data looks like this :\n',x)
            print('\n Labels looks Like this:\n',y)
            return x,y
        def get_train_test_set(self,ratio): # 3、数据分成训练、测试集
            # 这里,我们把所有的数据分成训练集 和 测试集
            # 一个参数要求我们告知,我们以多收的比例来分割训练和测试集
            # 首先,我们把XY给generate出来
            x,y = self.generate_xy()
    
            # 有个比例,我们首先得知道 一共有多少的数据
            n_samples = len(x)
    
            #于是我们知道,有多少应该是训练集,多少应该是测试集
            n_train = n_samples * ratio
            # 好了,接下来 我们分割数据
            X_train = x[:n_train] # X训练集
            y_train = y[:n_train] # Y训练集
            X_test = x[n_train:] # X测试集
            y_test = y[n_train:] # Y测试集
            # 好,我们得到了所有想要的玩意儿
            return X_train,y_train,X_test,y_test
    # === 我们的dataset类创造完毕===
    
    
    # 使用digits 数据集
    data = Dataset('digits')
    # 接着,我们可以用0.7 的分割率 把 xy给分割出来
    X_train,y_train,X_test,y_test = data.get_train_test_set(0.7)
    
    '''
    同样,我们也不一定需要自己创造类,我们可以引用第三方库里的类,
    比如这里,我们用SVM作为我们的分类器,去训练我们的算法
    我们就直接建造一个object,使他成为SVM类
    
    '''
    clf = svm.SVC() 
    '''
    这里clf是classifier的简称,SVC指的是SVM的classification版本。
    因为我们的数据集都是分类问题,所以我们使用SVC()
    接下来,我们fit我们的数据(也就是训练我们的数据)
    显然,做fit的时候,我们只可以使用训练集
    '''
    clf.fit(X_train,y_train)
    print(clf.fit(X_train, y_train))
    
    # 拿出数据进行测试
    test_point =X_test[12]
    y_true = y_test[12]
    # clf.predict(test_point) # 看clf给出的预测是什么
    print(clf.predict(test_point.reshape(1,-1))) # 输出 [7]
    print(y_true) # 打印 7
    
    
    '''
    正确!
    那么这样,你们已经学会如何训练数据集并作出新的预测了。
    把所有的测试集都导入clf,让他pridict,并看看跟真实的label相差多少。
    '''
    print('!end!\n')
    
    

    控制台打印

    七、实战
    
     Original data looks like this :
     [[  0.   0.   5. ...,   0.   0.   0.]
     [  0.   0.   0. ...,  10.   0.   0.]
     [  0.   0.   0. ...,  16.   9.   0.]
     ..., 
     [  0.   0.   1. ...,   6.   0.   0.]
     [  0.   0.   2. ...,  12.   0.   0.]
     [  0.   0.  10. ...,  12.   1.   0.]]
    
     Labels looks Like this:
     [0 1 2 ..., 8 9 8]
    C:\Users\Hasee\Desktop\Python_七月在线\01-Python课程___Python基础入门班\Code\第4课 面向对象基础\面向对象基础.py:442: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future
      X_train = x[:n_train] # X训练集
    C:\Users\Hasee\Desktop\Python_七月在线\01-Python课程___Python基础入门班\Code\第4课 面向对象基础\面向对象基础.py:443: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future
      y_train = y[:n_train] # Y训练集
    C:\Users\Hasee\Desktop\Python_七月在线\01-Python课程___Python基础入门班\Code\第4课 面向对象基础\面向对象基础.py:444: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future
      X_test = x[n_train:] # X测试集
    C:\Users\Hasee\Desktop\Python_七月在线\01-Python课程___Python基础入门班\Code\第4课 面向对象基础\面向对象基础.py:445: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future
      y_test = y[n_train:] # Y测试集
    SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
      decision_function_shape='ovr', degree=3, gamma='auto', kernel='rbf',
      max_iter=-1, probability=False, random_state=None, shrinking=True,
      tol=0.001, verbose=False)
    [7]
    7
    !end!
    

    代码:74nf

    明天将会更新→0005.Python基础入门班_第5课、文件访问与函数式编程入门

    代码都是上传百度云

    相关文章

      网友评论

        本文标题:(2018-03-22)0004.Python基础入门班_第4课

        本文链接:https://www.haomeiwen.com/subject/hninqftx.html