Python 入门指南第二版(十)
原文:
annas-archive.org/md5/4b0fd2cf0da7c8edae4b5ecfd40159bf译者:飞龙
附录 D. 练习答案
1. Python 的味道
1.1 如果你的计算机上还没有安装 Python 3,请立即安装。参见附录 B 获取详细的安装信息。
1.2 启动 Python 3 交互式解释器。关于如何做的详细信息在附录 B 中。它应该打印几行关于自身的信息,然后一行以>>>开头。这是你输入 Python 命令的提示符。
1.3 用解释器玩一会儿。像计算器一样使用它,输入8 * 9。按 Enter 键查看结果。Python 应该打印72。
1.4 输入数字47并按 Enter 键。它是否在下一行为你打印了 47?
1.5 现在输入print(47)并按 Enter 键。这会在下一行也打印出 47 吗?
2. 数据:类型、值、变量和名称
2.1 将整数值99赋给变量prince,并打印出来。
2.2 值5的类型是什么?
2.3 值2.0的类型是什么?
2.4 表达式5 + 2.0的类型是什么?
3. 数字
3.1 一个小时有多少秒?将秒钟数(60)乘以小时数(同样是60),使用交互式解释器作为计算器。
3.2 将前一个任务(一个小时的秒数)的结果赋给名为seconds_per_hour的变量。
3.3 一天有多少秒?使用你的seconds_per_hour变量。
3.4 再次计算一天的秒数,但这次将结果保存在名为seconds_per_day的变量中。
3.5 将seconds_per_day除以seconds_per_hour。使用浮点数(/)除法。
3.6 使用整数(//)除法将seconds_per_day除以seconds_per_hour。这个数值与前一个问题中的浮点数值是否一致,除了最后的.0?
4. 选择if
4.1 选择一个介于 1 到 10 之间的数字,并将其赋给变量secret。然后,再选择另一个介于 1 到 10 之间的数字,并赋给变量guess。接下来,编写条件测试(if、else和elif)来打印字符串'too low'(如果guess小于secret)、'too high'(如果大于secret)和'just right'(如果等于secret)。
4.2 将True或False分配给变量small和green。编写一些if/else语句来打印与这些选择匹配的水果:cherry、pea、watermelon、pumpkin。
5. 文本字符串
5.1 将以m开头的单词大写:
>>> song = """When an eel grabs your arm,
... And it causes great harm,
... That's - a moray!"""
5.2 按正确的匹配打印每个列表问题和它们的答案,格式如下:
Q: 问题
A: 答案
>>> questions = [
... "We don't serve strings around here. Are you a string?",
... "What is said on Father's Day in the forest?",
... "What makes the sound 'Sis! Boom! Bah!'?"
... ]
>>> answers = [
... "An exploding sheep.",
... "No, I'm a frayed knot.",
... "'Pop!' goes the weasel."
... ]
5.3 使用旧式格式编写以下诗歌。将字符串'roast beef'、'ham'、'head'和'clam'替换到这个字符串中:
My kitty cat likes %s,
My kitty cat likes %s,
My kitty cat fell on his %s
And now thinks he's a %s.
5.4 使用新式格式编写一封表格信。将以下字符串保存为letter(你将在下一个练习中使用它):
Dear {salutation} {name},
Thank you for your letter. We are sorry that our {product}
{verbed} in your {room}. Please note that it should never
be used in a {room}, especially near any {animals}.
Send us your receipt and {amount} for shipping and handling.
We will send you another {product} that, in our tests,
is {percent}% less likely to have {verbed}.
Thank you for your support.
Sincerely,
{spokesman}
{job_title}
5.5 为名为'salutation'、'name'、'product'、'verbed'(过去式动词)、'room'、'animals'、'percent'、'spokesman'和'job_title'的字符串变量分配值。使用letter.format()打印letter与这些值。
5.6 在公众投票中命名事物后,出现了一种模式:英国潜艇(Boaty McBoatface)、澳大利亚赛马(Horsey McHorseface)和瑞典火车(Trainy McTrainface)。使用%格式化打印国家博览会上的获奖名字,用于鸭子、葫芦和斯皮茨。
5.7 使用format()格式化相同。
5.8 再来一次,使用f 字符串。
6. 使用 while 和 for 循环
6.1 使用for循环打印列表[3, 2, 1, 0]的值。
6.2 将值7赋给变量guess_me,将值1赋给变量number。编写一个while循环,将number与guess_me进行比较。如果number小于guess_me,则打印'too low'。如果number等于guess_me,则打印'found it!',然后退出循环。如果number大于guess_me,则打印'oops',然后退出循环。在循环结束时增加number。
6.3 将值5赋给变量guess_me。使用for循环迭代名为number的变量,范围为range(10)。如果number小于guess_me,则打印'too low'。如果等于guess_me,则打印'found it!',然后退出循环。如果number大于guess_me,则打印'oops',然后退出循环。
7. 元组和列表
7.1 创建名为years_list的列表,以你的出生年份开始,直到你五岁生日的年份。例如,如果你是 1980 年出生,列表将是years_list = [1980, 1981, 1982, 1983, 1984, 1985]。
7.2 在这些年份中,哪一年是你的第三个生日?请记住,你的第一年是 0 岁。
7.3 在years_list中哪一年你最年长?
7.4 创建并打印一个名为things的列表,其中包含这三个字符串作为元素:"mozzarella"、"cinderella"、"salmonella"。
7.5 将things中指向人的元素大写,然后打印列表。它改变了列表中的元素吗?
7.6 将things中的奶酪元素全部大写,然后打印列表。
7.7 删除疾病元素,领取你的诺贝尔奖,然后打印列表。
7.8 创建名为surprise的列表,元素为"Groucho"、"Chico"和"Harpo"。
7.9 将surprise列表的最后一个元素小写,反转它,然后大写它。
7.10 使用列表推导创建一个名为even的列表,其中包含range(10)中的偶数。
7.11 让我们创建一个跳绳童谣生成器。你将打印一系列两行押韵的诗句。从这个程序片段开始:
start1 = ["fee", "fie", "foe"]
rhymes = [
("flop", "get a mop"),
("fope", "turn the rope"),
("fa", "get your ma"),
("fudge", "call the judge"),
("fat", "pet the cat"),
("fog", "walk the dog"),
("fun", "say we're done"),
]
start2 = "Someone better"
对于rhymes中的每对字符串(first、second):
对于第一行:
-
打印
start1中的每个字符串,大写并后跟感叹号和空格。 -
打印大写的
first,后跟感叹号。
对于第二行:
-
打印
start2和一个空格。 -
打印
second和一个句号。
8. 字典
8.1 创建一个英语到法语的字典e2f并打印它。这是你的起始词汇:dog是chien,cat是chat,walrus是morse。
8.2 使用你的三词字典e2f,打印walrus的法语单词。
8.3 从e2f创建一个法语到英语的字典f2e。使用items方法。
8.4 打印法语单词chien的英语对应词。
8.5 打印e2f中的英语单词集合。
8.6 创建一个名为life的多级字典。使用以下字符串作为顶层键:'animals'、'plants'和'other'。使'animals'键参考另一个字典,其中包含键'cats'、'octopi'和'emus'。使'cats'键参考一个包含值'Henri'、'Grumpy'和'Lucy'的字符串列表。使所有其他键参考空字典。
8.7 打印life的顶层键。
8.8 打印life['animals']的键。
8.9 打印life['animals']['cats']的值。
8.10 使用字典推导式创建字典squares。使用range(10)返回键,并使用每个键的平方作为其值。
8.11 使用集合推导式从range(10)中的奇数创建集合odd。
8.12 使用生成器推导式返回字符串'Got '和range(10)中的数字。通过使用for循环来迭代这个。
8.13 使用zip()从键元组('optimist', 'pessimist', 'troll')和值元组('The glass is half full', 'The glass is half empty', 'How did you get a glass?')创建一个字典。
8.14 使用zip()创建一个名为movies的字典,将这些列表配对:titles = ['Creature of Habit', 'Crewel Fate', 'Sharks On a Plane']和plots = ['A nun turns into a monster', 'A haunted yarn shop', 'Check your exits']
9. 函数
9.1 定义一个名为good()的函数,返回以下列表:['Harry', 'Ron', 'Hermione']。
9.2 定义一个生成器函数get_odds(),返回range(10)中的奇数。使用for循环找到并打印第三个返回的值。
9.3 定义一个名为test的装饰器。当调用函数时,打印'start',当函数完成时,打印'end'。
9.4 定义一个名为OopsException的异常。引发此异常以查看发生了什么。然后编写代码来捕获此异常并打印'Caught an oops'。
10. Oh Oh:对象和类
10.1 创建一个名为Thing的类,没有内容并打印它。然后,从这个类创建一个名为example的对象并打印它。打印出的值是相同的还是不同的?
10.2 创建一个名为Thing2的新类,并将值'abc'分配给一个名为letters的类变量。打印letters。
10.3 再次创建一个名为Thing3的类。这次,将值'xyz'赋给一个名为letters的实例(对象)变量。打印letters。你需要创建一个类的对象来执行这个操作吗?
10.4 创建一个名为Element的类,具有实例属性name、symbol和number。使用值'Hydrogen'、'H'和1创建该类的对象hydrogen。
10.5 创建一个具有这些键和值的字典:'name': 'Hydrogen'、'symbol': 'H'、'number': 1。然后,使用这个字典从Element类创建一个名为hydrogen的对象。
10.6 对于Element类,定义一个名为dump()的方法,打印对象属性name、symbol和number的值。从这个新定义创建hydrogen对象,并使用dump()打印其属性。
10.7 调用print(hydrogen)。在Element的定义中,将方法dump的名称更改为__str__,创建一个新的hydrogen对象,并再次调用print(hydrogen)。
10.8 将Element修改为使name、symbol和number属性私有化。为每个属性定义一个 getter 属性以返回其值。
10.9 定义三个类:Bear、Rabbit和Octothorpe。对于每个类,只定义一个方法:eats()。分别返回'berries'(Bear)、'clover'(Rabbit)和'campers'(Octothorpe)。分别创建一个对象并打印它吃的东西。
10.10 定义这些类:Laser、Claw和SmartPhone。每个类只有一个方法:does()。分别返回'disintegrate'(Laser)、'crush'(Claw)或'ring'(SmartPhone)。然后定义一个Robot类,该类包含这三个组件对象的一个实例。为Robot定义一个does()方法,打印其组件对象的功能。
11. 模块、包和好东西
11.1 创建一个名为zoo.py的文件。在其中定义一个名为hours的函数,打印字符串'Open 9-5 daily'。然后,在交互式解释器中导入zoo模块并调用其hours函数。
11.2 在交互式解释器中,将zoo模块作为menagerie导入,并调用其hours()函数。
11.3 在解释器中保持不变,直接从zoo导入hours()函数并调用它。
11.4 将hours()函数作为info导入并调用。
11.6 创建一个名为fancy的OrderedDict,使用相同的键值对并打印它。它和plain打印出来的顺序一样吗?
11.7 创建一个名为dict_of_lists的defaultdict,并传递list作为参数。创建列表dict_of_lists['a']并通过一次赋值将值'something for a'附加到其中。打印dict_of_lists['a']。
12. 数据处理与管理
12.1 创建一个名为mystery的 Unicode 字符串,并将其赋值为'\U0001f984'。打印mystery及其 Unicode 名称。
12.2 使用 UTF-8 对mystery进行编码,将结果存入名为popbytes的bytes变量中。打印pop_bytes。
12.3 使用 UTF-8 解码popbytes,将结果存入名为pop_string的字符串变量中。打印pop_string。pop_string等于mystery吗?
12.4 当你处理文本时,正则表达式非常方便。我们将以多种方式应用它们到我们特选的文本样本中。这是一首名为《关于庞大奶酪的颂歌》的诗,由詹姆斯·麦金泰尔在 1866 年创作,以向安大略州制造的一块七千磅重的奶酪致敬,并送往国际巡回演出。如果你不想全部输入,可以使用你喜欢的搜索引擎复制并粘贴这些词到你的 Python 程序中,或者直接从Project Gutenberg中获取。将文本字符串命名为 mammoth。
12.5 导入re模块以使用 Python 的正则表达式功能。使用re.findall()打印所有以c开头的单词。
12.6 查找所有以c开头且长度为四个字母的单词。
12.7 找出所有以r结尾的单词。
12.8 找出所有包含恰好三个连续元音字母的单词。
12.9 使用unhexlify()将这个十六进制字符串(由两个字符串组合以适应一页)转换为名为gif的bytes变量:
'47494638396101000100800000000000ffffff21f9' +
'0401000000002c000000000100010000020144003b'
12.10 gif中的字节定义了一个像素的透明 GIF 文件,这是最常见的图形文件格式之一。一个合法的 GIF 以字符串GIF89a开始。gif是否匹配这个?
12.11 GIF 的像素宽度是从字节偏移 6 开始的 16 位小端整数,高度也是同样大小,从偏移 8 开始。提取并打印这些值到变量gif中。它们都是1吗?
13. 日历与时钟
13.1 将当前日期作为字符串写入名为today.txt的文本文件。
13.2 将名为today.txt的文本文件读入字符串today_string。
13.3 从today_string中解析日期。
13.4 创建一个你出生日期的日期对象。
13.5 你出生的那一天是星期几?
13.6 你什么时候会(或者你何时)满 10000 天?
14. 文件与目录
14.1 列出当前目录中的文件。
14.2 列出你的父目录中的文件。
14.3 将字符串'This is a test of the emergency text system'赋给变量test1,并将test1写入名为test.txt的文件。
14.4 打开名为test.txt的文件并将其内容读入字符串test2。test1和test2相同吗?
15. 时间中的数据:进程与并发
15.1 使用multiprocessing创建三个单独的进程。每个进程在 0 到 1 秒之间等待一个随机数,打印当前时间,然后退出。
16. 数据盒子:持久存储
16.1 将以下文本行保存到名为books.csv的文件中(注意,如果字段用逗号分隔,如果包含逗号,则需要用引号括起来):
author,book
J R R Tolkien,The Hobbit
Lynne Truss,"Eats, Shoots & Leaves"
16.2 使用csv模块及其DictReader方法将books.csv读取到变量books中。打印books的值。DictReader处理了第二本书标题中的引号和逗号吗?
16.3 通过以下行创建名为books2.csv的 CSV 文件:
title,author,year
The Weirdstone of Brisingamen,Alan Garner,1960
Perdido Street Station,China Miéville,2000
Thud!,Terry Pratchett,2005
The Spellman Files,Lisa Lutz,2007
Small Gods,Terry Pratchett,1992
16.4 使用sqlite3模块创建一个名为books.db的 SQLite 数据库,并创建一个名为books的表,包含以下字段:title(文本)、author(文本)和year(整数)。
16.5 读取books2.csv并将其数据插入book表中。
16.6 按字母顺序选择并打印book表中的title列。
16.7 按出版顺序选择并打印book表中的所有列。
16.8 使用sqlalchemy模块连接到您刚刚在练习 8.6 中创建的 sqlite3 数据库books.db。像 8.8 中一样,按字母顺序选择并打印book表中的title列。
16.9 在您的机器上安装 Redis 服务器(参见附录 B)和 Python 的redis库(pip install redis)。创建一个名为test的 Redis 哈希,具有字段count(1)和name('Fester Bestertester')。打印test的所有字段。
16.10 增加test的count字段并打印它。
17. 空间数据:网络
17.1 使用普通的socket实现一个当前时间服务。当客户端向服务器发送字符串'time'时,返回当前日期和时间的 ISO 字符串。
17.2 使用 ZeroMQ 的 REQ 和 REP 套接字来执行相同的操作。
17.3. 尝试使用 XMLRPC 做同样的事情。
17.4 你可能看过经典的I Love Lucy电视剧集,其中 Lucy 和 Ethel 在巧克力工厂工作。随着供应他们加工的糖果的传送带速度越来越快,二人开始落后。编写一个模拟程序,将不同类型的巧克力推送到 Redis 列表中,Lucy 作为客户端进行阻塞弹出这个列表。她需要 0.5 秒处理一块巧克力。打印每块巧克力到达 Lucy 手中的时间和类型,以及剩余待处理的数量。
17.5 使用 ZeroMQ 发布从练习 12.4(来自示例 12-1)的诗歌,逐字发布。编写一个 ZeroMQ 消费者,打印以元音字母开头的每个单词,以及包含五个字母的每个单词。忽略标点符号字符。
18. 解析 Web
18.1 如果您还没有安装flask,请立即安装。这也将安装werkzeug、jinja2和可能其他包。
18.2 使用 Flask 的调试/重载开发 Web 服务器构建一个骨架网站。确保服务器在默认端口5000上启动,主机名为localhost。如果您的机器已经在使用端口 5000 做其他事情,请使用其他端口号。
18.3 添加一个home()函数来处理对主页的请求。设置它返回字符串It's alive!。
18.4 创建一个名为home.html的 Jinja2 模板文件,内容如下:
I'm of course referring to {{thing}},
which is {{height}} feet tall and {{color}}.
创建一个名为templates的目录,并创建文件home.html,其内容如上所示。如果您之前的 Flask 服务器仍在运行,它将检测到新内容并重新启动自身。
18.5 修改您服务器的home()函数以使用home.html模板。为其提供三个GET参数:thing、height和color。
19. 成为 Pythonista
(Pythonistas 今天没有作业。)
20. Py 艺术
20.1 安装matplotlib。绘制这些(x, y)对的散点图:( (0, 0), (3, 5), (6, 2), (9, 8), (14, 10) )。
20.2 绘制相同数据的折线图。
20.3 绘制相同数据的图表(带有标记的折线图)。
21. Py at Work
21.1 安装geopandas并运行 示例 21-1。尝试修改颜色和标记大小。
22. PySci
22.1 安装 Pandas。获取 示例 16-1 中的 CSV 文件。运行 示例 16-2 中的程序。尝试使用一些 Pandas 命令。
附录 E. 快速参考表
我发现自己经常查阅某些内容。这里有些希望您会发现有用的表格。
运算符优先级
此表格是 Python 3 中运算符优先级的官方文档改编版,优先级最高的运算符位于顶部。
| 运算符 | 描述和示例 |
|---|---|
[*`v`*, …], {*`v1`*, …}, {*`k1`*:*`v1`*, …}, (…) | 列表/集合/字典/生成器的创建或推导,括号表达式 |
*`seq`*[*`n`*], *`seq`*[*`n`*:*`m`*], *`func`*(*`args`*…), *`obj`*.*`attr`* | 索引、切片、函数调用、属性引用 |
** | 指数运算 |
+n, –n, ~n | 正数、负数、位运算 not |
*, /, //, % | 乘法、浮点除法、整数除法、取余 |
+, - | 加法、减法 |
<<, >> | 位左移、右移 |
& | 位运算 and |
| | 位运算 or |
in, not in, is, is not, <, <=, >, >=, !=, == | 成员关系和相等性测试 |
not x | 布尔(逻辑)not |
and | 布尔 and |
or | 布尔 or |
if … else | 条件表达式 |
lambda … | lambda 表达式 |
字符串方法
Python 提供了字符串 方法(可用于任何 str 对象)和一个 string 模块,其中包含一些有用的定义。让我们使用这些测试变量:
>>> s = "OH, my paws and whiskers!"
>>> t = "I'm late!"
在以下示例中,Python shell 打印方法调用的结果,但原始变量 s 和 t 并未更改。
更改大小写
>>> s.capitalize()
'Oh, my paws and whiskers!'
>>> s.lower()
'oh, my paws and whiskers!'
>>> s.swapcase()
'oh, MY PAWS AND WHISKERS!'
>>> s.title()
'Oh, My Paws And Whiskers!'
>>> s.upper()
'OH, MY PAWS AND WHISKERS!'
搜索
>>> s.count('w')
2
>>> s.find('w')
9
>>> s.index('w')
9
>>> s.rfind('w')
16
>>> s.rindex('w')
16
>>> s.startswith('OH')
True
修改
>>> ''.join(s)
'OH, my paws and whiskers!'
>>> ' '.join(s)
'O H , m y p a w s a n d w h i s k e r s !'
>>> ' '.join((s, t))
"OH, my paws and whiskers! I'm late!"
>>> s.lstrip('HO')
', my paws and whiskers!'
>>> s.replace('H', 'MG')
'OMG, my paws and whiskers!'
>>> s.rsplit()
['OH,', 'my', 'paws', 'and', 'whiskers!']
>>> s.rsplit(' ', 1)
['OH, my paws and', 'whiskers!']
>>> s.split(' ', 1)
['OH,', 'my paws and whiskers!']
>>> s.split(' ')
['OH,', 'my', 'paws', 'and', 'whiskers!']
>>> s.splitlines()
['OH, my paws and whiskers!']
>>> s.strip()
'OH, my paws and whiskers!'
>>> s.strip('s!')
'OH, my paws and whisker'
格式
>>> s.center(30)
' OH, my paws and whiskers! '
>>> s.expandtabs()
'OH, my paws and whiskers!'
>>> s.ljust(30)
'OH, my paws and whiskers! '
>>> s.rjust(30)
' OH, my paws and whiskers!'
字符串类型
>>> s.isalnum()
False
>>> s.isalpha()
False
>>> s.isprintable()
True
>>> s.istitle()
False
>>> s.isupper()
False
>>> s.isdecimal()
False
>>> s.isnumeric()
False
字符串模块属性
这些是用作常量定义的类属性。
| 属性 | 示例 |
|---|---|
ascii_letters | 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' |
ascii_lowercase | 'abcdefghijklmnopqrstuvwxyz' |
ascii_uppercase | 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' |
digits | '0123456789' |
hexdigits | '0123456789abcdefABCDEF' |
octdigits | '01234567' |
punctuation | '!"#$%&\'()*+,-./:;<=>?@[\\]^_\{|}~'` |
printable | digits + ascii_letters + punctuation + whitespace |
whitespace | ' \t\n\r\x0b\x0c' |
结尾
切斯特希望表达对你勤奋工作的赞赏。如果你需要他,他正在午休中…
图 E-1. 切斯特¹
但露西可以回答任何问题。
图 E-2. 露西
¹ 自 图 3-1 以来,他向右移动了大约一英尺。