目录
一、练习题
二、答案解析
(1)正确写法
① 写法 1
② 写法 2
③ 写法 3
(2)错误写法
① 写法 1
编程语言发明家
贡献者:幻灰龙
小知识:
【已知变量】
- 每个编程语言都有其内在的编程范式,体现着编程语言设计者的哲学。编程语言发展史上有许多杰出的人物。下面是一些例子:
# -*- coding: 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" ]
【期望结果】
- 为了进一步对上述文本数据解析,获得如下格式的结构化信息:
# -*- coding: UTF-8 -*- [ {"name_cn": "约翰·巴科斯", "name_en": "JohnWarnerBackus", "achievement": "创建了Fortran语言"}, {"name_cn": "阿兰·库珀", "name_en": "Alan Cooper", "achievement": "开发了Visual Basic语言"}, ... ]
【解题思路】
- 我们先分析一个例子,解析这个文本数据:
"吉多·范罗苏姆(Guido van Rossum), 创造了 Python"
。- 首先,定义一个函数
parse_parts
,通过第一个逗号,拆分出发明家的名字信息
和成就信息
。- 其次,定义一个函数
parse_name
,通过对name
的进一步拆分,获得发明家的中英文名字信息。- 最后,定义一个函数
parse_creators
,完成解析。题目:
完整的代码模版如下,请找出以下对函数
parse_creators
的实现中,不正确的选项:# -*- coding: UTF-8 -*- 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): # TODO(YOU): 请在此处正确实现,需要填充正确的代码块 if __name__ == '__main__': creators = ... profiles = parse_creators(creators) print(profiles)
# -*- 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)
【代码功能】解析输入的程序员信息,返回一个包含所有程序员中英文名字和成就的列表,具体来说,完成以下两个任务:
- 解析每个程序员信息的名字和成就,将其分别存储为两个变量并返回。
- 解析每个程序员名字的中英文部分,将其分别存储为两个变量并返回。
【代码详解】
1. parse_parts(creator)
函数「辅助函数」
- 该函数的作用是解析传入的
creator
变量,提取出其中用逗号隔开的名字和成就,然后返回这两个字符串的元组。- 我们首先找到字符串中第一个逗号的位置,然后将这个位置作为分割点,将名字和成就分别存储到
name
和achievement
变量中,并且使用strip
函数去除两侧的空格,最后返回两个字符串的元组。- 具体实现如下:
# 写法一 def parse_parts(creator): # 定义函数 parse_parts,接受一个字符串参数 creator,表示创作者信息 index = creator.find(',') # 找到 creator 字符串中第一个逗号的位置,返回给 index 变量 name, achievement = creator[0:index], creator[index+1:] # 将 creator 字符串按照逗号位置拆分为名字和成就两个 return name.strip(), achievement.strip() # 使用字符串的 strip() 方法去除成就两侧的空格,返回一个元组,包含名字和成就两个字符串
# 写法二 def parse_parts(creator): # 定义函数 parse_parts,接受一个字符串参数 creator,表示创作者信息 index = creator.find(',') # 找到 creator 字符串中第一个逗号的位置,返回给 index 变量 name, achievement = creator[0:index], creator[index+1:] # 将 creator 字符串按照逗号位置拆分为名字和成就两个部分 name = name.strip() # 使用字符串的 strip() 方法去除名字两侧的空格 achievement = achievement.strip() # 使用字符串的 strip() 方法去除成就两侧的空格 return name, achievement # 返回一个元组,包含名字和成就两个字符串
2.
parse_name(name)
函数「辅助函数」
- 该函数的作用是解析传入的
name
变量,提取出其中以括号括起来的英文名字,然后将中英文名字分别存储为两个字符串,最后返回这两个字符串的元组。- 我们首先使用
find
函数找到左括号的位置,然后将这个位置作为分割点,将中文名字和括号括起来的英文名字分别存储到name_cn
和name_en
变量中,并且使用字符串切片语法去除括号,最后返回两个字符串的元组。- 具体实现如下:
def parse_name(name): # 定义函数 parse_name,接受一个字符串参数 name,表示姓名 index = name.find('(') # 找到 name 字符串中左括号的位置,返回给 index 变量 name_cn, name_en = name[0:index], name[index:] # 将 name 字符串按照括号位置拆分为中文名和英文名两个部分 name_en = name_en[1:len(name_en)-1] # 去除英文名字两侧的括号 return name_cn, name_en # 返回一个元组,包含中文名和英文名两个字符串
3. parse_creators(creators)
函数
- 该函数的作用是解析传入的列表
creators
,将其中每个程序员信息分别解析出来,并将其名字、中英文名字和成就分别存储到一个字典中,最后返回所有字典形成的列表。- 我们在函数中使用了
for
循环,遍历了creators
列表中的每一个元素,即每一个程序员的信息。在每个循环中,我们首先调用parse_parts
函数将其名字和成就分别解析出来,然后调用parse_name
函数将中英文名字解析出来,最后将这三个元素分别存储到一个字典中,并将这个字典添加到profiles
列表中。- 具体实现如下:
def parse_creators(creators): # 定义函数 parse_creators,接受一个参数 creators 表示所有创作者信息 profiles = [] # 初始化一个空列表 profiles,用来存储转换后的创作者信息 for creator in creators: # 对于 creators 中的每一项,依次进行处理 name, achievement = parse_parts(creator) # 调用 parse_parts 函数,将 creator 信息按逗号拆分成名字和成就两个部分,并返回 name_cn, name_en = parse_name(name) # 调用 parse_name 函数,将名字按括号拆分成中文名和英文名,并返回 profiles.append({'name_cn': name_cn, 'name_en': name_en, 'achievement': achievement}) # 将处理好的信息添加到 profiles 列表中 return profiles # 返回处理完毕的创作者信息列表
4. 总结
parse_creators
函数的主要思路是对于每个程序员信息,先调用函数parse_parts
和parse_name
将其名字、成就和中英文名字都解析出来,然后将三个元素组成一个字【执行结果】
- 示例代码将解析程序员信息的代码封装成了函数,通过修改传入函数中的参数来执行代码。
- 这里的代码将程序员信息列表
programmers
直接赋值给creators
参数,进行数据解析并生成程序员信息字典列表profiles
,最后将其输出到控制台上。- 因此,代码的执行结果应该是:
[ {'name_cn': '约翰·巴科斯', 'name_en': 'JohnWarnerBackus', 'achievement': '创建了Fortran语言'}, {'name_cn': '阿兰·库珀', 'name_en': 'Alan Cooper', 'achievement': '开发了Visual Basic语言'}, {'name_cn': '詹姆斯·高斯林', 'name_en': 'James Gosling', 'achievement': '开发了Java语言'}, {'name_cn': '安德斯·海尔斯伯格', 'name_en': 'Anders Hejlsberg', 'achievement': '开发了Turbo Pascal、Delphi、C#以及TypeScript'}, {'name_cn': '丹尼斯·里奇', 'name_en': 'Dennis MacAlistair Ritchie', 'achievement': '发明了C语言'}, {'name_cn': '比雅尼·斯特劳斯特鲁普', 'name_en': 'Bjarne Stroustrup', 'achievement': '他以创造C++编程语言而闻名,被称为“C++之父”'}, {'name_cn': '吉多·范罗苏姆', 'name_en': 'Guido van Rossum', 'achievement': '创造了 Python'} ]
# -*- 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)
【代码功能】将一个包含了一些著名程序员信息的列表
programmers
解析,然后生成包含了每个程序员中文名、英文名和成就的字典,最后将所有字典放到一个列表里输出到控制台上。【代码详解】
1. parse_parts(creator)
函数 「辅助函数」
- 辅助函数:解析程序员的英文名和成就,返回英文名和成就的字符串
- 该函数的作用是解析传入的
creator
变量,提取出其中用逗号隔开的名字和成就,然后返回这两个字符串的元组。- 我们首先找到字符串中第一个逗号的位置,然后将这个位置作为分割点,将名字和成就分别存储到
name
和achievement
变量中,并且使用strip
函数去除两侧的空格,最后返回两个字符串的元组。- 具体实现如下:
# 写法一 def parse_parts(creator): # 定义函数 parse_parts,接受一个字符串参数 creator,表示创作者信息 index = creator.find(',') # 找到 creator 字符串中第一个逗号的位置,返回给 index 变量 name, achievement = creator[0:index], creator[index+1:] # 将 creator 字符串按照逗号位置拆分为名字和成就两个 return name.strip(), achievement.strip() # 使用字符串的 strip() 方法去除成就两侧的空格,返回一个元组,包含名字和成就两个字符串
# 写法二 def parse_parts(creator): # 定义函数 parse_parts,接受一个字符串参数 creator,表示创作者信息 index = creator.find(',') # 找到 creator 字符串中第一个逗号的位置,返回给 index 变量 name, achievement = creator[0:index], creator[index+1:] # 将 creator 字符串按照逗号位置拆分为名字和成就两个部分 name = name.strip() # 使用字符串的 strip() 方法去除名字两侧的空格 achievement = achievement.strip() # 使用字符串的 strip() 方法去除成就两侧的空格 return name, achievement # 返回一个元组,包含名字和成就两个字符串
2.
parse_name(name)
函数「辅助函数」
- 辅助函数:解析程序员的中文名和英文名,返回两个字符串
- 该函数的作用是解析传入的
name
变量,提取出其中以括号括起来的英文名字,然后将中英文名字分别存储为两个字符串,最后返回这两个字符串的元组。- 我们首先使用
find
函数找到左括号的位置,然后将这个位置作为分割点,将中文名字和括号括起来的英文名字分别存储到name_cn
和name_en
变量中,并且使用字符串切片语法去除括号,最后返回两个字符串的元组。- 具体实现如下:
def parse_name(name): # 定义函数 parse_name,接受一个字符串参数 name,表示姓名 index = name.find('(') # 找到 name 字符串中左括号的位置,返回给 index 变量 name_cn, name_en = name[0:index], name[index:] # 将 name 字符串按照括号位置拆分为中文名和英文名两个部分 name_en = name_en[1:len(name_en)-1] # 去除英文名字两侧的括号 return name_cn, name_en # 返回一个元组,包含中文名和英文名两个字符串
3. parse_profile(creator)
函数「辅助函数」
- 辅助函数:对传入的程序员信息字符串进行解析,通过调用
parse_parts()
和parse_name()
解析得到中文名、英文名和成就的三个字符串,然后将这三个字符串整合成一个字典返回。- 调用
parse_parts(creator)
函数对程序员信息字符串进行解析,将得到的英文名和成就字符串分别赋值给变量name
和achievement
。- 调用
parse_name(name)
函数对程序员信息字符串中的名字部分进行解析,得到其中文名和英文名字符串,分别赋值给变量name_cn
和name_en
。- 最后,根据中文名、英文名和成就字符串,生成包含这些信息的字典,并将其作为返回值返回。
# 定义函数 parse_profile(),接收一个程序员信息字符串参数 creator,返回包含名字、成就和英文名的字典 def parse_profile(creator): # 调用 parse_parts() 函数对程序员信息字符串 creator 进行解析,解析出英文名和成就,分别赋值给 name 和 achievement 变量 name, achievement = parse_parts(creator) # 调用 parse_name() 函数对程序员信息字符串的名字部分进行解析,解析出中文名和英文名,分别赋值给 name_cn 和 name_en 变量 name_cn, name_en = parse_name(name) # 返回包含中文名、英文名和成就的字典 # 字典的键是字符串类型,采用 'name_cn'、'name_en'、'achievement' 这样的命名方式 # 对应的值分别是字符串类型的 name_cn、name_en 和 achievement 变量 return { 'name_cn': name_cn, 'name_en': name_en, 'achievement': achievement }
4. parse_creators(creators)
函数
- 该函数的作用是对包含程序员信息的字符串列表进行解析。函数接受一个字符串列表
creators
作为输入,遍历列表中的每个字符串,对每个程序员信息字符串调用parse_profile()
函数进行解析,并将解析得到的字典添加到名为profiles
的列表中。最后,该函数返回profiles
列表。- 定义函数
parse_creators(creators)
,函数接受一个字符串列表creators
作为参数。- 初始化空列表
profiles
,用于存储解析得到的字典。- 对列表
creators
中的每个字符串元素creator
进行遍历,对每个creator
调用函数parse_profile(creator)
进行解析,并将返回的字典赋值给变量profile
。- 将变量
profile
添加到列表profiles
中。- 具体实现如下:
# 定义函数 parse_creators(),接收一个字符串列表作为参数 def parse_creators(creators): # 初始化空列表 profiles,用于存储解析得到的字典 profiles = [] # 遍历列表 creators 中的每个字符串元素 creator for creator in creators: # 对每个 creator 调用 parse_profile(creator) 函数进行解析,并将返回的字典赋值给变量 profile profile = parse_profile(creator) # 将变量 profile 添加到列表 profiles 中 profiles.append(profile) # 遍历完成后返回 profiles 列表 return profiles
4.
main()
函数
- 这段代码用于演示如何使用前面定义的函数
parse_creators()
对一个包含程序员信息的字符串列表进行解析。- 在
main()
函数中,将程序员信息列表programmers
赋值给变量creators
,调用parse_creators(creators)
函数进行解析,并将结果输出到控制台上。if __name__ == '__main__':
块用于判断当前模块是否作为独立的程序运行,如果是,则执行if
块中的代码。- 对列表
programmers
进行赋值,相当于复制它的内容到变量creators
中,用于后面对程序员信息字符串的解析。- 调用函数
parse_creators()
对列表creators
中的程序员信息字符串进行解析,将解析得到的字典存储到变量profiles
中。- 使用
print()
函数输出变量profiles
的内容,即所有程序员信息对应的字典列表。if __name__ == '__main__': creators = programmers profiles = parse_creators(creators) print(profiles)
【执行结果】
- 将程序员信息解析和生成程序员信息字典的代码从
parse_creators()
函数中提取出来,单独声明为一个函数parse_profile()
,用于解析和生成单条程序员信息的字典。- 然后在
parse_creators()
函数中调用parse_profile()
,遍历所有的程序员信息并生成包含所有程序员信息的字典列表。- 因此,代码的执行结果应该是:
[ {'name_cn': '约翰·巴科斯', 'name_en': 'JohnWarnerBackus', 'achievement': '创建了Fortran语言'}, {'name_cn': '阿兰·库珀', 'name_en': 'Alan Cooper', 'achievement': '开发了Visual Basic语言'}, {'name_cn': '詹姆斯·高斯林', 'name_en': 'James Gosling', 'achievement': '开发了Java语言'}, {'name_cn': '安德斯·海尔斯伯格', 'name_en': 'Anders Hejlsberg', 'achievement': '开发了Turbo Pascal、Delphi、C#以及TypeScript'}, {'name_cn': '丹尼斯·里奇', 'name_en': 'Dennis MacAlistair Ritchie', 'achievement': '发明了C语言'}, {'name_cn': '比雅尼·斯特劳斯特鲁普', 'name_en': 'Bjarne Stroustrup', 'achievement': '他以创造C++编程语言而闻名,被称为“C++之父”'}, {'name_cn': '吉多·范罗苏姆', 'name_en': 'Guido van Rossum', 'achievement': '创造了 Python'} ]
# -*- 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)
【代码功能】用于解析程序员信息字符串列表,将每个程序员的信息解析为 Python 的字典数据类型,并将所有程序员的字典数据组成的列表输出。
【代码详解】
定义程序员信息字符串列表
programmers,
定义了七个字符串元素,每个字符串包含一个程序员的中文名、英文名和其成就。定义函数
parse_parts()
和parse_name()
,用于解析每个程序员信息字符串。函数parse_parts()
用于解析英文名和成就,函数parse_name()
用于解析中文名和英文名。这两个解析函数都是比较简单直接的字符串处理函数,可以让代码更加可读易于理解。实现细节如下:# 定义解析英文名和成就字符串的函数 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()
,用于解析单个程序员信息字符串,获取中文名、英文名和成就并生成对应的字典。返回包含解析结果的 Python 字典数据,字典包含以下三个键值对:‘name_cn’ 表示中文名,‘name_en’ 表示英文名,‘achievement’ 表示成就。解析函数parse_profile()
的具体实现如下:# 定义解析单个程序员字符串的函数 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()
函数,用于解析程序员信息列表,函数使用列表推导式的方式,遍历每个程序员信息字符串,解析为字典数据类型,并返回字典列表。使用列表推导式的方式简化了代码,将每个程序员信息字符串解析为对应的字典,并返回字典列表。# 定义对程序员信息列表进行解析的函数 parse_creators() # 使用列表推导式的方式,将每个程序员字符串解析为字典并返回字典列表 def parse_creators(creators): return [ parse_profile(creator) for creator in creators]
在
if __name__ == '__main__':
块中调用parse_creators()
函数,将程序员信息字符串列表传入,将返回的字典列表输出到控制台上。在主函数中,调用函数parse_creators()
,将程序员信息列表传递给函数。得到每个程序员的字典数据,并输出字典列表。可以通过运行这段代码,查看输出结果验证程序是否正确实现。【执行结果】
- 该列表中每个元素都是一个字典,包含了一个程序员的中文名、英文名和成就。
- 每个元素表示一个程序员。
- 因此,代码的执行结果应该是:
[ {'name_cn': '约翰·巴科斯', 'name_en': 'JohnWarnerBackus', 'achievement': '创建了Fortran语言'}, {'name_cn': '阿兰·库珀', 'name_en': 'Alan Cooper', 'achievement': '开发了Visual Basic语言'}, {'name_cn': '詹姆斯·高斯林', 'name_en': 'James Gosling', 'achievement': '开发了Java语言'}, {'name_cn': '安德斯·海尔斯伯格', 'name_en': 'Anders Hejlsberg', 'achievement': '开发了Turbo Pascal、Delphi、C#以及TypeScript'}, {'name_cn': '丹尼斯·里奇', 'name_en': 'Dennis MacAlistair Ritchie', 'achievement': '发明了C语言'}, {'name_cn': '比雅尼·斯特劳斯特鲁普', 'name_en': 'Bjarne Stroustrup', 'achievement': '他以创造C++编程语言而闻名,被称为“C++之父”'}, {'name_cn': '吉多·范罗苏姆', 'name_en': 'Guido van Rossum', 'achievement': '创造了 Python'} ]
# 错误代码
# -*- 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
【代码功能】对含有程序员信息的字符串列表
programmers
进行解析,提取每一条字符串中的中文名、英文名和成就,并将其组合成一个包含了这些信息的字典,最终将所有字典组成一个字典列表输出。程序主要分为三部分:定义解析函数、程序员信息解析、程序员信息字典列表输出。【代码详解】
- 程序员信息字符串列表
programmers
包含了7个字符串,每个字符串中包括了一个程序员的中英文名以及成就,字符串之间由逗号进行分隔。parse_parts()
函数用于将字符串中的英文名和成就提取出来。这个函数接受一个字符串作为参数,首先通过字符串中的逗号进行分隔,得到英文名和成就两段字符串。然后通过strip()
函数去除字符串中的空格,并最终返回这两个字符串。parse_name()
函数用于将字符串中的中文名和英文名分别提取出来。这个函数接受一个字符串作为参数,首先通过字符串中的括号进行分隔,得到中文名和英文名两段字符串。然后通过对英文名字符串进行切片的方式去除开头和结尾的括号,并最终返回这两个字符串。
parse_creators()
函数接收程序员信息字符串列表作为参数,最终返回每一条程序员信息对应的字典列表。这个函数通过一个 while 循环逐个遍历程序员信息字符串,对每个字符串依次进行解析,并将结果添加到列表 profiles 中。具体的解析过程通过调用parse_parts()
和parse_name()
函数实现,解析结果包括了中文名、英文名和成就信息。最终返回的 profiles 列表包含了每一条程序员信息对应的字典,每个字典中包括了中文名、英文名和成就信息。
if __name__ == '__main__':
语句是 Python 中的特殊语句,表示如果当前模块作为主程序运行,那么执行以下代码块中的内容。在这个程序中,首先将包含程序员信息的字符串列表赋值给变量creators
,然后调用parse_creators()
函数将程序员信息列表解析为字典列表,最后输出这个字典列表。【执行结果】
- 这里执行结果与题目需求不同,中英文名称获取到的结果相同,未拆分中英文名称
- 因此,这段代码错误,输出的错误执行结果为:
[ {'name_cn': '约翰·巴科斯(JohnWarnerBackus)', 'name_en': '约翰·巴科斯(JohnWarnerBackus)', 'achievement': '创建了Fortran语言'}, {'name_cn': '阿兰·库珀(Alan Cooper)', 'name_en': '阿兰·库珀(Alan Cooper)', 'achievement': '开发了Visual Basic语言'}, {'name_cn': '詹姆斯·高斯林(James Gosling)', 'name_en': '詹姆斯·高斯林(James Gosling)', 'achievement': '开发了Java语言'}, {'name_cn': '安德斯·海尔斯伯格(Anders Hejlsberg)', 'name_en': '安德斯·海尔斯伯格(Anders Hejlsberg)', 'achievement': '开发了Turbo Pascal、Delphi、C#以及TypeScript'}, {'name_cn': '丹尼斯·里奇(Dennis MacAlistair Ritchie)', 'name_en': '丹尼斯·里奇(Dennis MacAlistair Ritchie)', 'achievement': '发明了C语言'}, {'name_cn': '比雅尼·斯特劳斯特鲁普(Bjarne Stroustrup)', 'name_en': '比雅尼·斯特劳斯特鲁普(Bjarne Stroustrup)', 'achievement': '他以创造C++编程语言而闻名,被称为“C++之父”'}, {'name_cn': '吉多·范罗苏姆(Guido van Rossum)', 'name_en': '吉多·范罗苏姆(Guido van Rossum)', 'achievement': '创造了 Python'} ]
【代码修正】
# 修正代码 # -*- 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
【代码修正功能】对一个包含程序员信息的字符串列表进行解析,并生成一个包含了每个程序员中文名、英文名和成就的字典列表,最后将所有字典输出到控制台上。
【代码修正详解】
1. 定义包含程序员信息的字符串列表
programmers
,每个程序员的信息用一个字符串表示,格式为“中文名(英文名), 成就”。2. 定义
parse_parts()
函数和parse_name()
函数,分别用于解析英文名和成就字符串、中文名和英文名字符串。3. 修改
parse_creators()
函数,使用while
循环逐个遍历程序员信息字符串列表,并在循环内部按照如下步骤解析每个程序员信息字符串:
- 调用
parse_parts(creator)
解析英文名和成就。- 调用
parse_name(name)
解析中文名和英文名。- 根据中文名、英文名和成就,生成一个包含这些信息的字典,并将其添加到列表
profiles
中。4. 在
if __name__ == '__main__':
内部调用parse_creators()
函数,将解析得到的字典列表输出到控制台上。【代码修正·执行结果】
- 执行该代码会输出一个包含所有程序员信息的字典列表。
- 该列表中每个元素都是一个字典,包含了一个程序员的中文名、英文名和成就。
- 每个元素表示一个程序员。
- 以下是输出结果:
[ {'name_cn': '约翰·巴科斯', 'name_en': 'JohnWarnerBackus', 'achievement': '创建了Fortran语言'}, {'name_cn': '阿兰·库珀', 'name_en': 'Alan Cooper', 'achievement': '开发了Visual Basic语言'}, {'name_cn': '詹姆斯·高斯林', 'name_en': 'James Gosling', 'achievement': '开发了Java语言'}, {'name_cn': '安德斯·海尔斯伯格', 'name_en': 'Anders Hejlsberg', 'achievement': '开发了Turbo Pascal、Delphi、C#以及TypeScript'}, {'name_cn': '丹尼斯·里奇', 'name_en': 'Dennis MacAlistair Ritchie', 'achievement': '发明了C语言'}, {'name_cn': '比雅尼·斯特劳斯特鲁普', 'name_en': 'Bjarne Stroustrup', 'achievement': '他以创造C++编程语言而闻名,被称为“C++之父”'}, {'name_cn': '吉多·范罗苏姆', 'name_en': 'Guido van Rossum', 'achievement': '创造了 Python'} ]