function.md 6.7 KB
Newer Older
F
feilong 已提交
1 2 3 4 5 6 7 8 9 10
# 编程语言发明家

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

```python
programmers = [
  "约翰·巴科斯(JohnWarnerBackus), 创建了Fortran语言",
  "阿兰·库珀(Alan Cooper), 开发了Visual Basic语言",
  "詹姆斯·高斯林(James Gosling), 开发了Java语言",
  "安德斯·海尔斯伯格(Anders Hejlsberg), 开发了Turbo Pascal、Delphi、C#以及TypeScript",
F
fix bug  
feilong 已提交
11
  "丹尼斯·里奇(Dennis MacAlistair Ritchie), 发明了C语言",
F
feilong 已提交
12 13 14 15 16 17 18 19 20
  "比雅尼·斯特劳斯特鲁普(Bjarne Stroustrup), 他以创造C++编程语言而闻名,被称为“C++之父”",
  "吉多·范罗苏姆(Guido van Rossum), 创造了 Python"
]
```

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

```json
[
F
fix bug  
feilong 已提交
21 22
    {"name_cn": "约翰·巴科斯", "name_en": "JohnWarnerBackus", "achievement": "创建了Fortran语言"}, 
    {"name_cn": "阿兰·库珀", "name_en": "Alan Cooper", "achievement": "开发了Visual Basic语言"},
F
feilong 已提交
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
    ...
]
```

我们先分析一个例子,解析这个文本数据:`"吉多·范罗苏姆(Guido van Rossum), 创造了 Python"`

* 首先,定义一个函数 `parse_parts`,通过第一个逗号,拆分出发明家的`名字信息``成就信息`
* 其次,定义一个函数 `parse_name`,通过对`name`的进一步拆分,获得发明家的中英文名字信息。
* 最后,定义一个函数 `parse_creators`,完成解析。

完整的代码模版如下:

```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):
    # TODO(YOU): 请在此处正确实现

if __name__ == '__main__':
    creators = ...
    profiles = parse_creators(creators)
    print(profiles)
```

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

## template

```python
# -*- coding: UTF-8 -*-
F
feilong 已提交
62
# 作者:huanhuilong
F
feilong 已提交
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
# 标题:编程语言发明家
# 描述:使用 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:
F
feilong 已提交
150
        profile = parse_profile(creator)
F
feilong 已提交
151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
        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
```