Python学习DAY2(上)|函数与面向对象的编程方法

发布于:2023-01-04 ⋅ 阅读:(393) ⋅ 点赞:(0)

本笔记摘录清华大学工业工程系朱成礼老师的python教案与授课内容,并在此基础上进行实操性的拓展,希望能对大家有所帮助。

 一、函数

1、函数的定义与调用

1.1 一些注意事项

 

注意:要记得添加文档字符串(三个双引号),对函数进行说明(也有缩进);

规则:三个引号不单独在一行;若包含多行,最后一行三个引号单独占一行;

函数可以return多个返回值(实际上是一个值,打成了tuple包,接收时自动解包);

函数传默认值(形参)时,等号两边无空格;

可用内置函数help()查看文档字符串的内容;

使用之前一定要先定义,定义函数的顺序是可变的,但是核心原则是:调用函数之前一定要保证函数已经被定义。

模块级的函数定义,与其他代码之间要空两行。

2、函数的参数传递

(1)传参传的是不可变类型的对象a(数字、字符串、元组):在函数内部修改a的值,在函数外面的a值不变。

(2)传参传的是可变类型的对象a(列表、字典和集合):在函数内部修改a的值,在函数外面的a值改变。示例如下:

 1.1 函数的参数传递形式

注意(4)可变长参数

一个*:收纳多余的位置参数的袋子 

两个**:收纳多余的关键字参数的袋子

1.2 装包与解包

*前的参数不能有关键字参数,*后的参数必须有关键字参数(x=) 

 1.3 lambda表达式

 使用环境:没有函数名字的临时使用的小函数

lambda函数内引用的变量在函数体外不可见

g = lambda x :x * 2
print(g(3))


f = lambda x, y, z : x+y+z
print(f(1,2,3))

3、变量的作用域(!!!)

在python中,只有模块、类与函数,才会引入新的作用域,函数内引用的变量,在外面是不能访问的。但是像if和for这类逻辑语句引用的变量,外面也可以访问。

要是想在函数体内改变一个全局变量,需要在函数体内添加: global num_2(且不能在这句话中给变量赋值)。

搜索变量名的优先级:局部作用域>嵌套作用域>全局作用域。

二、函数模块化

1、函数模块化

函数模块化的目的其实就是为了实现代码重用,我们将函数、变量和类放在独立的.py文件中,就形成了一个模块。我们既可以使用系统中的标准模块,也可以下载拓展模块,还可以自己创作自己的模块来使用。在导入模块时,我们有如下所示的几种方法:

import testtest  # 导入了一个testtest.py的文件
from testtest import trisquare, cirsquare  # 导入了testtest文件中的两个函数trisquare和cirsquare
from testtest import trisquare as tri  # 导入在testtest文件中的trisquare,并将其名字修改为tri
import testtest as test  # 导入testtest文件,并将其名字改为test

 2、函数模块中的name属性

if __name__ == '__main__':
    trisquare(3,4,5)

对于像这样的一段代码段,当我们把他添加进模块里面时,就表示“只有当此模块不被import,自己就是主角的时候,trisquare这个函数才会运行。当模块被导入到其他程序中时,这段代码不会执行” 

3、Python中包的组织

包是由一些模块集成而来的一个package,我突然想起"A New Level of Constraction",没错就是新一层的抽象,与模块的原理相同,我们也可以导入包。而模块与包的import或者from import语句是那样的近似以至于我不想再细说啦~

三、面向对象的编程思想

1、类的定义与使用

类名首字母必须大写,多个单词组成,可采用驼峰命名法

def __init__(self, )构造函数,创建实例时自动执行

def __del__(self)析构函数,类消亡时执行

类内的函数定义,中间空1行

self指的是类自己,类本身,要放在所有函数的最左边,要用self.+实例自己的名字

可以定义多个构造函数,但只有最后一个起作用

类实例化:传递参数传递给构造函数

调用时:实例名.类内函数

私有变量:两个下划线__开头,对外不可见,类内方法可访问。如:self.__maker = 0

2、类的继承

super().__init__(maker, model, year)  # 表示子类对父类中有的变量进行了析构

self.battery = 75  # 类的继承,同时对父类构造函数进行了重写

3、类的模块化

道理与模块近似,综合以上,有如下实例。

class Car:
    """模拟一个小汽车,定义其属性:
    制造商、汽车型号、生产日期、车牌号、
    乘客数、行驶里程和行车速度
    """

    def __init__(self, maker, size, date, passenger, km, speed):
        # 构造函数
        self.maker = maker
        self.size = size
        self.date = date
        self.passenger = passenger
        self.km = km
        self.speed = speed
        self.__number = 12345

    """写出car的方法:加速、减速、修改行驶里程、查询车辆属性"""

    def speedup(self, speed):
        # 加速
        speed = speed + 5
        return speed

    def slowdown(self, speed):
        # 减速
        speed = speed - 5
        return speed

    def changekm(self, km):
        # 改变里程
        a = float(input("你想让你的里程增加多少"))
        km = km + a
        return km

    def get_description(self):
        # 查询车辆属性
        long_name = f'{self.maker} {self.size} {self.date} {self.passenger} {self.km} {self.speed}'
        return long_name.title()

    def __del__(self):
        # 析构函数
        print("Car Deleted")

class ElectricCar(Car):
    def __init__(self, maker, size, date, passenger, km, speed, batterynode, batterysize, keeprunkm):
        # 构造函数
        super().__init__(maker, size, date, passenger, km, speed)
        self.batterynode = batterynode
        self.batterysize = batterysize
        self.keeprunkm = keeprunkm

    def charge(self, batterysize, keeprunkm):
        # 充电
        while batterysize < 10000:
            batterysize = batterysize + 100
            keeprunkm = keeprunkm + 200
        return batterysize, keeprunkm

    def get_description(self):
        # 进行一个重写
        long_name = f'{self.maker} {self.size} {self.date} {self.passenger} {self.km} ' \
                    f'{self.speed} {self.batterynode} {self.batterysize} {self.keeprunkm}'
        return long_name.title()

mycar = Car('Evelyn', 'Bus', 'July 28th', 12, 1234, 67)
print(mycar.get_description())
yourcar = ElectricCar('Evelyn', 'Tesla', 'July 28th', 2, 122, 100, 'INTEL', '49mA', 19800)
print(yourcar.get_description())

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到