目录
一、练习题
二、答案解析
(1)正确写法
① 写法 1
# -*- coding: UTF-8 -*-
# 使用utf-8编码
# 一个包含编程语言创始人及其创造的编程语言的列表
programmers = [
"约翰·巴科斯(JohnWarnerBackus), 创建了Fortran语言",
"阿兰·库珀(Alan Cooper), 开发了Visual Basic语言",
"詹姆斯·高斯林(James Gosling), 开发了Java语言",
"安德斯·海尔斯伯格(Anders Hejlsberg), 开发了Turbo Pascal、Delphi、C#以及TypeScript",
"丹尼斯·里奇(Dennis MacAlistair Ritchie), 发明了C语言",
"比雅尼·斯特劳斯特鲁普(Bjarne Stroustrup), 他以创造C++编程语言而闻名,被称为“C++之父”",
"吉多·范罗苏姆(Guido van Rossum), 创造了 Python"
]
# 定义一个函数,该函数接受一个编程语言创始人的字符串,并解析其姓名和成就
def parse_parts(creator):
index = creator.find(',')
name, achievement = creator[0:index], creator[index+1:]
return name.strip(), achievement.strip()
# 定义一个函数,该函数接受一个编程语言创始人的名字字符串,并解析出其中的中文名和英文名
def parse_name(name):
index = name.find('(')
name_cn, name_en = name[0:index], name[index:]
name_en = name_en[1:len(name_en)-1]
return name_cn, name_en
# 定义一个函数,该函数接受一个编程语言创始人列表,并遍历其中的每个元素,解析出其中的信息,组成一个新的列表
def parse_creators(creators):
profiles = []
for creator in creators:
name, achievement = parse_parts(creator)
name_cn, name_en = parse_name(name)
profiles.append({ 'name_cn': name_cn, 'name_en': name_en, 'achievement': achievement })
return profiles
# 如果该脚本在当前运行位置执行,则执行以下代码:获取编程语言创始人列表,调用 parse_creators 函数解析该列表,将结果保存在 profiles 中,并打印输出 profiles。
if __name__ == '__main__':
creators = programmers
profiles = parse_creators(creators)
print(profiles)
② 写法 2
# -*- coding: UTF-8 -*-
# 使用utf-8编码
# 一个包含编程语言创始人及其创造的编程语言的列表
programmers = [
"约翰·巴科斯(JohnWarnerBackus), 创建了Fortran语言",
"阿兰·库珀(Alan Cooper), 开发了Visual Basic语言",
"詹姆斯·高斯林(James Gosling), 开发了Java语言",
"安德斯·海尔斯伯格(Anders Hejlsberg), 开发了Turbo Pascal、Delphi、C#以及TypeScript",
"丹尼斯·里奇(Dennis MacAlistair Ritchie), 发明了C语言",
"比雅尼·斯特劳斯特鲁普(Bjarne Stroustrup), 他以创造C++编程语言而闻名,被称为“C++之父”",
"吉多·范罗苏姆(Guido van Rossum), 创造了 Python"
]
# 定义一个函数,该函数接受一个编程语言创始人的字符串,并解析其姓名和成就
def parse_parts(creator):
index = creator.find(',')
name, achievement = creator[0:index], creator[index+1:]
return name.strip(), achievement.strip()
# 定义一个函数,该函数接受一个编程语言创始人的名字字符串,并解析出其中的中文名和英文名
def parse_name(name):
index = name.find('(')
name_cn, name_en = name[0:index], name[index:]
name_en = name_en[1:len(name_en)-1]
return name_cn, name_en
# 定义一个函数,该函数接受一个编程语言创始人列表,调用 parse_profile 函数解析每个创始人的信息,并将所有解析出的信息存入新的列表
def parse_profile(creator):
name, achievement = parse_parts(creator)
name_cn, name_en = parse_name(name)
return { 'name_cn': name_cn, 'name_en': name_en, 'achievement': achievement }
def parse_creators(creators):
profiles = []
for creator in creators:
profile = parse_profile(creator)
profiles.append(profile)
return profiles
# 如果该脚本在当前运行位置执行,则执行以下代码:获取编程语言创始人列表,调用 parse_creators 函数解析该列表,将结果保存在 profiles 中,并打印输出 profiles。
if __name__ == '__main__':
creators = programmers
profiles = parse_creators(creators)
print(profiles)
③ 写法 3
# -*- coding: UTF-8 -*-
# 定义程序员信息字符串列表 programmers
programmers = [
"约翰·巴科斯(JohnWarnerBackus), 创建了Fortran语言",
"阿兰·库珀(Alan Cooper), 开发了Visual Basic语言",
"詹姆斯·高斯林(James Gosling), 开发了Java语言",
"安德斯·海尔斯伯格(Anders Hejlsberg), 开发了Turbo Pascal、Delphi、C#以及TypeScript",
"丹尼斯·里奇(Dennis MacAlistair Ritchie), 发明了C语言",
"比雅尼·斯特劳斯特鲁普(Bjarne Stroustrup), 他以创造C++编程语言而闻名,被称为“C++之父”",
"吉多·范罗苏姆(Guido van Rossum), 创造了 Python"
]
# 定义解析英文名和成就字符串的函数 parse_parts()
def parse_parts(creator):
index = creator.find(',')
name, achievement = creator[0:index], creator[index+1:]
return name.strip(), achievement.strip()
# 定义解析中文名和英文名字符串的函数 parse_name()
def parse_name(name):
index = name.find('(')
name_cn, name_en = name[0:index], name[index:]
name_en = name_en[1:len(name_en)-1]
return name_cn, name_en
# 定义解析单个程序员字符串的函数 parse_profile()
def parse_profile(creator):
name, achievement = parse_parts(creator)
name_cn, name_en = parse_name(name)
return { 'name_cn': name_cn, 'name_en': name_en, 'achievement': achievement }
# 定义对程序员信息列表进行解析的函数 parse_creators()
# 使用列表推导式的方式,将每个程序员字符串解析为字典并返回字典列表
def parse_creators(creators):
return [ parse_profile(creator) for creator in creators]
if __name__ == '__main__':
# 调用 parse_creators() 函数,获取所有程序员信息对应的字典列表
creators = programmers
profiles = parse_creators(creators)
# 输出字典列表
print(profiles)
(2)错误写法
① 写法 1
# 错误代码
# -*- coding: UTF-8 -*-
# 定义包含程序员信息的字符串列表 programmers
programmers = [
"约翰·巴科斯(JohnWarnerBackus), 创建了Fortran语言",
"阿兰·库珀(Alan Cooper), 开发了Visual Basic语言",
"詹姆斯·高斯林(James Gosling), 开发了Java语言",
"安德斯·海尔斯伯格(Anders Hejlsberg), 开发了Turbo Pascal、Delphi、C#以及TypeScript",
"丹尼斯·里奇(Dennis MacAlistair Ritchie), 发明了C语言",
"比雅尼·斯特劳斯特鲁普(Bjarne Stroustrup), 他以创造C++编程语言而闻名,被称为“C++之父”",
"吉多·范罗苏姆(Guido van Rossum), 创造了 Python"
]
# 定义解析英文名和成就字符串的函数 parse_parts()
def parse_parts(creator):
index = creator.find(',')
name, achievement = creator[0:index], creator[index+1:]
return name.strip(), achievement.strip()
# 定义解析中文名和英文名字符串的函数 parse_name()
def parse_name(name):
index = name.find('(')
name_cn, name_en = name[0:index], name[index:]
name_en = name_en[1:len(name_en)-1]
return name_cn, name_en
# 定义对程序员信息列表进行解析的函数 parse_creators()
def parse_creators(creators):
profiles = []
i = 0
# 使用 while 循环逐个遍历程序员信息字符串
while i<len(creators):
creator = creators[i]
# 解析英文名和成就
name, achievement = parse_parts(creator)
# 解析中文名和英文名
name_cn, name_en = parse_name(name)
# 根据中文名、英文名和成就,生成一个包含这些信息的字典,并将其添加到列表 profiles 中
# 这里就是唯一一行错误语句,中英文用了同个变量名 name
profiles.append({ 'name_cn': name, 'name_en': name, 'achievement': achievement })
i+=1
return profiles
if __name__ == '__main__':
# 对包含程序员信息的字符串列表进行解析
creators = programmers
profiles = parse_creators(creators)
# 输出所有程序员信息对应的字典列表
print(profiles)