目录
编程语言简史
历史上有很多编程语言,他们在编程语言发展的过程中都起到过重要的作用。
下面的 Python 数组包含了历史上的大部分编程语言。
languages = ["Regional Assembly Language","Autocode","FORTRAN","IPL (LISP的先驱)"
,"FLOW-MATIC (COBOL的先驱)","COMTRAN (COBOL的先驱)","LISP","ALGOL 58"
,"FACT (COBOL的先驱)","COBOL","APL","Simula","SNOBOL","CPL (C的先驱)","BASIC","PL/I","BCPL (C的先驱)","Logo","Pascal","Forth","C语言"
,"Smalltalk","Prolog","ML","Scheme","SQL","Ada","C++"
,"Common Lisp","MATLAB","Eiffel","Objective-C","Erlang","Perl"
,"Tcl","FL (Backus)","Haskell","Python","Visual Basic","HTML","Ruby","Lua","CLOS (part of ANSI Common Lisp)","Java"
,"Delphi (Object Pascal)","JavaScript","PHP","REBOL","D","C#"
,"Visual Basic .NET","F#","Scala","Factor","Windows PowerShell","Rust","Clojure","Go"]
下面的 Python 数组包含了这些编程对应的创建时间。
years = [1951, 1952, 1954, 1954, 1955, 1957, 1958, 1958, 1959
, 1959, 1962, 1962, 1962, 1963, 1964, 1964, 1967 ,1968 ,1970
,1970 ,1972 ,1972 ,1972 ,1973 ,1975 ,1978 ,1980 ,1983 ,1984
,1984 ,1985 ,1986 ,1986 ,1987 ,1988 ,1989 ,1990 ,1991 ,1991
,1991 ,1993 ,1993 ,1994 ,1995 ,1995 ,1995 ,1995 ,1997 ,1999
,2001 ,2001 ,2002 ,2003 ,2003 ,2006 ,2006 ,2007 ,2009]
编写一个 Python 程序,每行打印每个编程语言的名字和对应的创建时间,例如:
Regional Assembly Language : 1951
Autocode : 1952
FORTRAN : 1954
...
请找出以下代码中错误的选项。
if __name__ == '__main__':
languages = ...
years = ...
for language in languages:
for year in years:
print(language, ':', year)
编程语言发明家
每个编程语言都有其内在的编程范式,体现着编程语言设计者的哲学。编程语言发展史上有许多杰出的人物。下面是一些例子:
# -*- 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
,完成解析。
完整的代码模版如下:
# -*- 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
的实现中,不正确的选项。
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
Alice、Bob 和他们的朋友们
密码学家 Rivest、Shamir、Adleman 于1977年4月撰写了一篇论文《数字签名与公钥密码学》(On Digital Signatures and Public-Key Cryptosystems),并投稿至了一个期刊上,不过很遗憾这篇论文被拒稿了。随后他们修改了论文,并将论文重新命名为《一种实现数字签名和公钥密码系统的方法》(A Method of Obtaining Digital Signatures and Public-Key Cryptosystems),最终于1978年2月成功发表于顶级期刊《ACM通信》(Communications of the ACM)。在这篇论文中,三位密码学家嫌弃使用A、B两个字母代表角色太无聊,就用Alice和Bob来代替A和B。
在随后的几十年里密码学界又新增了很多著名人物。布鲁斯·施奈尔所著的《应用密码学》(Applied Cryptography)里详细列举了这些人物,下面是一些例子:
crypto_roles = [
'爱丽丝(Alice)是信息发送者。',
'与鲍伯(Bob)是信息接受者。通例上,爱丽丝希望把一条消息发送给鲍伯。',
'卡罗尔或查利(Carol或Charlie)是通信中的第三位参加者。',
'戴夫(Dave)是通信中的第四位参加者。',
'伊夫(Eve)是一位偷听者(eavesdropper),但行为通常是被动的。她拥有偷听的技术,但不会中途篡改发送的消息。在量子密码学中,伊夫也可以指环境(environment)。'
]
Python 是一门多范式编程语言,其中包括面向对象编程。
首先,我们用
Python 类(class)
定义一个密码城邦人物类型:
# -*- coding: UTF-8 -*-
class CryptographyPeople:
def __init__(self, name_cn, name_en, role, desc):
self.name_cn = name_cn
self.name_en = name_en
self.role = role
self.desc = desc
其次,我们添加一个简易的密码城邦人物解析器,它的作用是将类似
'马提尔达(Matilda)是一位商人(merchant),用于电子商务。',
这样的人物剧本
解析成CryptographyPeople
,创建一个密码城邦人物:
# -*- coding: UTF-8 -*-
class SimpleCryptographyPeopleParser:
def __init__(self, text) -> None:
self.text = text
def parse(self, desc):
# 解析名字部分
name_cn, name_en, rest = self.parse_name(desc)
# 解析角色部分
role, rest = self.parse_role(rest)
# 解析描述不符
desc = self.parse_desc(rest)
# 创建密码城邦人物
people = CryptographyPeople(name_cn, name_en, role, desc)
return people
def parse_name(self, text):
# 解析名字部分
index = text.find('是')
name, rest = text[0:index], text[index+1:]
# 解析中英文名字
start = name.find('(')
end = name.find(')')
name_cn = name[0:start]
name_en = name[start+1:end]
return name_cn.strip(), name_en.strip(), rest
def parse_role(self, text):
index1 = text.find('。')
index2 = text.find(',')
index = 0
if index1 > 0 and index2 > 0:
index = min(index1, index2)
else:
index = max(index1, index2)
role, rest = text[0:index], text[index+1:len(text)-1]
# 去除冗余量词
counts = ['一名', '一位', '一个']
for count in counts:
role = role.replace(count, '')
return role.strip(), rest.strip()
def parse_desc(self, name_cn, name_en, role, rest):
desc = rest
if desc:
# 识别自我主语
self_list = [name_cn, '他', '她']
for self_item in self_list:
desc = desc.replace(self_item, '我')
else:
# 补充默认描述
desc = '很高兴认识你'
最后,我们希望创建一个密码城邦,它包含
add
和introduce
两个方法:
# -*- coding: UTF-8 -*-
class CryptographyCity:
def __init__(self):
self.peoples = []
def add(self, text):
parser = SimpleCryptographyPeopleParser(text)
people = parser.parse(text)
self.peoples.append(people)
# TODO(YOU): 请在此实现 introduce 方法
最终,我们可以构建起密码城邦,并让市民们全部自报家门:
# -*- coding: UTF-8 -*-
if __name__ == '__main__':
crypto_roles = ...
city = CryptographyCity()
for crypto_role in crypto_roles:
city.add(crypto_role)
city.introduce()
密码城邦人物的自我介绍如下:
爱丽丝(Alice): 密码学家说我是一位信息发送者,很高兴认识你。
鲍伯(Bob): 密码学家说我是一位信息接受者,通例上,爱丽丝希望把一条消息发送给我。
...
请找出以下对类
CryptographyCity
的方法introduce
的实现中,不正确的选项。
class CryptographyCity:
def __init__(self):
self.peoples = []
def add(self, text):
parser = SimpleCryptographyPeopleParser(text)
people = parser.parse(text)
self.peoples.append(people)
def introduce(self):
for people in self.peoples:
self.say(people)
def say(self, people):
info = f'{people.name_cn}({people.name_en}): 密码学家说我是一位{people.role},{people.desc}。'
print(info)