目录

编程语言简史

编程语言发明家

Alice、Bob 和他们的朋友们


编程语言简史

历史上有很多编程语言,他们在编程语言发展的过程中都起到过重要的作用。

下面的 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_endef parse_creators(creators):# TODO(YOU): 请在此处正确实现if __name__ == '__main__':creators = ...profiles = parse_creators(creators)print(profiles)

请找出以下对函数parse_creators的实现中,不正确的选项。

def parse_creators(creators):profiles = []i = 0while i<len(creators):creator = creators[i]name, achievement = parse_parts(creator)profiles.append({ 'name_cn': name, 'name_en': name, 'achievement': achievement })i+=1return 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_cnself.name_en = name_enself.role = roleself.desc = desc

其次,我们添加一个简易的密码城邦人物解析器,它的作用是将类似'马提尔达(Matilda)是一位商人(merchant),用于电子商务。',这样的人物剧本解析成CryptographyPeople,创建一个密码城邦人物:

# -*- coding: UTF-8 -*-
class SimpleCryptographyPeopleParser:def __init__(self, text) -> None:self.text = textdef 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 peopledef 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(), restdef parse_role(self, text):index1 = text.find('。')index2 = text.find(',')index = 0if 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 = restif 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)

Python入门技能树-程序设计思想:练习题个人总结相关推荐

  1. python入门技能树评测-积跬步以至千里

    很早前就看C站开始搞这个技能树的栏目了,我记得开始时只有C语言,奈何大一时被指针虐的体无完肤,遂敬而远之.最近看到有python技能树入门了,加之近期需求不紧,可缓图之. 很早前就看C站开始搞这个技能 ...

  2. python入门第二天__练习题

    1.Python 数字求和 1 #!/usr/bin/python3 2 # -*- coding: UTF-8 -*- 3 4 import sys 5 6 num_a=int(input(&quo ...

  3. Python入门学习——程序设计基本方法

    程序设计语言也叫编程语言,经历了机器语言.汇编语言到高级语言3个阶段.其中,机器语言和汇编语言都是直接操作计算机硬件的编程语言. 每个程序都有自己的运算模式:输入数据.处理数据和输出数据.我们称为IP ...

  4. python入门练习题-Python入门36道经典练习题

    [程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? num_list=[] cou=0 for i in range(1,5): for j in rang ...

  5. python入门经典代码-Python入门36道经典练习题

    [程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? num_list=[] cou=0 for i in range(1,5): for j in rang ...

  6. 编程语言python怎么读-Python入门学习的计算机程序设计语言是怎样的?

    原标题:Python入门学习的计算机程序设计语言是怎样的? 你可能已经听说过很多种流行编程语言,比如非常难学的C语言,非常流行的Java语言,适合初学者的Basic语言,适合网页编程的Java语言.那 ...

  7. Python入门练习题026:字符串写入的行数

    """ 记录下自己自学python和练习写的代码,等以后进阶后,再回来看一下曾经自己写的代码有多蠢Python入门练习题026:字符串写入的行数 把字符串S字符写入行中, ...

  8. Python入门程序练习题-温度转换

    Python入门程序练习题-温度转换 题目说明: 温度的刻画有两个不同体系:摄氏度(Celsius)和华氏度(Fabrenheit).‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪ ...

  9. python入门教程非常详细-Python编程入门教程:从入门到高级,非常详细

    本文的资料和内容是我下载的,觉得非常有用,于是转过来大家瞧瞧: 这里给初学Python的朋友提供一些建议和指导吧.大神请无视, 俗话说:授人以鱼不如授人以渔.所以我这里只是阐述学习过程,并不会直接详细 ...

最新文章

  1. mysql学习资料_一不小心,我就上传了 279674 字的 MySQL 学习资料到 github 上了
  2. Vue常用指令v-show
  3. sublime3配置pythonIDE
  4. 农村信用社招聘考试计算机,农村信用社招聘考试题:计算机(一)
  5. 52 MM配置-库存管理和实际库存-OMJJ新增移动类型原因
  6. Linux 64位进程地址空间分布概况
  7. 隔离见证_云见证–一种使我们的生活更轻松的新功能
  8. 2018服务器 芯片组,2018最新主板知识详解,详谈DIY(主板篇)
  9. struts2 中 Actionsupport类的作用
  10. DSP2812入门5——使用C语言操作DSP寄存器
  11. c#+上传文件至服务器,C# 实现文件上传到服务器
  12. iOS安装ipa文件
  13. 《三体3:死神永生》读后感
  14. 美国弗吉尼亚大学计算机科学,弗吉尼亚大学计算机科学排名第31(2018年TFE美国排名)...
  15. 键盘上分数怎么计算机,分数符号怎样在电脑上?
  16. 小说阅读 (支持txt文本文件浏览)
  17. 编写configure.ac
  18. excel表格末尾添加一行_这样输入Excel公式,也太快了吧......
  19. 芯来科技开源软件调试命令解析(nuclei-linux-sdk、openocd.cfg)
  20. 利用Python爬取《囧妈》豆瓣短评数据,并进行snownlp情感分析

热门文章

  1. 0078-【生活百科】-日程、笔记管理软件之大比拼
  2. 奔跑吧,HR!RPA与人力资源自动化
  3. 性能达到原生MySQL七倍,华为云Taurus技术解读
  4. mysql 伪表查询语句_mysql联表批处理操作
  5. ASC||码标准对照表
  6. 【密码学】Pollard‘s p-1素数分解算法
  7. iOS学习:调用相机,选择图片上传,带预览功能
  8. GlusterFS介绍及安装部署
  9. java计算机毕业设计医护人员排班系统源码+系统+lw+数据库+调试运行
  10. vue如何将图片压缩成webp格式并用webpack打包