add_course中extend 和append的区别

add_course中extend 和append的区别

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

http://img1.sycdn.imooc.com//climg/5eae62bf0882ac8510380728.jpg

http://img1.sycdn.imooc.com//climg/5eae6289089f709300000000.jpg

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 result
from 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))


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕元宝 2020-05-06 10:29:13

同学你好:

extend的作用是将其他list中的元素倒入到当前的list 

appent的作用是把指定的元素添加到list的最后

这里如果用extend 是将course_info里面的元素倒入到self.__selectedCourse里。如果需要倒入的元素是dict类型,则只会把key倒入到list中

如图:这里的course_info打印出是字典类型,所以只倒入了key

http://img1.sycdn.imooc.com//climg/5eb220da09ce5d7f12900798.jpg

如果我的回答解决里同学的疑惑,欢迎采纳!祝同学学习愉快~~~


问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
1.Python零基础入门
  • 参与学习           人
  • 提交作业       2727    份
  • 解答问题       8160    个

想要进入Python Web、爬虫、人工智能等高薪领域,你需要掌握本阶段的Python基础知识,课程安排带你高效学习轻松入门,学完你也能听得懂Python工程师的行业梗。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师