Python-入门指南第二版-十-

100 阅读17分钟

Python 入门指南第二版(十)

原文:annas-archive.org/md5/4b0fd2cf0da7c8edae4b5ecfd40159bf

译者:飞龙

协议:CC BY-NC-SA 4.0

附录 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。接下来,编写条件测试(ifelseelif)来打印字符串'too low'(如果guess小于secret)、'too high'(如果大于secret)和'just right'(如果等于secret)。

4.2 将TrueFalse分配给变量smallgreen。编写一些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循环,将numberguess_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中的每对字符串(firstsecond):

对于第一行:

  • 打印start1中的每个字符串,大写并后跟感叹号和空格。

  • 打印大写的first,后跟感叹号。

对于第二行:

  • 打印start2和一个空格。

  • 打印second和一个句号。

8. 字典

8.1 创建一个英语到法语的字典e2f并打印它。这是你的起始词汇:dogchiencatchatwalrusmorse

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的类,具有实例属性namesymbolnumber。使用值'Hydrogen''H'1创建该类的对象hydrogen

10.5 创建一个具有这些键和值的字典:'name': 'Hydrogen''symbol': 'H''number': 1。然后,使用这个字典从Element类创建一个名为hydrogen的对象。

10.6 对于Element类,定义一个名为dump()的方法,打印对象属性namesymbolnumber的值。从这个新定义创建hydrogen对象,并使用dump()打印其属性。

10.7 调用print(hydrogen)。在Element的定义中,将方法dump的名称更改为__str__,创建一个新的hydrogen对象,并再次调用print(hydrogen)

10.8 将Element修改为使namesymbolnumber属性私有化。为每个属性定义一个 getter 属性以返回其值。

10.9 定义三个类:BearRabbitOctothorpe。对于每个类,只定义一个方法:eats()。分别返回'berries'Bear)、'clover'Rabbit)和'campers'Octothorpe)。分别创建一个对象并打印它吃的东西。

10.10 定义这些类:LaserClawSmartPhone。每个类只有一个方法: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 创建一个名为fancyOrderedDict,使用相同的键值对并打印它。它和plain打印出来的顺序一样吗?

11.7 创建一个名为dict_of_listsdefaultdict,并传递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进行编码,将结果存入名为popbytesbytes变量中。打印pop_bytes

12.3 使用 UTF-8 解码popbytes,将结果存入名为pop_string的字符串变量中。打印pop_stringpop_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()将这个十六进制字符串(由两个字符串组合以适应一页)转换为名为gifbytes变量:

'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的文件并将其内容读入字符串test2test1test2相同吗?

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 哈希,具有字段count1)和name'Fester Bestertester')。打印test的所有字段。

16.10 增加testcount字段并打印它。

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,请立即安装。这也将安装werkzeugjinja2和可能其他包。

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参数:thingheightcolor

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
&#124;位运算 or
in, not in, is, is not, <, <=, >, >=, !=, ==成员关系和相等性测试
not x布尔(逻辑)not
and布尔 and
or布尔 or
ifelse条件表达式
lambdalambda 表达式

字符串方法

Python 提供了字符串 方法(可用于任何 str 对象)和一个 string 模块,其中包含一些有用的定义。让我们使用这些测试变量:

>>> s = "OH, my paws and whiskers!"
>>> t = "I'm late!"

在以下示例中,Python shell 打印方法调用的结果,但原始变量 st 并未更改。

更改大小写

>>> 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'!"#$%&\'()*+,-./:;<=>?@[\\]^_\{|}~'`
printabledigits + ascii_letters + punctuation + whitespace
whitespace' \t\n\r\x0b\x0c'

结尾

切斯特希望表达对你勤奋工作的赞赏。如果你需要他,他正在午休中…

inp2 ae01

图 E-1. 切斯特¹

但露西可以回答任何问题。

inp2 ae02

图 E-2. 露西

¹ 自 图 3-1 以来,他向右移动了大约一英尺。