# 编程语言发明家

每个编程语言都有其内在的编程范式，体现着编程语言设计者的哲学。编程语言发展史上有许多杰出的人物。下面是一些例子：

```python
# -*- 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"
]
```

为了进一步对上述文本数据解析，获得如下格式的结构化信息：

```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`，完成解析。

完整的代码模版如下：

```python
# -*- 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)
```

请找出以下对函数`parse_creators`的实现中，<span style="color:red">不正确</span>的选项。

## template

```python
# -*- coding: UTF-8 -*-
# 作者：huanhuilong
# 标题：编程语言发明家
# 描述：使用 Python 函数处理编程语言发明家的信息

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_parts(creator):
    index = creator.find(',')
    name, achievement = creator[0:index], creator[index+1:]
    return name.strip(), achievement.strip()


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_creator(creator)
        profiles.append(profile)
    return profiles


if __name__ == '__main__':
    creators = [
        "约翰·巴科斯(JohnWarnerBackus), 创建了Fortran语言",
        "阿兰·库珀(Alan Cooper), 开发了Visual Basic语言",
        "艾兹格·迪杰斯特拉(Edsger Wybe Dijkstra), 提出了程序设计的框架结构",
        "詹姆斯·高斯林(James Gosling), 开发了Java语言",
        "安德斯·海尔斯伯格(Anders Hejlsberg), 开发了Turbo Pascal、Delphi、C#以及TypeScript",
        "葛丽丝·霍普(Grace Murray Hopper), 开发了Flow-Matic，该语言对COBOL造成了影响",
        "肯尼斯·艾佛森(Kenneth E. Iverson), 开发了APL，并与Roger Hui合作开发了J",
        "威廉·纳尔逊·乔伊(William Nelson Joy), 发明了vi，BSD Unix的前期作者，以及SunOS的发起人，该操作系统后来改名为Solaris",
        "艾伦·凯(Alan Curtis Kay), 开创了面向对象编程语言，以及Smalltalk的发起人",
        "罗布·派克(Brian Kernighan), 与丹尼斯·里奇合著第一本C程式设计语言的书籍，同时也是AWK与AMPL程式设计语言的共同作者",
        "约翰·麦卡锡(John McCarthy), 发明了LISP，在1956年的达特矛斯会议上提出了“人工智能”这个概念，被称为“人工智能之父",
        "约翰·冯·诺伊曼(John von Neumann), 操作系统概念的发起者",
        "丹尼斯·里奇(Dennis MacAlistair Ritchie), 发明了C语言，1978年与布莱恩·科尔尼干（Brian W. Kernighan）一起出版了名著《C程序设计语言（The C Programming Language）》",
        "比雅尼·斯特劳斯特鲁普(Bjarne Stroustrup), 他以创造C++编程语言而闻名，被称为“C++之父”",
        "肯·汤普逊(Kenneth Lane Thompson), 与丹尼斯·里奇同为1983年图灵奖得主。他与丹尼斯·里奇设计了B语言、C语言，创建了Unix和Plan 9操作系统，编程语言Go的共同作者。发展正规表示法，写作了早期的电脑文字编辑器QED与ed，定义UTF-8编码，以及发展电脑象棋",
        "尼克劳斯·维尔特(Niklaus Emil Wirth), 发明了Pascal与Modula",
        "拉里·沃尔(Larry Wall), 创造了Perl与Perl6",
        "吉多·范罗苏姆(Guido van Rossum), 创造了 Python"
    ]

    profiles = parse_creators(creators)
    print(profiles)
```

## 答案

```python
def parse_creators(creators):
    profiles = []
    i = 0
    while i<len(creators):
        creator = creators[i]
        name, achievement = parse_parts(creator)
        profiles.append({ 'name_cn': name, 'name_en': name, 'achievement': achievement })
        i+=1
    return profiles
```

## 选项

### 再次拆成两步解析

```python
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
```

### 函数+列表表达式

```python
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):
    return [ parse_profile(creator) for  creator in creators]
```

### 一个函数完成解析

```python
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
```
