Python编程从入门到实践答案8


这本书是我自学Python的第一本书,里面的习题都在寒假已经完成,由于当时博客尚未搭建,故里面题目的答案并未发表。现在在开发项目博客没有新内容更新,因此这段实践会陆续上传原来的习题答案。每个题目均为自己设计的代码,优化与重构方面与标准答案可能有所不同。

参考教材:《Python编程从入门到实践》 【美】 Eric Matthes 著

Chapter9

9-1 餐馆:创建一个名为Restaurant的类,其方法__init__()设置两个属性:restaurant_name和cuisine_type。创建一个名为describe_restaurant()的方法和一个名为open_restaurant()的方法,其中前者打印前述两项信息,而后者打印一条消息,指出餐馆正在营业。

​ 根据这个类创建一个名为restaurant的实例,分别打印其两个属性,再调用前述两个方法。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
class Restaurant:
    """创建一个与餐馆有关的类"""

    def __init__(self, restaurant_name, cuisine_type):
        """初始化属性restaurant和cuisine_type"""
        self.restaurant_name = restaurant_name
        self.cuisine_type = cuisine_type

    def describe_restaurant(self):
        """有关餐馆的一些基础信息"""
        print(" The restaurant name is {}.".format(self.restaurant_name))
        print("The restaurant's cuisine type is {}.".format(self.cuisine_type))

    def open_restaurant(self):
        """说明餐馆正在营业"""
        print("{} is opening now.".format(self.restaurant_name))


restaurant = Restaurant("Yangxin", "Chinese")
restaurant.describe_restaurant()
restaurant.open_restaurant()

9-2 用户:创根据你为完成练习9-1而编写的类创建三个实例,并对每个实例调用方法describe_restaurant()。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
class Restaurant:
    """创建一个与餐馆有关的类"""

    def __init__(self, restaurant_name, cuisine_type):
        """初始化属性restaurant和cuisine_type"""
        self.restaurant_name = restaurant_name
        self.cuisine_type = cuisine_type

    def describe_restaurant(self):
        """有关餐馆的一些基础信息"""
        print("\nThe restaurant name is {}.".format(self.restaurant_name))
        print("The restaurant's cuisine type is {}.".format(self.cuisine_type))

    def open_restaurant(self):
        """说明餐馆正在营业"""
        print("{} is opening now.".format(self.restaurant_name))


restaurant_1 = Restaurant("Yangxin", "Chinese")
restaurant_1.describe_restaurant()
restaurant_1.open_restaurant()

restaurant_2 = Restaurant("King", "pizza")
restaurant_2.describe_restaurant()

restaurant_3 = Restaurant("Queen", "sandwich")
restaurant_3.describe_restaurant()

9-3 用户:创建一个名为User的类,其中包含属性first_name和last_name,还有用户简介通常会存储的其他几个属性。在类User中定义一个名为describe_user()的方法,它打印用户信息摘要;再定义一个名为great_user()的方法,它向用户发出个性化的问候。

​ 创建多个表示不同用户的实例,并对每个实例都调用上述两个方法。

#!/usr/bin/env python
# -*- coding:utf-8 -*-


class User:
    """创建一个与用户相关的类"""

    def __init__(self, first_name, last_name, username, emile, location):
        """初始化各属性"""
        self.first_name = first_name
        self.last_name = last_name
        self.username = username
        self.emile = emile
        self.location = location

    def describe_user(self):
        """创建一个描述用户信息的函数"""
        print("{} {}'s username is {},his(her) emile is {},his(her) location is {}."
              .format(self.first_name.title(),
                      self.last_name.title(),
                      self.username,
                      self.emile,
                      self.location.title()))

    def greet_user(self):
        """创建一个打招呼的函数"""
        print("Hello,{} {},next to meet you.".format(self.first_name, self.last_name))


user = User("Chen", "Xili", "fire wolf", "1239968427@qq.com", "yangxin")
user.describe_user()
user.greet_user()

9-4 就餐人数:在为完成练习9-1而编写的程序中,添加一个名为number_served的属性,并将其默认值设置为0。根据这个类创建一个名为restaurant的实例;打印有多少人在这家餐馆就餐过,然后修改这个值并再次打印它。

​ 添加一个名为set_number_served()的方法,他让你能够设置就餐人数。调用这个方法并向它传递一个值,然后再次打印这个值。

​ 添加一个名为increment_number_served()的方法,他让你能够将就餐人数递增。调用这个方法并向它传递一个这样的值:你认为这家店餐馆每天可能接待的就餐人数。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
class Restaurant:
    """A class representing a restaurant."""

    def __init__(self, name, cuisine_type):
        """Initialize the restaurant."""
        self.name = name.title()
        self.cuisine_type = cuisine_type
        self.number_served = 0

    def describe_restaurant(self):
        """Display a summary of the restaurant."""
        msg = self.name + " serves wonderful " + self.cuisine_type + "."
        print("\n" + msg)

    def open_restaurant(self):
        """Display a message that the restaurant is open."""
        msg = self.name + " is open. Come on in!"
        print("\n" + msg)

    def set_number_served(self, number_served):
        """Allow user to set the number of customers that have been served."""
        self.number_served = number_served

    def increment_number_served(self, additional_served):
        """Allow user to increment the number of customers served."""
        self.number_served += additional_served


restaurant = Restaurant('the mean queen', 'pizza')
restaurant.describe_restaurant()

print("\nNumber served: " + str(restaurant.number_served))
restaurant.number_served = 430
print("Number served: " + str(restaurant.number_served))

restaurant.set_number_served(1257)
print("Number served: " + str(restaurant.number_served))

restaurant.increment_number_served(239)
print("Number served: " + str(restaurant.number_served))

9-5 尝试登录次数:在为完成练习9-3而编写的User类中,添加一个名为login_attempt的属性。编写一个名为increment_login_attempts()的方法,它将属性login_attempts的值加1.再编写一个名为reset_login_attempts()的方法,它将属性login_attempts的值重置为0。

​ 根据User类创建一个实例。再调用方法increment_login_attempts()多次。打印属性login_attempts的值,确认它被正确地递增;然后,调用方法reset_login_attempts()。并再次打印属性login_attempts的值,确认它被重置为0。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
class User:
    """创建一个与用户相关的类"""

    def __init__(self, first_name, last_name, username, emile, location):
        """初始化各属性"""
        self.first_name = first_name
        self.last_name = last_name
        self.username = username
        self.emile = emile
        self.location = location
        self.login_attempts = 0

    def describe_user(self):
        """创建一个描述用户信息的函数"""
        print("{} {}'s username is {},his(her) emile is {},his(her) location is {}."
              .format(self.first_name.title(),
                      self.last_name.title(),
                      self.username,
                      self.emile,
                      self.location.title()))

    def greet_user(self):
        """创建一个打招呼的函数"""
        print("Hello,{} {},next to meet you.".format(self.first_name, self.last_name))

    def increment_login_attempts(self):
        """添加一个名为login——attempts的属性"""
        self.login_attempts += 1

    def reset_login_attempts(self):
        """将其重置为0"""
        self.login_attempts = 0


user = User('chen', "xili", 'fire_wolf', '1239968427@qq.com', 'yangxin')
user.describe_user()
user.greet_user()
# 打印调用多次后的值
user.increment_login_attempts()
user.increment_login_attempts()
user.increment_login_attempts()
print("Login attempt : {}".format(str(user.login_attempts)))
user.reset_login_attempts()
print("Login attempt : {}".format(str(user.login_attempts)))

9-6 冰淇淋小店:冰淇淋小店是一种特殊的餐馆。编写一个名为IceCreamStand的类,让它继承你为练习9-1或练习9-4而编写的Restaurant类。这两个版本的Restaurant类都可以,挑选你更喜欢的那个即可。添加一个名为flavors的属性,用于存储一个由各种口味的冰淇淋组成的列表。编写一个显示这些冰淇淋的方法。创建一个IceCreamStand实例,并调用这个方法。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
class Restaurant:
    """创建一个与餐馆有关的类"""

    def __init__(self, restaurant_name, cuisine_type):
        """初始化属性restaurant和cuisine_type"""
        self.restaurant_name = restaurant_name
        self.cuisine_type = cuisine_type

    def describe_restaurant(self):
        """有关餐馆的一些基础信息"""
        print(" The restaurant name is {}.".format(self.restaurant_name))
        print("The restaurant's cuisine type is {}.".format(self.cuisine_type))

    def open_restaurant(self):
        """说明餐馆正在营业"""
        print("{} is opening now.".format(self.restaurant_name))

class IceCreamStand(Restaurant):
    """冰淇淋小店的独特之处"""

    def __init__(self,  name, cuisine_type='ice_cream'):
        """初始化冰淇淋小店的属性"""
        super().__init__(name, cuisine_type)
        self.flavors = []

    def show_flavors(self):
        """展示不同口味的冰淇淋"""
        print("\nWe have the following flavors available:")
        for flavor in self.flavors:
            print("-" + flavor.title())


big_one = IceCreamStand('The Big One')
big_one.flavors = ['vanilla', 'chocolate', 'black cherry']

big_one.describe_restaurant()
big_one.show_flavors()

9-7 管理员:管理员是一种特殊的用户。编写一个名为Admin的类,让它继承你为完成练习9-3或练习9-5而编写的User类。添加一个名为privileges的属性,用于存储一个由字符串(如”can add post”、”can delete post”、”can ban user”等)组成的列表。编写一个名为show_privileges()的方法,它显示管理员的权限。创建一个Admin实例,并调用这个方法。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
class User:
    """创建一个与用户相关的类"""

    def __init__(self, first_name, last_name, username, email, location):
        """初始化各属性"""
        self.first_name = first_name
        self.last_name = last_name
        self.username = username
        self.email = email
        self.location = location

    def describe_user(self):
        """创建一个描述用户信息的函数"""
        print("{} {}'s username is {},his(her) emile is {},his(her) location is {}."
              .format(self.first_name.title(),
                      self.last_name.title(),
                      self.username,
                      self.email,
                      self.location.title()))

    def greet_user(self):
        """创建一个打招呼的函数"""
        print("Hello,{} {},next to meet you.".format(self.first_name, self.last_name))


class Admin(User):
    # 这个用户的独特之处
    def __init__(self, first_name, last_name, username, email, location):
        """重新定义这个特殊的用户"""
        super().__init__(first_name, last_name, username, email, location)
        self.privileges = []

    # 展示这个用户的特殊信息
    def show_privileges(self):
        print("\nPrivileges:")
        for privilege in self.privileges:
            print("-" + privilege)


user = Admin("Chen", "Xili", "fire wolf", "1239968427@qq.com", "yangxin")
user.describe_user()

user.privileges = ['can add post',
                   'can delete post',
                   'can ban user',
                   ]
user.show_privileges()

9-8 权限:编写一个名为Privileges的类,它只有一个属性——privileges,其中存储了练习9-7所说的字符串列表。将方法show_privileges()移到这个类中。在Admin类中,将一个Privileges实例用作其属性。创建一个Admin实例,并使用方法show_privileges()来显示其权限。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
class User:
    """创建一个与用户相关的类"""

    def __init__(self, first_name, last_name, username, email, location):
        """初始化各属性"""
        self.first_name = first_name
        self.last_name = last_name
        self.username = username
        self.email = email
        self.location = location

    def describe_user(self):
        """创建一个描述用户信息的函数"""
        print("{} {}'s username is {},his(her) emile is {},his(her) location is {}."
              .format(self.first_name.title(),
                      self.last_name.title(),
                      self.username,
                      self.email,
                      self.location.title()))

    def greet_user(self):
        """创建一个打招呼的函数"""
        print("Hello,{} {},next to meet you.".format(self.first_name, self.last_name))


class Admin(User):
    # 这个用户的独特之处
    def __init__(self, first_name, last_name, username, email, location):
        """重新定义这个特殊的用户"""
        super().__init__(first_name, last_name, username, email, location)
        self.privileges = Privileges()

class Privileges:
    # 一个贮存管理员的类
    def __init__(self, privileges=[]):
        self.privileges = privileges

    def show_privileges(self):
        print("\nPrivileges:")
        if self.privileges:
            for privilege in self.privileges:
                print("-" + privilege)
            else:
                print("- This user has no privileges.")


eric = Admin('eric', 'matthes', 'e_matthes', 'e_matthes@example.com', 'alaska')
eric.describe_user()

eric.privileges.show_privileges()

print("\nAdding privileges...")
eric_privileges = [
    'can reset passwords',
    'can moderate discussions',
    'can suspend accounts',
    ]
eric.privileges.privileges = eric_privileges
eric.privileges.show_privileges()

9-9 电瓶升级:在本节最后一个electric_car.py版本中,给Battery类添加一个名为upgrade_battery()的方法。这个方法检查电瓶容量,如果它不是85,就将它设置为85。创建一辆电瓶容量为默认值的电动汽车,调用方法get_range(),然后对电瓶进行升级,并再次调用get_range()。你会看到这辆汽车的续航里程增加了。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
class Car():
    """A simple attempt to represent a car."""

    def __init__(self, manufacturer, model, year):
        """Initialize attributes to describe a car."""
        self.manufacturer = manufacturer
        self.model = model
        self.year = year
        self.odometer_reading = 0

    def get_descriptive_name(self):
        """Return a neatly formatted descriptive name."""
        long_name = str(self.year) + ' ' + self.manufacturer + ' ' + self.model
        return long_name.title()

    def read_odometer(self):
        """Print a statement showing the car's mileage."""
        print("This car has " + str(self.odometer_reading) + " miles on it.")

    def update_odometer(self, mileage):
        """
        Set the odometer reading to the given value.
        Reject the change if it attempts to roll the odometer back.
        """
        if mileage >= self.odometer_reading:
            self.odometer_reading = mileage
        else:
            print("You can't roll back an odometer!")

    def increment_odometer(self, miles):
        """Add the given amount to the odometer reading."""
        self.odometer_reading += miles


class Battery():
    """A simple attempt to model a battery for an electric car."""

    def __init__(self, battery_size=60):
        """Initialize the battery's attributes."""
        self.battery_size = battery_size

    def describe_battery(self):
        """Print a statement describing the battery size."""
        print("This car has a " + str(self.battery_size) + "-kWh battery.")

    def get_range(self):
        """Print a statement about the range this battery provides."""
        if self.battery_size == 60:
            range = 140
        elif self.battery_size == 85:
            range = 185

        message = "This car can go approximately " + str(range)
        message += " miles on a full charge."
        print(message)

    def upgrade_battery(self):
        # 检查电瓶容量
        if self.battery_size == 60:
            self.battery_size = 85
            print("Upgraded the battery to 85 kWh.")
        else:
            print("The battery is already upgraded.")

class ElectricCar(Car):
    """Models aspects of a car, specific to electric vehicles."""

    def __init__(self, manufacturer, model, year):
        """
        Initialize attributes of the parent class.
        Then initialize attributes specific to an electric car.
        """
        super().__init__(manufacturer, model, year)
        self.battery = Battery()


print("Make an electric car, and check the battery:")
my_tesla = ElectricCar('tesla', 'model s', 2016)
my_tesla.battery.describe_battery()

print("\nUpgrade the battery, and check it again:")
my_tesla.battery.upgrade_battery()
my_tesla.battery.describe_battery()

print("\nTry upgrading the battery a second time.")
my_tesla.battery.upgrade_battery()
my_tesla.battery.describe_battery()

9-10 导入Restaurant类:将最新的Restaurant类存储在一个模块中。在另一个文件中,导入Restaurant类,创建一个Restaurant实例,并调用Restaurant的一个方法,以确认import语句正确无误。

restaurant.py:

class Restaurant():
    """A class representing a restaurant."""

    def __init__(self, name, cuisine_type):
        """Initialize the restaurant."""
        self.name = name.title()
        self.cuisine_type = cuisine_type
        self.number_served = 0

    def describe_restaurant(self):
        """Display a summary of the restaurant."""
        msg = self.name + " serves wonderful " + self.cuisine_type + "."
        print("\n" + msg)

    def open_restaurant(self):
        """Display a message that the restaurant is open."""
        msg = self.name + " is open. Come on in!"
        print("\n" + msg)

    def set_number_served(self, number_served):
        """Allow user to set the number of customers that have been served."""
        self.number_served = number_served

    def increment_number_served(self, additional_served):
        """Allow user to increment the number of customers served."""
        self.number_served += additional_served
from restaurant import Restaurant

channel_club = Restaurant('the channel club', 'steak and seafood')
channel_club.describe_restaurant()
channel_club.open_restaurant()

9-11 导入Admin类:以为完成练习9-8而做的工作为基础,将User、Privileges和Admin类存储在一个模块中,再创建一个文件,在其中创建一个Admin实例并对其调用方法show_privileges(),以确认一切都能正常地运行。

user.py:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
class User():
    """Represent a simple user profile."""

    def __init__(self, first_name, last_name, username, email, location):
        """Initialize the user."""
        self.first_name = first_name.title()
        self.last_name = last_name.title()
        self.username = username
        self.email = email
        self.location = location.title()
        self.login_attempts = 0

    def describe_user(self):
        """Display a summary of the user's information."""
        print("\n" + self.first_name + " " + self.last_name)
        print("  Username: " + self.username)
        print("  Email: " + self.email)
        print("  Location: " + self.location)

    def greet_user(self):
        """Display a personalized greeting to the user."""
        print("\nWelcome back, " + self.username + "!")

    def increment_login_attempts(self):
        """Increment the value of login_attempts."""
        self.login_attempts += 1

    def reset_login_attempts(self):
        """Reset login_attempts to 0."""
        self.login_attempts = 0


class Admin(User):
    """A user with administrative privileges."""

    def __init__(self, first_name, last_name, username, email, location):
        """Initialize the admin."""
        super().__init__(first_name, last_name, username, email, location)

        # Initialize an empty set of privileges.
        self.privileges = Privileges([])


class Privileges():
    """Stores privileges associated with an Admin account."""

    def __init__(self, privileges):
        """Initialize the privileges object."""
        self.privilege = privileges

    def show_privileges(self):
        """Display the privileges this administrator has."""
        for privilege in self.privileges:
            print("- " + privilege)
from user import Admin

eric = Admin('eric', 'matthes', 'e_matthes', 'e_matthes@example.com', 'alaska')
eric.describe_user()

eric_privileges = [
    'can reset passwords',
    'can moderate discussions',
    'can suspend accounts',
    ]
eric.privileges.privileges = eric_privileges

print("\nThe admin " + eric.username + " has these privileges: ")
eric.privileges.show_privileges()

9-12 多个模块:将User类存储在一个模块中,并将Privileges和Admin类存储在另一个模块中。再创建一个文件,在其中创建一个Admin实例,并对其调用方法show_privileges(),以确认一切都依然能够正常地运行。

user.py:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
class User():
    """Represent a simple user profile."""

    def __init__(self, first_name, last_name, username, email, location):
        """Initialize the user."""
        self.first_name = first_name.title()
        self.last_name = last_name.title()
        self.username = username
        self.email = email
        self.location = location.title()
        self.login_attempts = 0

    def describe_user(self):
        """Display a summary of the user's information."""
        print("\n" + self.first_name + " " + self.last_name)
        print("  Username: " + self.username)
        print("  Email: " + self.email)
        print("  Location: " + self.location)

    def greet_user(self):
        """Display a personalized greeting to the user."""
        print("\nWelcome back, " + self.username + "!")

    def increment_login_attempts(self):
        """Increment the value of login_attempts."""
        self.login_attempts += 1

    def reset_login_attempts(self):
        """Reset login_attempts to 0."""
        self.login_attempts = 0

admin.py:

from user import User


class Admin(User):
    """A user with administrative privileges."""

    def __init__(self, first_name, last_name, username, email, location):
        """Initialize the admin."""
        super().__init__(first_name, last_name, username, email, location)

        # Initialize an empty set of privileges.
        self.privileges = Privileges([])


class Privileges():
    """Stores privileges associated with an Admin account."""

    def __init__(self, privileges):
        """Initialize the privileges object."""
        self.privilege = privileges

    def show_privileges(self):
        """Display the privileges this administrator has."""
        for privilege in self.privileges:
            print("- " + privilege)
from admin import Admin

eric = Admin('eric', 'matthes', 'e_matthes', 'e_matthes@example.com', 'alaska')
eric.describe_user()

eric_privileges = [
    'can reset passwords',
    'can moderate discussions',
    'can suspend accounts',
    ]
eric.privileges.privileges = eric_privileges

print("\nThe admin " + eric.username + " has these privileges: ")
eric.privileges.show_privileges()

9-13 使用OrderedDict:在练习6-4中,你使用了一个标准字典表示词汇表。请使用OrderdDict类来重写这个程序,并确认输出的顺序与你在字典中添加键-值对的顺序一致。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from collections import OrderedDict
words = OrderedDict()
words = {'for': '循环方式',
         'print': '打印输出在屏幕显示',
         'pop()': '从列表结尾中删除数据',
         'sort': '按字母从小到大永久排序',
         'del': '删除某个数据',
         'set()': '找出列表中独一无二的元素',
         'value()': '提取字典中包含的值',
         'if': '假设语句',
         'keys()': '只提取字典中包含的名称',
         'append()': '添加数据',
        }

for name, value in words.items():
    print(name + ":" + value)

9-14 骰子:模块random包含以各种方式生成随机数的函数,其中的randint()返回一个位于指定范围内的整数,例如,下面的代码返回一个1~6内的整数:

from random import randint
x = randint(1, 6)

请创建一个Die类,它包含一个名为sides的属性,该属性的默认值为6。编写一个名为roll_die()的方法,它打印位于1和骰子面数之间的随机数。创建一个6面的骰子,再掷10次。

​ 创建一个10面的骰子和一个20面的骰子,并将它们都掷10次。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from random import randint
class Die:  # 创建一个Die类
    def __init__(self, slide=6):   # 初始化
        self.slide = slide

    def roll_die(self):
        return randint(1, self.slide)


d6 = Die()
results = []
for roll_number in range(10):
    result = d6.roll_die()
    results.append(result)

print("\n10 rolls of a 6-sided die:")
print(results)

d10 = Die(10)
results = []
for roll_number in range(10):
    result = d10.roll_die()
    results.append(result)

print("\n10 rolls of a 10-slide die:")
print(results)


d20 = Die(20)
results = []
for roll_number in range(10):
    result = d20.roll_die()
    results.append(result)

print("\n10 rolls of a 20-slide die:")
print(results)

文章作者: 陈细利
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 陈细利 !
评论
 上一篇
Python基础语法5 Python基础语法5
参考教材:Python程序设计基础与应用(机械工业出版社/董付国) ​ 由于时间紧迫,故只整理语法,没有写实例,在学习或复习过程中每个语法点都应搭配合适的例子进行练习。 第九章1.open()函数的文件打开方式 模式 说明
下一篇 
Python编程从入门到实践答案7 Python编程从入门到实践答案7
这本书是我自学Python的第一本书,里面的习题都在寒假已经完成,由于当时博客尚未搭建,故里面题目的答案并未发表。现在在开发项目博客没有新内容更新,因此这段实践会陆续上传原来的习题答案。每个题目均为自己设计的代码,优化与重构方面与标准答案可
  目录