add_course中extend 和append的区别
如题, 在add course方法中如果使用append可以得到正确结果, 但extend就不行


class Student(object):
'''
描述学生的学号、姓名、已选课程(默认值为空列表)
'''
__slots__ = ("__stuId", "__name", "__selectedCourse")
def __init__(self, stu_id, stu_name,selected_course=[]):
self.__stuId = stu_id
self.__name = str(stu_name).title()
self.__selectedCourse= selected_course[:]
@property
def stuId(self):
return self.__stuId
# 设定学号为4位数字
@stuId.setter
def stuId(self, stu_id):
if isinstance(stu_id, int) and len(str(stu_id)) == 4:
self.__stuId = stu_id
else:
raise ValueError("学号为4位数字")
@property
def name(self):
return self.__name
# 名字不能含有数字
@name.setter
def name(self, stu_name):
if str(stu_name).isalpha():
self.__name = str(stu_name).title()
else:
raise ValueError("名字不能含有数字")
# 设定course_detail方法以属性的方式返回学生的已选课程信息
@property
def course_detail(self):
'''
# 设定course_detail方法以属性的方式返回
:return: 学生的已选课程信息
'''
return self.__selectedCourse
def add_course(self, course_info):
'''
设定add_course(self,cour_info)方法,实现添加课程信息(cour_info)至学生对象的已选课程属性
:param course_info: 添加课程信息
'''
if course_info in self.__selectedCourse:
print("{{{}}}课程已被选".format(course_info))
else:
# 为什么这里用extend最后输出的结果就不一样?
self.__selectedCourse.append(course_info)
def __str__(self):
'''
设置学生类信息的字符串(__str__(self))显示方法
:return: 学生信息表的学生姓名,学生学号
'''
return "name: {name}, s_number: {stuId}".format(name=self.__name, stuId=self.__stuId)
class Teacher(object):
'''
描述教师编号、教师姓名、手机号码三项信息
'''
__slots__ = ('__teacherId', '__name', '__phone')
def __init__(self, id, name, phone):
self.__teacherId = id
self.__name = str(name).title()
self.__phone = phone
def __str__(self):
'''
教师类信息的字符串(__str__(self))显示方法
:return: 教师编号与教师姓名属性
'''
return "Teacher Id: {0}, name: {1}".format(self.__teacherId, self.__name)
@property
def id(self):
return self.__teacherId
@property
def name(self):
return self.__name
@property
def phone(self):
return self.__phone
@phone.setter
def phone(self, phone_num):
if str(phone_num).isdigit() and len(str(phone_num)) == 11:
self.__phone = phone_num
else:
print("请输入正确11位手机号")
class Course(object):
"""
描述课程编号、课程名称、授课教师(teacher默认值为None)
"""
def __init__(self, course_id, course_name, teacher=None):
self.courseId = course_id
self.courseName = course_name
# 私有属性, 利用binding方法改变
self.__teacher = teacher
def binding(self, teacher):
'''
课程绑定授课教师功能
:param teacher: 教师类的实例
:return: 课程名称和教师名称包装成的字典, 如果不存在教师类的实例,返回空
'''
result = None
if isinstance(teacher, Teacher):
self.__teacher = teacher
result = dict(课程名称=self.courseName, 教师名称=teacher.name)
return resultfrom models.example import Student, Teacher, Course
def introduction(title, star_num):
'''
定义introduction(title)方法
:param title: 接收标题名字
:param star_num: * 的数量
'''
print("{star}{title}{star}".format(star='*' * star_num, title=title))
def prepare_course():
'''
创建课程信息初始化,以列表形式返回所创建的8门课程对象
:return: 以列表形式返回所创建的8门课程对象
'''
# 1.创建字典接收课程信息
course_dict = dict()
course_name_list = ["网络爬虫", "数据分析", "人工智能", "机器学习", "云计算", "大数据", "图像识别", "Web开发"]
# 课程编号格式化为 “01” 形式
course_id = list(map(lambda x: "0" + str(x), range(1, 9)))
for i in range(len(course_id)):
course_dict[course_id[i]] = course_name_list[i]
# 2.创建空列表
course_list = list()
# 3.循环遍历字典中的数据,将课程编号和课程姓名传入课程类得到课程类的实例,空列表追加每一次的课程类实例
for c_id, c_name in course_dict.items():
course = Course(c_id, c_name)
course_list.append(course)
# 4.返回追加后的列表
return course_list
def create_teacher():
'''
创建教师信息初始化,并以列表形式返回所创建的8名教师对象
:return:以列表形式返回所创建的8名教师对象
'''
# 将教师信息的id, 名字和手机分别一一对应序列化
teacher_name_list = ["张亮", "王朋", "李旭", "黄国发", "周勤", "谢富顺", "贾教师", "杨教师"]
# 用map函数生成教师id T1 - T8
teacher_id_list = list(map(lambda x: "T" + str(x), range(1, 9)))
# 用map函数生成教师手机
teacher_phone_list = list(map(lambda x: str(x), range(13301122001, 13301122009)))
# 根据序列化后的教师信息生成8个教师实例
teacher_list = []
for i in range(len(teacher_id_list)):
t_id = teacher_id_list[i]
t_name = teacher_name_list[i]
t_phone = teacher_phone_list[i]
teacher_list.append(Teacher(t_id, t_name, t_phone))
return teacher_list
def course_to_teacher():
'''
实现课程与教师逐一绑定(每一课程信息绑定倒叙的每一老师信息),并以列表形式返回所课程与教师的绑定结果
:return: 以列表形式返回所课程与教师的绑定结果
'''
course2teacher = []
# 调用课程信息初始化方法,使用变量ls_course接收
ls_course = prepare_course()
# 调用教师信息初始化方法,使用变量ls_teacher接收
ls_teacher = create_teacher()
# course 和teacher信息绑定
num = len(ls_course)
for i in range(num):
# 每一课程信息绑定倒叙的每一老师信息
result = ls_course[i].binding(ls_teacher[num - 1 - i])
course2teacher.append(result)
return course2teacher
def create_student():
'''
创建学生信息初始化,并以列表形式返回所创建的8名学生对象
:return:以列表形式返回所创建的8名学生对象
'''
# 使用变量ls_student接收学生信息
ls_student = ["小亮", "小明", "李红", "小丽", "Jone", "小彤", "小K", "慕慕"]
# 使用range取得学号列表,其中学号的范围为1000~1007
ls_stu_id = [i for i in range(1000, 1008)]
# 循环遍历学生信息的长度,将学号与(据效果图所示)倒叙的学生姓名传入学生类,得到学生类的实例,将学生类实例追加至空列表
student_list = []
num = len(ls_student)
for i in range(num):
student_list.append(Student(ls_stu_id[i], ls_student[num - 1 - i]))
return student_list
if __name__ == "__main__":
# (1)调用课程绑定教师函数
course_teacher_list = course_to_teacher()
# (2)调用学生信息初始化函数
student_list = create_student()
# (3)调用introduction(str),传入参数,实现效果图标题一展示
introduction("慕课学院(1)班学生信息", 20)
# (4)循环输出学生信息
for stu in student_list:
print(stu)
# (5)调用introduction(str),传入参数,实现效果图标题二展示
introduction("慕课学院(1)选课结果", 20)
# (6)循环遍历课程绑定教师函数的长度,为学生初始化信息的每一对象添加绑定老师之后的课程信息
for i in range(len(course_teacher_list)):
student_list[i].add_course(course_teacher_list[i])
# (7)遍历学生初始化信息,实现如效果图Name:xxx, Selected:[{'课程名称': 'xxx', '教师名称': 'xxx'}]的展示
for stu in student_list:
print("Name: {name}, Selected: {course}".format(name=stu.name, course=stu.course_detail))15
收起
正在回答 回答被采纳积分+1
1回答
1.Python零基础入门
- 参与学习 人
- 提交作业 2727 份
- 解答问题 8160 个
想要进入Python Web、爬虫、人工智能等高薪领域,你需要掌握本阶段的Python基础知识,课程安排带你高效学习轻松入门,学完你也能听得懂Python工程师的行业梗。
了解课程

恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星