面向对象编程、文件操作
类是从具体的事物中把共同的特征抽取出来,而对象是类的一个具体实现。比如汽车图纸就是类,根据图纸可以生产出来很多汽车,就是该类的具体实例(对象)。
类中的方法分为:类方法(@classmethod)、静态方法(@staticmethod)、实例方法。在类中,实例方法只能通过self调用;若要通过类名调用,只能用类方法或静态方法。
1、圆的周长和面积。
设计一个Circle(圆)类,该类中包含属性radius(半径),还包括__init__()、get_perimeter()(求周长)和get_area()(求面积)等方法。设计完成后,创建Circle类的对象并测试周长和面积的功能。
import mathclass Circle: #定义一个Circle类#构造方法__init__()用来初始化属性。当创建对象时,会自动调用此方法。#在方法内部可以使用self.属性名=属性的初始值(或参数)为属性设置初值。def __init__(self,radius): #有参构造方法,参数是radiusself.radius=radius #通过参数radius为属性radius赋值def get_perimeter(self): #定义实例方法get_perimeter,用来求圆的周长return 2*math.pi*self.radius #self.radius使用类中radius属性计算def get_area(self):return math.pi*(self.radius**2)#创建Circle类的对象circle,因构造方法中有radius参数,所以需要传入半径的值circle=Circle(5.0) #实例方法的调用分为:采用类的对象调用(对象名.方法名)、直接通过类名调用print("周长为:",circle.get_perimeter()) #通过对象调用方法print("面积为:",circle.get_area())
2、计算某组学生的总分和平均分。
设计一个Group类,该类包括:一个数据成员score(每个学生的分数)、类成员total(班级的总分)和count(班级的人数)和avg(班级的平均分)。成员方法setScore()用于设置分数,成员方法sum()用于累计总分,类方法average()用于求平均值,类方法show()用来输出总分和平均分。
class Group:total=count=0 #定义类属性avg=0.0def __init__(self,score): #初始化方法self.score=score #通过"self.属性=形参"的形式接收外部传递的实参self.sum() #对象的实例方法sum()def setScore(self):Group.count+=1 #访问类属性return self.score #返回实例属性scoredef sum(self):#调用setScore()方法得到每个score值,与类属性total相加,即可得到总分数Group.total+=self.setScore()@classmethod #定义类方法def average(cls):#通过类属性total和count计算平均分return Group.total/Group.count@classmethoddef show(cls):print("总分:",Group.total)#若要通过类名调用类中的方法,只能用类方法或静态方法。#如Group.sum()是不合法的,因为类名不能调用实例方法print("平均分:",Group.average())a=int(input("请输入学生数量:"))lists=[a] #定义一个列表lists,用来存储输入的分数for i in range(a):#Group(int(input(f"请输入第{i+1}位学生的成绩:")))创建对象lists.append(Group(int(input(f"请输入第{i+1}位学生的成绩:"))))#"类名.方法名()"通过类名直接调用类方法(调用Group类中的show()方法)Group.show()
3、计算二次方程的根。
为二次方程式ax2+bx+c=0设计一个名为Equation的类,这个类包括:
(1)代表三个系数的成员变量a、b、c
(2)一个参数为a、b、c的构造方法
(3)一个名为getDiscriminant()的方法返回判别式的值,其中判别式为b2-4ac
(4)一个名为getRoot1()和getRoot2()的方法返回等式的两个根(r1=(-b+√(b2-4ac))/2a,r2=(-b-√(b2-4ac))/2a )。
如果判别式为负,这些方法返回0。
import mathclass Equation:def __init__(self,a,b,c):self.a=aself.b=bself.c=cdef getDiscriminant(self,a,b,c):return b**2-4*a*cdef getRoot1(self,a,b,c):#因getDiscriminant()是实例方法,只能通过self调用if self.getDiscriminant(a,b,c)<0:return 0else:return (-b+math.sqrt(b**2-4*a*c))/2*adef getRoot2(self,a,b,c):if self.getDiscriminant(a,b,c)<0:return 0else:return (-b-math.sqrt(b**2-4*a*c))/2*a#接收输入的字符串,以逗号分隔后存入x列表x=input("请输入a,b,c,以逗号隔开:").split(",")#通过map函数把x列表中的数据映射成int类型,并分别赋值给a,b,c这3个变量a,b,c=map(int,x)eq=Equation(a,b,c) #创建Equation的对象eqprint("第一个根是:",eq.getRoot1(a,b,c))print("第二个根是:",eq.getRoot2(a,b,c))
4、模拟银行存款、取款操作。
(1)定义一个银行类Bank,并在该类中定义一个实例属性balance(用于保存账户余额,初始化为1000)、一个存款方法deposit()、一个取款方法withdraw()。
(2)创建自定义函数show_menu(),用于显示菜单。
(3)创建程序入口。首先显示菜单,输入菜单操作编号,实例化Bank类的对象,根据选择的菜单项调用相应的方法执行相应的操作。
class Bank:def __init__(self): self.balance=1000#实例属性balance初始化为1000def deposit(self): #存款money=int(input("请输入存款金额:"))self.balance+=moneyprint("转入{}元,余额为{}元".format(money,self.balance))def withdraw(self):#取款money = int(input("请输入取款金额:"))#若当前账户余额多于取款金额,才能够正常取款if self.balance>=money: self.balance -= moneyprint("取出{}元,余额为{}元".format(money, self.balance))else:print("余额不足!")def show_menu(): #在类Bank外,定义一个show_menu()函数,展示菜单menu='''菜单0退出1存款2取款'''print(menu)show_menu() #调用show_menu()函数id=int(input("请输入操作编号:"))bank=Bank() #创建Bank类的对象bankwhile id!=0:#根据不同的操作,调用不同的实例方法if id==1:bank.deposit()elif id==2:bank.withdraw()else:print("输入有误!")id = int(input("请输入操作编号:"))print("退出系统")
5、(1)房子(House类)有户型(type)、总面积(area)、剩余面积(free_area)、家居名称列表(item_list)。
(2)家具(HouseItem类)有名字(name)和占地面积(area)。
(3)将三件家具添加到房子中:床(bed)占地4m2;衣柜(chest)占地2m2;餐桌(table)占地1.5m2 。
(4)打印房子时,要求输出:户型、总面积、剩余面积、家具列表。
class House:#初始化。type,area两个形参用来接收传递的房子类型和总面积def __init__(self,type,area):#定义4个属性,type,area,free_area,item_listself.type=typeself.area=areaself.free_area=areaself.item_list=[]def addItem(self,item):#若剩余面积多于目前家具的面积,则把家具的名字添加到家具列表中if self.free_area>item.area:self.item_list.append(item.name)#剩余面积需要减去添置的家具面积self.free_area-=item.areaelse:print("房间剩余面积不足")#__str__方法必须有返回值,而且return之后只接受字符串数据def __str__(self):return "户型{},总面积{},剩余面积{},家具列表{}".format(self.type,self.area,self.free_area,self.item_list)class HouseItem:def __init__(self,name,area):self.name=nameself.area=areadef __str__(self):return f"{self.name}的占地面积为{self.area}"#当.py文件被直接运行的时候,if__name__ =='__main__':下方的代码将被执行;#当.py文件以模块形式被导入时,if__name__ =='__main__'下代码不被执行if __name__=='__main__':bed=HouseItem("席梦思",4)chest=HouseItem("衣柜",2)table=HouseItem("餐桌",1.5)house=House("别墅",1000)house.addItem(bed)house.addItem(chest)house.addItem(table)print(bed)print(chest)print(table)print(house)
6、模拟客车和货车的运行,反映出客车载人数和货车载物数。
(1)定义汽车类Car,包括名称属性name以及运行方式run()。
(2)定义客车类TaxiCar,包括名称属性name、载人属性person_num以及运行方式run()。
(3)定义货车类FreightCar,包括名称属性name、载物属性goods_weight以及运行方式run()。
(4)创建客车类和货车类的实例对象,并调用run()方法。
class Car:def __init__(self,name):self.name=namedef run(self):print("运行方式:")#继承【class 类名(父类名):】class TaxiCar(Car):def __init__(self,name,person_num):self.name=nameself.person_num=person_numdef run(self): #因与父类中run()方法同名,子类会覆盖(重写)父类方法print(f"{self.name}载了{self.person_num}人")class FreightCar(Car):def __init__(self,name,goods_weight):self.name=nameself.goods_weight=goods_weightdef run(self):print(f"{self.name}载了{self.goods_weight}kg的货物")taxi=TaxiCar("小汽车",5) #创建TaxiCar类的对象taxitaxi.run() #通过TaxiCar类的对象调用实例方法run()freight=FreightCar("大卡车",10)freight.run()
7、随机生成验证码。
随机生成6位的验证码(字母数字随机组合,包含大小写),其中,验证码分成三种情况:小写字母(ASCII码范围为97-122)、大写字母(ASCII码范围为65-90)、数字(0-9)。chr()函数将当前整数转换为对应的ASCII字符。
import random#随机生成6位的验证码,通过for循环保证验证码的位数def VerificationCode():choice = ""for i in range(6):#因验证码是由数字、大写字母、小写字母这3部分组成,所以分成以下3种情况condition=random.randint(1,3)if condition==1:#大写字母对应的ASCII码在65-90upper_asc=random.randint(65,90) #随机生成一个65-90之间的整数upper=chr(upper_asc) #把数字转换为ASCII码中对应的字符choice=choice+upper #把转换后的字符存放在choice字符串中elif condition==2:#小写字母对应的ASCII码在97-122lower_asc=random.randint(97,122)lower=chr(lower_asc)choice+=lowerelif condition==3:#数字的情况number=random.randint(0,9)choice+=str(number)#把数字转为字符串return choiceif __name__=='__main__':print(VerificationCode())
8、缩写词
缩写词是由一个短语中每个单词的第一个字母组成,均为大写。定义acronym(phrase)函数,当用户传入参数phrase后返回缩写词。例如,CPU是短语“central processing unit”的缩写。
def acronym(phrase):#把输入的字符串以空格分隔phrases=phrase.split(" ")res='' #用来保存缩写词for p in phrases: #遍历字符串中每一个单词#p[0]取第一个单词的第一个字符,并使用upper()方法转换为大写字母res+=p[0].upper() return resif __name__=='__main__':phrase=input("短语:")print(acronym(phrase))
9、通讯录
该程序可接收用户输入的姓名、电话、QQ、邮箱等信息,将这些信息保存到“通讯录.txt”文件中。
dic={}name=input("姓名:")tel=input("电话:")qq=input("QQ:")email=input("E-mail:")dic.update({'姓名:':name,"电话:":tel,'QQ:':qq,'邮箱:':email})#mode="a+"是追加模式,以读写的形式打开文本文件,只允许在文件末尾添加数据,若文件不存在,则创建新文件file=open("通讯录.txt",mode="a+",encoding='utf-8')#将字典转换为字符串,使用write方法向文件中写入数据file.write(str(dic)+"\n")print(f"{name}的信息已录入")file.close()