订阅博客
收藏博客
微博分享
QQ空间分享

网球王子,了解 Python 的 for 循环,美容师培训

频道:社会资讯 标签:PLMM黄玫瑰花语 时间:2019年05月04日 浏览:288次 评论:0条

在本篇博客中,咱们将评论 Pcanzukython 中 for 循环的原理。

咱们将从一组根本比如和它的语法开端,还将评论与 for 循环相关的 else 代码块的用途。

然后咱们将介绍迭代目标、迭代器和迭代器协议,还会学习怎样创立自己的迭代目标和迭代器。

之后,咱们将评论怎样运用迭代目标和迭代器完结 for 循环,以及运用 while 循环经过迭代器协议完结 for 循环逻辑。

最终,咱们将反编译一个简略的 for 循环,并逐渐介绍 Python 解说器在履行 for 循环时履行的指令,以满意咱们的好奇心。这些有助于了解 for 循环运转时的内部作业原理。

Python的for循环

for 句子是 Python 中履行迭代的两个句子之一,另一个句子是 while。假如你对 Pycarrotthon 的迭代并不是很熟悉的话,Python中的迭代:for、while、break、以及continue句子是一个不错的切入点。

Python 中,for 循环用于遍历一个迭代目标的一切元素。循环内的句子段会针对迭代目标的每一个元素项目都履行一次。暂时能够将迭代目标幻想成一个目标调集,咱们能够一个个遍历里边的元素。咱们将在下一节对迭代器迭代目标作具体阐明。

一个简略的 for 循环

咱们先从一个简略 for 循环开端,它遍历一个字符串列表并打印每一个字符串。

如你所见,这个循环实践上遍历了列表中的每一个单词并打印它们。也便是说,在循环的每一次遍历中,变量 word 都被指定为列表中的一个元素,然后履行 for 句子中的代码块。因为列表是一个有序的元素序列,所以乳王循环也是以相同的次序遍历这些元素。

带有 else 子句的 for 循环

Python 中的 for 循环能够挑选是否相关一个 else 子句。else 子句中的代码块是在 for 循环网球王子,了解 Python 的 for 循环,美容师训练完结后才开端履行的,即在迭代目标中的一切元素都遍历完毕之后。现在咱们看一下怎样扩展前面的示例以包括一个 else 条件(子句)。

else 子句适用于何时?

你现已留意到,else 子句是在 for 循环完结之后才履行的。那么 else 代码块的含义是什么呢?for 循环之后的句子不是也是相同会履行吗?

咱们许多时分会遇到这样一种状况,当满意某种条件时,半途完毕 for 循环。且假如这个条件一向未满意,则期望履行另一组句子。咱们一般运用布尔类型的符号完结,下面是一个比如。

调用成果:

而用 else 代码块的话,咱们能够防止运用布尔类型的符号 found_item。咱们看看怎样运用 else 子句重写上面的办法。留意假如 for 循环中的 break 句子被触发履行,那么则会越过 else 块。

所以 else 代码块适用于 for 循环中有 break 句子的状况,且咱们期望 break 条件没有被触发的时分履行一些句子。

不然,与 else 相关的句子只会在 for 循环完毕时才履行。本文的最终一节检查反编译的字节码时你会看到这一点。

for 循环语法

咱们现已看到宋祖英少女照了一些简略的比如,接下来以 for 循环的语法完毕本节。

根本上,关于 iterable 中的每一个元素,都会履行like s卡乐卡et_of_statements_1。一旦一切的元素都迭代一遍,操控器将跳转到 else 代码块中履行 set_of_statements_2

留意,else 子句是可选的。假如没有发现 else 子句,循环会在一切元素都遍历完结后完毕,而且操控网球王子,了解 Python 的 for 循环,美容师训练器会转向程序之后的句子。

可迭上海旅行代目标与迭代器

可迭代目标

在上一节,咱们运用术语 iterable 来标明循环中被迭代的目标。现在咱们来试着了解一下 Python 中的 iterable 目标是什么。

Python 中,一个 iterable 目标指在 for 循环中能够被迭代的恣意目标。这意味着,当这个目标作为参数传递给 iter()方假面骑士铠武法时应该回来一个迭代器。咱们来看一下 Python 中的一些常用的内置迭代的比如。

如你所见,当咱们对一个 iterable 目标调用 ite凶恶魔咒r() 时,它会回来一个迭代器目标。

迭代器

那么什么是迭代器呢?迭代器在 Python 中被界说为一个表现为流式数据的目标。根本上,假如咱们将目标传递给内置的 next() 办法,它应该从与之相关的流式数据中回来下一个值。一旦一切的元素都遍历完毕,它会抛出一个 *StopIteration* 反常。next() 办法的后续调用也都会抛出 *StopIteration* 反常。

咱们用一个列表来试一下。

迭代器也是可迭代目标!可是...

有一个很风趣的事需求记一下,迭代器相同支撑(强制要求支撑迭代器协议iter() 办法。这意味着消防手抄报咱们能够对一个迭代器调用 iter() 办法并获取它自身的迭代器目标。

因而,咱们能够在任何期望配音秀运用迭代器的当地运用它。比lily女装如,for 循环。

但是要留意一点,在像 list 这样的容器目标上调用 iter() 每次都会回来不同的迭代器,而在迭代器上调用 iter() 仅仅回来同一个迭代器。

所以假如你需求进行屡次迭代,而且用迭代器替换一般容器或可迭代目标,那么第2次你会看到一个空的容器。

对一个列表迭代两次

请留意,这是依照咱们的期望运转的。

对一个列表迭代器迭代两次

请留意,迭代器在第一次循环的时分就现已完毕了,第2次咱们看到的是一个空容器。

迭代器协议

前文咱们看到了:

1. 一个可迭代目标,作为参数传递给 iter() 办法时回来一个迭代器

2. 一个迭代器,

1. 作为参数传递给 next() 办法胖次时回来它的下一个元素或许在一切元素都遍历完毕时抛 出 StopIteration 反常。

2. 作为参数传递给 iter() 办法时回来它自身。

迭代协议仅仅仅仅一种将目标界说为迭代器的规范办法。咱们现已在前一学历认证节看到了这种协议的实践运用。依据协议,迭代吴京电影器应该界说以下两个办法:

1. __next__()

1. 每次调用这个办法时,应该回来迭代器的下一个元素。一旦元素都遍历完毕,它应该抛出 Stop网球王子,了解 Python 的 for 循环,美容师训练Iteration 反常。

2. 当咱们调集内置函数 next() 时,实践内部调用的是本办法。

2. __iter__()

1. 这个办法回来迭代器自身

2. 当咱们调集内置函数 iter() 时,实践内部调用的是本办法。

自己写一个迭代器

现在咱们现已知道迭代协议的原理,能够写一个自己的迭代器了。咱们先看一个比如,下面咱们创立了一个依据给定规模和步长的 Range 类。

咱们看一下它在 for 循环中是怎样作业的。

留意,Range 类的实例是迭代器也是可迭代目标。

自己写一个可迭代目标

咱们还能够根据 Range 迭代器别的创立一个可迭代目标。它的作用是每逢调用 __iter()__ 办法是回来一个新的迭代器,在这儿,它应该回来一个新的 Range 目标。

在 for 循环中运用咱们这个 RangeIterable。

for 循环作业原理

现在咱们现已知道什么是迭代器和可迭代目标,接下来了解一下 for 循环是怎样作业的。

再看一下前面的比如。

当咱们履行上面的代码块时,发生了以下这些作业:

1. 在 for 句子内部对列表 ["You", "are", "awesome!"] 调用了 iter() 办法,回来成果是一个迭代器

2. 然后对迭代器调用 next() 办法,并将其回来值赋给变量 word

3. 之后,会履行 for 循环中网球王子,了解 Python 的 for 循环,美容师训练相关的句子网球王子,了解 Python 的 for 循环,美容师训练块。这个比如中是打印 word

4. 在 next() 办法抛出 StopIteration 之前会一向重复履行第 2,3 步。

5. 一旦 next() 抛出 StopIteration,操控器会跳转到 else 子句(假如存在)并履行与 else 相关的句子块。

留意:假如在过程 3 中,for 循环句子遇到了 break 句子,则越过 else 代码块。

运用 while 句子完结 for 循环逻辑

咱们能够像下面这样运用 while 句子完结之前的逻辑。

while 循环的行为实践上与 for 循环相同,上面的代码会有以下输出。

反编译 for 循环

在本节,咱们将反编译 for 循环并逐渐阐明解说器在履行 for 循环时的指windows7旗舰版令。这儿运用 dis 模块来反编译 for 循环。具体来说,便是咱们将运用 dis.dis 办法来生成可读性更高的字节码。

咱们会运用之前一向用的简略 for 循环示例。接下来将文件写入文件 for_loop.py

咱们能够调用 dis.dis 办法取得可读性高的字节码。在终端上运转以下指令。

反adzop编译输出的每列标明以下内容:

1. 第 1 列:代码行数。

2. 第 2 列:假如是跳转指令,则有 ">>" 符号。

3. 第 3 列:以字节为单位的字节码偏移量。

4. 第 4 列:字节码指令自身。

5. 第 5 列:展现指令的参数。假如括号中有内容,它仅仅对参数做了更好的可读性转化。

现在咱们来一步步阅览反编译后的字节码,并测验了解实践发生了什么。

1. 第 1 行,即,"for word in [“You”, “are”, “awesome!”]:" 转译为:

  • 0 SETUP_LOOP 2网球王子,了解 Python 的 for 循环,美容师训练8 (to 30)
  • 该句子将 for 循环中的代码块推送到栈中。这段代码块会跨过 28 个字节,到达 "30"。

  • 这意味着,假如 for 循环中有 break 句子,那么操控器将跳转到偏移方位 "30"。留意当遇到 break 句子时是怎样越过 else 代码块的。
  • 2 LOAD_CONST 0 ((‘You’, ‘are’, ‘awesome!’))
  • 接下来,列表被推送到栈顶(TOS,之后运用 TOS 标明栈顶或栈顶元素)。

  • 4 GE镀组词T_ITER
  • 该指令完结 "TOS = iter(TOS)"。这标明从列表获取一个迭代器(当时为 TOS)古诗十九首,然后将迭代器推送给 TOS。
  • 6 FOR_ITER 12 (to 20)
  • 该指令获取 TOS,作为当时的迭代器, 并调用 next() 办法。

  • 假如 next() 办法发生一个值,则将其作为 TOS 推送到栈,并履行吓一跳指令 "8 STORE_NAME"。
  • 一旦 next() 标明迭代器现已遍历完毕(即抛出 StopIteration 反常),TOS(迭代器)将从栈中弹出,字节码计数器会添加 12。这标明操控器跳转到指令 "20 POP_BLOCK"。
  • 8 STORE_NAME 0 (word)
  • 这个指令履行了转化 word = TOS,即,next() 回来的值被赋给变量 word

2. 第 1 行,即,"print(word)" 转译为:

  • 10 LOAD_NAME 1 (print)
  • 将可调用办法 print 推送到栈中。

  • 12 LOAD_NAME 0 (word)
  • 将栈中的 word 作为参数推送给 print

  • 14 CA网球王子,了解 Python 的 for 循环,美容师训练LL_FUNCTION 1
  • 调用带方位参数的函数。

  • 像咱们看到的指令那样,与函数相关的参数会出现在 TOS 中。在取得可调用象的对(如 print)之前,会弹出一切遇到的参数。
  • 一旦取得可调用目标,则把一切参数传递给它并调用。

  • 可调用目标履行完毕后,把回来值推送到 TOS 中,这儿是 None。
  • 16 POP_TOP
  • TOS(栈顶元素),行将函数的回来值从栈中移除(弹出)。

  • 18 JUMP_ABSOLUTE 6
  • 此刻字节码计数器为 “6”,这标明下一条指令将履行 "6 FOR_ITER"。这是循环遍历迭代器中元素的办法。
  • 留意,一旦迭代器中的元素都遍历完毕,指令 "6 FOR_ITER" 会完毕循环并跳转到 "20 POP_BLOCK"。
  • 20 POP_BLOCK
  • POP_BLOCK 会从代码块的栈中移除由 “0 SETUP_LOOP” 设置的代码块。

3. 留意第 3 行(对应 else),没有相关任何特别指令。程序操控器会次序履行下一条与 else 相关的指令。

4. 第 4 行,即,"print("See you later!")" 转译为:

  • 22 LOAD_NAME 1 (print)
  • 推送与 print 相关的可调用办法到栈中。

  • 24 LOAD_CONST 1 ('See you later!')
  • 推送可调用函数的参数目标到栈中。

  • 26 CALL_FUNCTION 1
  • 可调用函数及其参数会从栈中弹出,然后履行函数并将其回来值推送到 TOS。

  • 28 POP_TOP
  • TOS(栈顶元素),行将函数回来值(这儿是 None)从栈中移除。

5. 下面的两个指令仅仅简略的将脚本的回来值(None)加载到栈并回来。

  • 30 LOAD_CONST 2 (None)
  • 32 RETURN_VALUE

喔!现在咱们现已了解了 for 循环反编译后的指令。期望这有助于更好地了解 for 循环的作业原理。

总结

经过本篇博客咱们学到了以下内容:

1. 用 Python 怎样写 for 循环?

2. 什么时分适合用带有 else 子句的 for 循环?

3. 什么是迭代器和迭代目标?

4. 什么是迭代协议?

5. 怎样自界说一个迭代器和迭代目标?

6. for 循环的作业原理是什么?

7. 怎样运用 while 循环仿写一个 for 循环?

8. 何如经过 dis 模块反编译 for 循环并检查由 Python 解说器履行的高可读性指令?怎样阅览并了解反编译指令?