zoukankan      html  css  js  c++  java
  • python学习第14天----函数复习、面向对象初始

    1.函数回顾

    1)函数的定义:以功能为导向,一个函数就是一个功能,用于简化代码

    2)函数返回值:

    ①return作用

    #结束函数的执行

    #将函数的返回值返回给调用者,即函数名()

    ②如果函数中没有return,默认返回None

    ③如果只有return,也返回None

    ④如果返回多个值(return 1,2,'str'),返回一个元组(1,2,'str')

    3)函数的参数

    ①实参角度

    #位置参数

    #关键字参数

    #混合参数:关键字参数一定在位置参数后面

    ②形参角度

    #位置参数

    #默认值参数:传值就会覆盖,不传值就会使用默认的;默认参数一定在位置参数后面

    #动态参数:*args  **args  当传入的参数不缺定时可使用

             *args可接受所有的位置参数,放置在元组中;即把实参中的所有位置参数聚合到一个元组当作,这个元组赋值给了args

             **kwargs可接受所有的默认值参数,放置在字典中;即把实参中所有的位置参数聚合到一个字典中,然后把这个字典赋值给kwargs

    注:形参顺序:位置参数、*args、默认参数、**kwargs

    def func(*args,**kwargs):
        print(args)
        print(kwargs)
    func(1,2,3,name="阿狸",age=18)
    输出:
    (1, 2, 3)
    {'name': '阿狸', 'age': 18}
    View Code

    补充:

             当定义一个函数的时候,*代表聚合

             当执行一个函数的时候,*代表打散

             print()函数不能接受关键字参数

    def func(*args):
        print(args)
    lst1 = [1,3,5]
    lst2 = [2,4,6]
    func(lst1,lst2)
    func(*lst1,*lst2)  #打散,相当于传入了6个参数
    输出:
    ([1, 3, 5], [2, 4, 6])
    (1, 3, 5, 2, 4, 6)
    View Code

    4)名称空间,作用域

    ①名称空间:当程序执行时,将变量与值对应关系存放在一个空间中

    ②临时名称空间:当函数执行时,将函数中的变量以及值得对应关系放到一个空间中,这个空间会随着函数得结束而消失

    ③内置名称空间:python自带的,如内置函数等

    ⑤作用域

    #全局作用域:内置名称空间+全局名称空间

    #局部作用域:临时名称空间

    ⑥global

    #在函数中声明一个全局变量

    #在函数中修改一个全局变量

    ⑦nonloal

    #在函数中对父级(或者)更高等级的变量进行修改,但是不能修改全局变量

    ⑧函数名的运用:

    #可以作为变量

    #可以作为容器类的元素

    #可以作为函数的参数

    #可以作为函数的返回值

    ⑨函数的嵌套

    ⑩闭包:内层函数对外层函数的变量的引用

    5)迭代器

    #内部含有__ier__并且含有__next__方法

    #节省内存

    #惰性机制

    #一条路走到黑

    6)生成器

    ①字节用python代码写的迭代器

    ②生成器表达式

    #循环模式

    #筛选模式

    2.面向对象

    1)概念

    ①类:具有相同属性和功能的一类事物

    ②对象:具体的类的表现,具体的、真实存在的实例

    2)定义类

    ①语法:

             class 类名:

                       类体(变量部分+函数部分)

    3)以类名的角度,操作类中的静态变量:

    #法一:

    类名.__dict__     查询类中所有的内容

    注:只能通过__dict__对类中的静态变量进行查询,不能对类中变量进行增删改

    class Student:
        id = "学号"      #静态变量
        name = "名字"
        age = "年龄"
    
        def sleep(self):     #动态变量
            print("睡觉")
        def sleep(self):
            print("学习")
    print(Student.__dict__)
    print(Student.__dict__['name'])
    输出:
    {'__weakref__': <attribute '__weakref__' of 'Student' objects>, '__module__': '__main__', 'age': '年龄', 'sleep': <function Student.sleep at 0x000002B327E3C0D0>, 'id': '学号', '__doc__': None, '__dict__': <attribute '__dict__' of 'Student' objects>, 'name': '名字'}
    名字
    View Code

    #法二:通过 【类名.静态变量】的方式对类中的单个变量进行增删改查

    class Student:
        id = "学号"      #静态变量
        name = "名字"
        age = "年龄"
    
        def sleep(self):     #动态变量
            print("睡觉")
        def sleep(self):
            print("学习")
    print(Student.name)
    输出:
    名字
    View Code

    #可通过类名.静态变量的方式对类中的静态变量进行增删改查

    class Student:
        id = "学号"      #静态变量
        name = "名字"
        age = "年龄"
    
        def sleep(self):     #动态变量
            print("睡觉")
        def sleep(self):
            print("学习")
    Student.email = "邮箱"
    print(Student.__dict__)
    输出:
    {'__weakref__': <attribute '__weakref__' of 'Student' objects>, 'age': '年龄', '__doc__': None, '__module__': '__main__', 'name': '名字', 'id': '学号', '__dict__': <attribute '__dict__' of 'Student' objects>, 'sleep': <function Student.sleep at 0x000002708900B0D0>, 'email': '邮箱'}
    View Code

    4)以类名的角度,操作类中的动态变量(即函数):

    #以【类名.函数名()】的方式执行函数,但是需要传参数,因为函数默认有一个位置参数---基本不用类名去操作函数,而是通过对象的方式

    class Student:
        id = "学号"      #静态变量
        name = "名字"
        age = "年龄"
    
        def sleep(self):     #动态变量
            print("睡觉")
        def sleep(self):
            print("学习")
    Student.sleep(111)
    输出:
    学习
    View Code

    5)以对象的角度

    ①实例化一个对象(即创建一个对象,也叫产生一个类名空间)

             类名() ----------实例化对象(即类名+()的过程,就是实例化的过程、就是创建对象的过程)

             如:Student()

    class Student:
        def __init__(self,id,name,age):
            id = id
            name = name
            age = age
        def study(self):
            print("学习。。。。")
    Student(101,"阿狸","16")     #实例化过程,即常见对象的过程;整体叫做实例,即对象
    View Code

    注:只要类名+()产生一个对象,自动执行类中的__int__方法

    ②只要通过【类名()】产生一个对象,自动执行类中的__init__方法

    class Student:
        def __init__(self):
            print("初始化方法")
    Student()
    输出:
    初始化方法
    View Code

    ③【类名()】产生一个内存地址(就相当于开辟了一个内存空间),然后【类名()】自动执行__init__()方法,然后把对象的内存地址传入了__init__()方法的形参self,所以打印self的值和对象地址是一样的

    class Student:
        def __init__(self):
            print(self)
            print("初始化方法")
    ret = Student()
    输出:
    <__main__.Student object at 0x00000168A0745EB8>
    初始化方法
    <__main__.Student object at 0x00000168A0745EB8>
    View Code

    ④以对象的角度,对类中变量进行增删改

    class Student:
        def __init__(self, id, name, age):
            self.id = id
            self.name = name
            self.age = age
            print(id, name, age)
    ret = Student(101, "阿狸", "16")  # 实例化过程,即常见对象的过程
    ret.higt = "165"  #增加
    del ret.age     #删除
    ret.name = "九尾妖狐"     #修改
    print(ret.__dict__)
    输出:
    101 阿狸 16
    {'higt': '165', 'name': '九尾妖狐', 'id': 101}
    View Code

    注:对象只能对类中的静态变量进行查询,不能增删改

    ⑤通过对象名调用类中的方法,方法第一个参数self是不用传实参的

    3.类、对象

    1)__init__()方法-------给对象封装相应的属性

    ①实例化一个对象后,会把对象的内存地址传给__init()方法的第一个位置参数(约定俗成为self)

    class Student:
        def __init__(a):
            print(a)
    ret = Student()
    print(ret)
    输出:
    <__main__.Student object at 0x00000240C8785EB8>
    <__main__.Student object at 0x00000240C8785EB8>
    View Code

    ②__init__()其他的位置参数,在创建对象时在【类名()】的括号中写入

    class Student:
        def __init__(self, id, name, age):
            id = id
            name = name
            age = age
            print(id, name, age)
    Student(101, "阿狸", "16")  # 实例化过程,即常见对象的过程
    输出:
    101 阿狸 16
    View Code

    总结:实例化一个对象,产生一个对象空间,然后自动执行类中的__init__()方法,然后将对象空间传给__init__()方法的第一个参数,并且将其他实参传递给__init__()函数的其他形参;然后再在__init__()方法中为对象的地址增加变量

    class Student:
        def __init__(self, id, name, age):
            self.id = id
            self.name = name
            self.age = age
            print(id, name, age)
    Student(101, "阿狸", "16")  # 实例化过程,即常见对象的过程
    输出:
    101 阿狸 16
    View Code

    #可通过__dict__()查看类中的所有变量

    class Student:
        def __init__(self, id, name, age):
            self.id = id
            self.name = name
            self.age = age
            print(id, name, age)
    ret = Student(101, "阿狸", "16")  # 实例化过程,即常见对象的过程
    print(ret.__dict__)
    输出:
    101 阿狸 16
    {'id': 101, 'name': '阿狸', 'age': '16'}
    View Code

    补充:

    ①__init__()方法就是构造方法

    ②操作类中的方法:除了类方法、静态方法需要类名调用之外,剩下的方法都要对象调用

    ③除了类方法和静态方法,所有的方法的第一个参数都是self;所以都可以通过对象名调用类中的方法(即将对象空间传递给了方法的第一个参数self)

    4.练习

    1.完成如下功能

    1)创建一个Person类,在类中创建三个静态变量(静态字段)

    mind= "能思考"

    age = "有肤色"

    language = "能说话"

    2)在类中定义三个方法,吃饭,睡觉,工作.

    3)在此类中的__init__方法中,给对象封装5个属性:国家,姓名,性别,年龄,
    ①实例化四个人类对象:
      第一个人类对象p1属性为:德玛西亚,拉克丝,女,18,165
      第二个人类对象p2属性为:诺克萨斯,卡特,女,20,170
      第三个人类对象p3属性为:均衡教派,劫,男,26, 178
      第四个人类对象p4属性为:p1的国籍,p2的名字,p3的性别,p2的年龄,p3 的身高.

    ②通过对象执行方法

    通过p1对象执行吃饭方法,方法里面打印:拉克丝在吃饭.

    通过p2对象执行吃饭方法,方法里面打印:卡特在吃饭.
    通过p3对象执行吃饭方法,方法里面打印:(p3对象自己的名字)在吃饭.
    通过p1对象找到Person的静态变量 mind
    通过p2对象找到Person的静态变量 skin
    通过p3对象找到Person的静态变量 language

    class Person:
        mind = "能思考"
        skin = "有肤色"
        language = "能说话"
        def __init__(self,country,name,sex,age,hight):
            self.country = country
            self.name = name
            self.sex = sex
            self.age = age
            self.hight = hight
        def eat(self):
            print("%s在吃饭" % self.name)
        def sleep(self):
            print("睡觉")
        def work(self):
            print("工作")
    p1 = Person("德玛西亚","拉克丝","",18,165)
    p2 = Person("诺克萨斯","卡特","",20,170)
    p3 = Person("均衡教派","","",26,178)
    p4 = Person(p1.country,p2.name,p3.sex,p2.age,p3.hight)
    p1.eat()
    p2.eat()
    p3.eat()
    print(p1.mind)
    print(p2.skin)
    print(p3.language)
    输出:
    拉克丝在吃饭
    卡特在吃饭
    劫在吃饭
    能思考
    有肤色
    能说话
    View Code

    2.写一个类,输入名字,年龄,性别,爱好

    如小明 10岁 男 最爱打篮球

      小明 10岁 男 喜欢吃苹果

      小花 12 女 喜欢吃苹果

    class Hobby:
        def __init__(self,name,age,sex):
            self.name = name
            self.age = age
            self.sex = sex
        def sports(self):
            print("%s %s %s最爱打篮球"% (self.name,self.age,self.sex))
        def fruits(self):
            print("%s %s %s喜欢吃苹果" % (self.name,self.age,self.sex))
    h1 = Hobby("小明",18,"")
    h2 = Hobby("小花",15,"")
    h1.sports()
    h1.fruits()
    h2.fruits()
    输出:
    小明 18 男最爱打篮球
    小明 18 男喜欢吃苹果
    小花 15 女喜欢吃苹果
    View Code
    学习来源:https://www.bilibili.com/video/BV1sE411D7qf
  • 相关阅读:
    luogu4182 [USACO18JAN] Lifeguards P (单调队列优化dp)
    bzoj3277 串 (后缀数组+二分答案+ST表)
    [模板]后缀数组
    bzoj4361 isn (dp+树状数组+容斥)
    luogu4187 [USACO18JAN]Stamp Painting (dp)
    [USACO15DEC]高低卡(白金)High Card Low Card (Platinum)
    USACO环绕岛屿Surround the Islands 并查集 枚举暴力
    5.7 ~ 5.12 刷题列表
    5.4 ~ 5.6 刷题记录
    HNOI2012 永无乡 无旋Treap
  • 原文地址:https://www.cnblogs.com/piaolaipiaoqu/p/13862247.html
Copyright © 2011-2022 走看看