本笔记摘录清华大学工业工程系朱成礼老师的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())