Python常见编程题(四)

面向对象编程、文件操作

类是从具体的事物中把共同的特征抽取出来,而对象是类的一个具体实现。比如汽车图纸就是类,根据图纸可以生产出来很多汽车,就是该类的具体实例(对象)。

类中的方法分为:类方法(@classmethod)、静态方法(@staticmethod)、实例方法。在类中,实例方法只能通过self调用;若要通过类名调用,只能用类方法或静态方法。

1、圆的周长和面积。

设计一个Circle(圆)类,该类中包含属性radius(半径),还包括__init__()、get_perimeter()(求周长)和get_area()(求面积)等方法。设计完成后,创建Circle类的对象并测试周长和面积的功能。

import math
class Circle: #定义一个Circle类
	#构造方法__init__()用来初始化属性。当创建对象时,会自动调用此方法。
	#在方法内部可以使用self.属性名=属性的初始值(或参数)为属性设置初值。
    def __init__(self,radius): #有参构造方法,参数是radius
        self.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.0
    def __init__(self,score): #初始化方法
        self.score=score #通过"self.属性=形参"的形式接收外部传递的实参
        self.sum() #对象的实例方法sum()
    def setScore(self):
        Group.count+=1 #访问类属性
        return self.score #返回实例属性score
    def sum(self):
        #调用setScore()方法得到每个score值,与类属性total相加,即可得到总分数
        Group.total+=self.setScore()
    @classmethod #定义类方法
    def average(cls):
        #通过类属性total和count计算平均分
        return Group.total/Group.count
    @classmethod
    def 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 math
class Equation:
    def __init__(self,a,b,c):
        self.a=a
        self.b=b
        self.c=c
    def getDiscriminant(self,a,b,c):
        return b**2-4*a*c
    def getRoot1(self,a,b,c):
    	#因getDiscriminant()是实例方法,只能通过self调用
        if self.getDiscriminant(a,b,c)<0:
            return 0
        else:
            return (-b+math.sqrt(b**2-4*a*c))/2*a
    def getRoot2(self,a,b,c):
        if self.getDiscriminant(a,b,c)<0:
            return 0
        else:
            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的对象eq
print("第一个根是:",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初始化为1000
    def deposit(self): #存款
        money=int(input("请输入存款金额:"))
        self.balance+=money
        print("转入{}元,余额为{}元".format(money,self.balance))
    def withdraw(self):#取款
        money = int(input("请输入取款金额:"))
        #若当前账户余额多于取款金额,才能够正常取款
        if self.balance>=money: 
            self.balance -= money
            print("取出{}元,余额为{}元".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类的对象bank
while 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_list
        self.type=type
        self.area=area
        self.free_area=area
        self.item_list=[]
    def addItem(self,item):
        #若剩余面积多于目前家具的面积,则把家具的名字添加到家具列表中
        if self.free_area>item.area:
            self.item_list.append(item.name)
            #剩余面积需要减去添置的家具面积
            self.free_area-=item.area
        else:
            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=name
        self.area=area
    def __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=name
    def run(self):
        print("运行方式:")
#继承【class 类名(父类名):】
class TaxiCar(Car):
    def __init__(self,name,person_num):
        self.name=name
        self.person_num=person_num
    def run(self): #因与父类中run()方法同名,子类会覆盖(重写)父类方法
        print(f"{self.name}载了{self.person_num}人")
class FreightCar(Car):
    def __init__(self,name,goods_weight):
        self.name=name
        self.goods_weight=goods_weight
    def run(self):
        print(f"{self.name}载了{self.goods_weight}kg的货物")
taxi=TaxiCar("小汽车",5) #创建TaxiCar类的对象taxi
taxi.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-90
            upper_asc=random.randint(65,90) #随机生成一个65-90之间的整数
            upper=chr(upper_asc) #把数字转换为ASCII码中对应的字符
            choice=choice+upper #把转换后的字符存放在choice字符串中
        elif condition==2:#小写字母对应的ASCII码在97-122
            lower_asc=random.randint(97,122)
            lower=chr(lower_asc)
            choice+=lower
        elif condition==3:#数字的情况
            number=random.randint(0,9)
            choice+=str(number)#把数字转为字符串
    return choice

if __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 res
if __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()
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值