提交 68ecab5d 编写于 作者: F feilong

改进3题

上级 241f1a1c
{ {
"one_line": { "source": "function.md",
"token[\"key\"] ": [
"token"
],
"print(\"\".join(result))": [
"print(result)",
"print(\"\".join(result))"
],
"dump_monkey(tokens):": [
"dumpmonkey(tokens):"
]
},
"source": "function.py",
"depends": [], "depends": [],
"exercise_id": 28, "exercise_id": 28,
"type": "code_options" "type": "code_options"
......
# 编程语言发明家
每个编程语言都有其内在的编程范式,体现着编程语言设计者的哲学。编程语言发展史上有许多杰出的人物。下面是一些例子:
```python
programmers = [
"约翰·巴科斯(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"
]
```
为了进一步对上述文本数据解析,获得如下格式的结构化信息:
```json
[
{"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
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 -*-
# 作者:幻灰龙
# 标题:编程语言发明家
# 描述:使用 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_creator(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
```
# -*- coding: UTF-8 -*- # -*- coding: UTF-8 -*-
# 作者:幻灰龙 # 作者:幻灰龙
# 标题:函数代码 # 标题:编程语言发明家
# 描述:使用 Python 函数 组织代码,输出“猴子在苹果树下打架” # 描述:使用 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 dump_monkey(tokens):
result = [] def parse_parts(creator):
for token in tokens: index = creator.find(',')
result.append(token["key"]) name, achievement = creator[0:index], creator[index+1:]
print("".join(result)) 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_profile(creator)
profiles.append(profile)
return profiles
if __name__ == '__main__': if __name__ == '__main__':
tokens = [ creators = [
{ "约翰·巴科斯(JohnWarnerBackus), 创建了Fortran语言",
"key": "猴子在" "阿兰·库珀(Alan Cooper), 开发了Visual Basic语言",
}, "艾兹格·迪杰斯特拉(Edsger Wybe Dijkstra), 提出了程序设计的框架结构",
{ "詹姆斯·高斯林(James Gosling), 开发了Java语言",
"key": "苹果树下" "安德斯·海尔斯伯格(Anders Hejlsberg), 开发了Turbo Pascal、Delphi、C#以及TypeScript",
}, "葛丽丝·霍普(Grace Murray Hopper), 开发了Flow-Matic,该语言对COBOL造成了影响",
{ "肯尼斯·艾佛森(Kenneth E. Iverson), 开发了APL,并与Roger Hui合作开发了J",
"key": "打架" "威廉·纳尔逊·乔伊(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"
] ]
dump_monkey(tokens)
profiles = parse_creators(creators)
print(profiles)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册