【Python】Python 练习:「技能树-预备知识」② 程序设计思想-2

目录

一、练习题

二、答案解析

(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)


二、答案解析

(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)

【代码功能】解析输入的程序员信息,返回一个包含所有程序员中英文名字和成就的列表,具体来说,完成以下两个任务:

  1. 解析每个程序员信息的名字和成就,将其分别存储为两个变量并返回。
  2. 解析每个程序员名字的中英文部分,将其分别存储为两个变量并返回。

【代码详解】

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'}
]

② 写法 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)

【代码功能】将一个包含了一些著名程序员信息的列表 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'}
]

③ 写法 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)

【代码功能】用于解析程序员信息字符串列表,将每个程序员的信息解析为 Python 的字典数据类型,并将所有程序员的字典数据组成的列表输出。

【代码详解】

  1. 定义程序员信息字符串列表 programmers,定义了七个字符串元素,每个字符串包含一个程序员的中文名、英文名和其成就。

  2. 定义函数 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
  3. 定义函数 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 }
  4. 定义 parse_creators() 函数,用于解析程序员信息列表,函数使用列表推导式的方式,遍历每个程序员信息字符串,解析为字典数据类型,并返回字典列表。使用列表推导式的方式简化了代码,将每个程序员信息字符串解析为对应的字典,并返回字典列表。

    # 定义对程序员信息列表进行解析的函数 parse_creators()
    # 使用列表推导式的方式,将每个程序员字符串解析为字典并返回字典列表
    def parse_creators(creators):
        return [ parse_profile(creator) for  creator in creators]
  5. 在 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'}
]

(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

【代码功能】对含有程序员信息的字符串列表 programmers 进行解析,提取每一条字符串中的中文名、英文名和成就,并将其组合成一个包含了这些信息的字典,最终将所有字典组成一个字典列表输出。程序主要分为三部分:定义解析函数、程序员信息解析、程序员信息字典列表输出。

【代码详解】

  1. 程序员信息字符串列表 programmers 包含了7个字符串,每个字符串中包括了一个程序员的中英文名以及成就,字符串之间由逗号进行分隔。
  2. parse_parts() 函数用于将字符串中的英文名和成就提取出来。这个函数接受一个字符串作为参数,首先通过字符串中的逗号进行分隔,得到英文名和成就两段字符串。然后通过 strip() 函数去除字符串中的空格,并最终返回这两个字符串。
  3. parse_name() 函数用于将字符串中的中文名和英文名分别提取出来。这个函数接受一个字符串作为参数,首先通过字符串中的括号进行分隔,得到中文名和英文名两段字符串。然后通过对英文名字符串进行切片的方式去除开头和结尾的括号,并最终返回这两个字符串。
  4. parse_creators() 函数接收程序员信息字符串列表作为参数,最终返回每一条程序员信息对应的字典列表。这个函数通过一个 while 循环逐个遍历程序员信息字符串,对每个字符串依次进行解析,并将结果添加到列表 profiles 中。具体的解析过程通过调用 parse_parts() 和 parse_name() 函数实现,解析结果包括了中文名、英文名和成就信息。最终返回的 profiles 列表包含了每一条程序员信息对应的字典,每个字典中包括了中文名、英文名和成就信息。

  5. 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'}
]

你可能感兴趣的:(Python,技能树,python,开发语言)