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

目录

编程语言简史

编程语言发明家

 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_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)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

仲瑿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值