笨办法学 Python3 第五版(预览)(三)(2)

简介: 笨办法学 Python3 第五版(预览)(三)(2)

笨办法学 Python3 第五版(预览)(三)(1)https://developer.aliyun.com/article/1483441

dis()

这次没有 *dis()* It 部分,因为这段代码太复杂了,难以理解,但如果你感觉幸运的话,可以尝试一下:

1   from dis import dis
 2
 3   if door == "1":
 4       print("1")
 5       bear = input("> ")
 6       if bear == "1":
 7           print("bear 1")
 8       elif bear == "2":
 9           print("bear 2")
10       else:
11           print("bear 3")

这将产生大量需要分析的代码,但尽力而为。过一段时间会变得无聊,但也有助于理解 Python 的工作原理。再次强调,如果这让你困惑,可以先跳过,以后再尝试。

练习

  1. 制作游戏的新部分,并改变人们可以做出的决定。在游戏变得荒谬之前尽可能扩展游戏。
  2. 编写一个全新的游戏。也许你不喜欢这个,那就自己创造一个。这是你的电脑;做你想做的事情。

常见学生问题

你能用一系列 if-else 组合替换 elif 吗? 在某些情况下可以,但这取决于每个 if/else 的编写方式。这也意味着 Python 将检查每个 if-else 组合,而不像 if-elif-else 那样只检查第一个为假的条件。尝试创建一些来了解差异。

如何判断一个数字是否在一系列数字范围内? 你有两个选择:使用 0 < x < 101 <= x < 10—这是经典的表示法—或使用 x in range(1, 10)

如果我想在 if-elif-else 块中增加更多选项怎么办? 为每个可能的选择添加更多 elif 块。

练习 33:循环和列表

现在你应该能够编写一些更有趣的程序了。如果你一直在跟进,你应该意识到现在你可以将所有其他学到的东西与if-statements和布尔表达式结合起来,使你的程序做一些聪明的事情。

然而,程序也需要快速地执行重复的事情。在这个练习中,我们将使用for-loop来构建和打印各种列表。当你做这个练习时,你会开始明白它们是什么。我现在不会告诉你。你必须自己弄清楚。

在使用for-loop之前,你需要一种方法来存储循环的结果。最好的方法是使用listsLists正是它们的名字所说的:一个按照从头到尾顺序组织的东西的容器。这并不复杂;你只需要学习一种新的语法。首先,这是如何创建lists的:

1   hairs = ['brown', 'blond', 'red']
2   eyes = ['brown', 'blue', 'green']
3   weights = [1, 2, 3, 4]

你用[(左括号)开始list,这个“打开”list。然后你用逗号分隔每个你想要放入列表的项目,类似于函数参数。最后,用](右括号)结束列表以表示它的结束。然后 Python 将获取这个列表及其所有内容,并将它们分配给变量。

警告!

这就是对于不能编码的人来说变得棘手的地方。你的大脑被教导世界是平的。还记得在上一个练习中你是如何在if-statements内部放置if-statements的吗?那可能让你的大脑感到疼痛,因为大多数人不会考虑如何在“嵌套”事物内部放置事物。在编程中,嵌套结构随处可见。你会发现调用其他函数的函数,这些函数有带有列表的if-statements,列表内部还有列表。如果你看到这样的结构而无法理解,拿出一支铅笔和纸,逐步手动分解,直到你理解为止。

现在我们将使用一些for-loops来构建一些列表并将它们打印出来:

列表 33.1:ex33.py

1   the_count = [1, 2, 3, 4, 5]
 2   fruits = ['apples', 'oranges', 'pears', 'apricots']
 3   change = [1, 'pennies', 2, 'dimes', 3, 'quarters']
 4
 5   # this first kind of for-loop goes through a list
 6   for number in the_count:
 7       print(f"This is count {number}")
 8
 9   # same as above
10   for fruit in fruits:
11       print(f"A fruit of type: {fruit}")
12
13   # also we can go through mixed lists too
14   for i in change:
15       print(f"I got {i}")
16
17   # we can also build lists, first start with an empty one
18   elements = []
19
20   # then use the range function to do 0 to 5 counts
21   for i in range(0, 6):
22       print(f"Adding {i} to the list.")
23       # append is a function that lists understand
24       elements.append(i)
25
26   # now we can print them out too
27   for i in elements:
28       print(f"Element was: {i}")

你应该看到的内容

1   This is count 1
 2   This is count 2
 3   This is count 3
 4   This is count 4
 5   This is count 5
 6   A fruit of type: apples
 7   A fruit of type: oranges
 8   A fruit of type: pears
 9   A fruit of type: apricots
10   I got 1
11   I got pennies
12   I got 2
13   I got dimes
14   I got 3
15   I got quarters
16   Adding 0 to the list.
17   Adding 1 to the list.
18   Adding 2 to the list.
19   Adding 3 to the list.
20   Adding 4 to the list.
21   Adding 5 to the list.
22   Element was: 0
23   Element was: 1
24   Element was: 2
25   Element was: 3
26   Element was: 4
27   Element was: 5
dis()

这次让我们简单点,只看看 Python 如何执行for-loop

1   from dis import dis
2
3   dis('''
4   for number in the_count:
5       print(number)
6   ''')

这次我将在这里重现输出,以便我们可以分析它:

1    0 LOAD_NAME     0 (the_count) # get the count list
 2    2 GET_ITER                    # start iteration
 3    4 FOR_ITER      6 (to 18)     # for-loop jump to 18
 4    6 STORE_NAME    1 (number)    # create number variable
 5
 6    8 LOAD_NAME     2 (print)     # load print()
 7   10 LOAD_NAME     1 (number)    # load number
 8   12 CALL_FUNCTION 1             # call print()
 9   14 POP_TOP                     # clean stack
10   16 JUMP_ABSOLUTE 2 (to 4)      # jump back to FOR_ITER at 4
11
12   18 LOAD_CONST    0 (None)      # jump here when FOR_ITER done
13   20 RETURN_VALUE

FOR_ITER操作中我们看到了一个新的东西。这个操作通过以下步骤使for-loop工作:

  1. 调用the_count.__next__()
  2. 如果the_count中没有更多元素,则跳转到 18
  3. 如果仍然有元素,则继续执行
  4. STORE_NAME然后将the_count.__next__()的结果赋给名为number的变量

这就是for-loop实际上所做的一切。它主要是一个单字节代码FOR_ITER,结合其他几个来遍历列表。

学习练习

  1. 看看你如何使用了range。查阅range函数以了解它。
  2. 在第 22 行完全避免了那个for-loop,直接将range(0,6)赋给elements,你能做到吗?
  3. 查找关于列表的 Python 文档并阅读它们。除了append之外,你还可以对列表进行哪些操作?

常见学生问题

如何创建二维(2D)列表? 就像这样的列表中嵌套列表:[[1,2,3],[4,5,6]]

列表和数组不是一回事吗? 这取决于语言和实现。在传统术语中,列表与数组非常不同,因为它们的实现方式不同。在 Ruby 中,它们称之为“数组”。在 Python 中,它们称之为“列表”。现在只需称之为“列表”,因为这是 Python 的称呼。

为什么 for 循环能够使用尚未定义的变量? 变量在循环开始时由 for 循环 定义,每次迭代时将其初始化为当前循环元素。

为什么 for i in range(1, 3): 只循环两次而不是三次? range() 函数只生成从第一个到最后一个的数字,不包括最后一个。因此,在上述情况下它在两处停止,而不是三处。这实际上是这种循环最常见的方式。

elements.append() 做什么?它简单地将元素附加到列表的末尾。打开 Python shell 并尝试用自己创建的列表做几个示例。每当遇到这样的情况时,总是尝试在 Python shell 中进行交互操作。

练习 34:While 循环

现在让我们用一个新的循环完全震惊你,while-loopwhile-loop会持续执行其下的代码块,只要布尔表达式为True

等等,你一直跟上术语了吗?如果我们写一行并以:(冒号)结尾,那告诉 Python 开始一个新的代码块?然后我们缩进,这就是新代码。这一切都是关于构建你的程序,让 Python 知道你的意图。如果你没有理解这个概念,那就回去多做一些关于if语句、函数和for循环的工作,直到你理解为止。

后面我们会有一些练习,训练你的大脑阅读这些结构,类似于我们如何将布尔表达式烙印在你的大脑中。

回到while-loop。它们的作用就像一个if语句的测试,但不同于只运行代码块一次,它们会跳回到while所在的“顶部”,并重复。while循环会一直运行,直到表达式为False

while循环的问题在于:有时它们不会停止。如果你的意图只是一直循环直到宇宙的尽头,那么这很好。否则,你几乎总是希望你的循环最终会结束。

为了避免这些问题,有一些规则需要遵循:

  1. 确保你谨慎使用while循环。通常for循环更好。
  2. 检查你的while语句,并确保布尔测试最终会变为False
  3. 如果有疑问,在while循环的顶部和底部打印出你的测试变量,看看它在做什么。


笨办法学 Python3 第五版(预览)(三)(3)https://developer.aliyun.com/article/1483443


相关文章
|
14天前
|
数据可视化 定位技术 Python
笨办法学 Python3 第五版(预览)(三)(3)
笨办法学 Python3 第五版(预览)(三)(3)
21 1
|
14天前
|
存储 程序员 索引
笨办法学 Python3 第五版(预览)(二)(4)
笨办法学 Python3 第五版(预览)(二)(4)
37 1
|
14天前
|
存储 程序员 Shell
笨办法学 Python3 第五版(预览)(二)(3)
笨办法学 Python3 第五版(预览)(二)(3)
42 0
|
程序员 Python
笨办法学 Python3 第五版(预览)(一)(2)
笨办法学 Python3 第五版(预览)(一)(2)
39 1
|
程序员 iOS开发 MacOS
笨办法学 Python3 第五版(预览)(一)(1)
笨办法学 Python3 第五版(预览)(一)(1)
64 1
|
5月前
|
Web App开发 前端开发 JavaScript
Python Selenium 浏览器打印预览
Python Selenium 浏览器打印预览
|
Rust 网络协议 IDE
Python语言学习路线及技术汇总预览
Rust语言是一种新型的系统编程语
83 0
Python语言学习路线及技术汇总预览
|
机器学习/深度学习 SQL 前端开发
Python语言学习路线及技术汇总预览
Python语言学习路线及技术汇总预览
121 0
Python语言学习路线及技术汇总预览
|
1天前
|
网络协议 算法 网络架构
Python网络编程之udp编程、黏包以及解决方案、tcpserver
Python网络编程之udp编程、黏包以及解决方案、tcpserver