__iter__方法会返回一个迭代器(iterator),所谓的迭代器就是具有next方法(这个方法在调用时不需要任何参数)的对象。在调用next方法时,迭代器会返回它的下一个值。...如果next方法被调用,但迭代器没有值可以返回,就会引发一个StopIteration异常。 注:迭代器规则在Python3.0中有一些变化。...迭代规则的关键是什么?为什么不使用列表?因为列表的杀伤力太大。如果有一个函数,可以一个接一个地计算值,那么在使用时可能是计算一个值时获取一个值——而不是通过列表一次性获取所有值。...在基本情况中,函数被告知展开一个元素(比如一个数字),这种情况下,for循环会引发一个TypeError异常(因为试图对一个数字进行迭代),生成器会产生一个元素。...☑ 迭代器:迭代器是带有next方法的简单对象。迭代器能在一系列的值上进行迭代。当没有值可供迭代时,next方法就会引发StopIteration异常。
然后该函数从输入中读取一 行,将其转换为一个字符串(剥离尾随的换行符),然后返回该行。当EOF被读取时, EOFError被提出。...如果classinfo不是类型和元组的类型或元组,TypeError则会引发异常。...classinfo可以是类对象的元组,在这种情况下,将检查classinfo中的每个条 目。在其他情况下,TypeError会引发异常。...如果它不支持这些协议中的任何一 个, TypeError则会引发。如果给出了第二个参数sentinel,那么object必须是可调用的对象。...在这种情况下创建的迭代器将为每个对其方法的调用调用没有参数的 对象next(); 如果返回的值等于 哨兵,StopIteration 将被提出,否则该值将被退回。
在我们的程序中,事情并非一帆风顺。 特别是在某些情况下,我们可能希望在停止程序或在发生不良状况时通知用户。例如: 程序试图打开一个不存在的文件。 网络连接断开。 用户进行了无效的输入。...有两种方法从生成器中提取值: 在迭代器对象上调用 next()。 iteration with for...of. 带有 for ... of 的迭代。...但是这在大多数情况下并没有什么意义。Promises 的异步错误处理提供了更好的方式。...在这里的迭代器对象上调用 throw() 不会引发异常,但是会被 Promise 拒绝: async function* asyncGenerator() { yield 33; yield 99...在回调模式中,异步 Node.js API 接受通过事件循环处理的函数,并在调用栈为空时立即执行。
使用原生协程和相应的新语法,我们可以在异步编程时使用上下文管理器(context manager)和迭代器。...如下文所示,新的async with语句可以在进入、离开运行上下文(runtime context)时进行异步调用,而async for语句可以在迭代时进行异步调用。...如果__await__返回的不是一个迭代器,则引发TypeError异常。 ...在使用async with时,如果上下文管理器没有__aenter__和__aexit__方法,则会引发错误。在async def函数之外使用async with则会引发SyntaxError异常。...异步迭代器和“async for” 异步迭代器可以在它的iter实现里挂起、调用异步代码,也可以在它的__next__方法里挂起、调用异步代码。
迭代器对象即实现了迭代器协议的对象,在 Python 中,支持迭代器协议就是实现对象的 __iter__() 和 next() 方法(注:在 Python3 中被改为 next 方法)。...其中 __iter__() 方法返回迭代器对象本身;next() 方法返回容器的下一个元素,在结尾时引发 StopIteration 异常。...当容器中没有可以访问的元素时, next() 方法将会抛出一个 StopIteration 的异常,从而终止迭代器。...也就是说, 第一次调用时,要使用 next() 语句或 send(None),因为没有 yield 语句来接收这个值。 throw() 用于在生成器内引发一个异常。...close() 用于停止生成器,调用它时,会在 yield 运行出引发一个 GeneratorExit 异常。
本文主要介绍Python3.6.5标准库文档(完整中文版)---内置函数:filter(),float(),format(),frozenset() filter(函数,可迭代) 从构造的那些元件的迭代器可迭代为哪些函数...可迭代可以是序列,支持迭代的容器或迭代器。如果函数是None,则假定标识函数,即删除所有可迭代的元素。 注意,如果函数不是且函数是 ,则等价于生成器表达式。...否则,如果参数是整数或浮点数,则返回具有相同值(在Python的浮点精度内)的浮点数。如果参数超出了Python浮点的范围,OverflowError则会引发。...format_spec的默认值是一个空字符串,通常与调用效果相同str(value)。 调用将被转换为 在搜索该值的方法时绕过实例字典。...__format__(format_spec) 引发。TypeError 类frozenset([ iterable ] ) 返回一个新的frozenset对象,可选的元素来自iterable。
如果第一个参数是一个字符串,它将被解释为一个复数,并且该函数必须在没有第二个参数的情况下被调用。第二个参数不能是一个字符串。每个参数可以是任何数字类型(包括复数)。...在任何其他情况下,都会引发 TypeError 异常。 iter(object[,sentinel]) 返回一个迭代器对象。根据第二个参数是否存在,第一个参数的解释有所不同。...在这种情况下创建的迭代器将调用没有参数的 object,以便对其 __next__() 方法进行调用;如果返回的值等于 sentinel,则会触发StopIteration,否则将返回该值。...使用多个迭代器时,当最短迭代器耗尽时,迭代器停止。...当最短的输入迭代耗尽时,迭代器停止。使用单个迭代参数,它将返回 1 元组的迭代器。没有参数,它返回一个空的迭代器。
属性错误 对属性赋值或引用引发的。 欧费罗 当 input()函数达到文件结束条件时引发。 浮动指针错误 浮点运算失败时引发。 GeneratorExit 调用生成器的 close()方法时引发。...停止迭代 由 next()函数引发,表示迭代器不再返回任何项。 句法误差 遇到语法错误时由解析器引发。 内建 Error 当缩进不正确时引发。...TabError 当缩进由不一致的制表符和空格组成时引发。 系统误差 解释器检测到内部错误时引发。 系统退出 由 sys.exit()函数引发。 类型错误 当函数或操作应用于不正确类型的对象时引发。...unboundlocalherror 当引用函数或方法中的局部变量,但没有值绑定到该变量时引发。 UnicodeError 错误 发生与 Unicode 相关的编码或解码错误时引发。...当next()函数超出迭代器项时,抛出StopIteration。
如果第一个参数是一个字符串,它将被解释为一个复数,并且该函数必须在没有第二个参数的情况下被调用。第二个参数不能是一个字符串。每个参数可以是任何数字类型(包括复数)。...一个类被认为是它自己的一个子类。 classinfo 可以是类对象的元组,在这种情况下,将检查 classinfo 中的每个条目。在任何其他情况下,都会引发 TypeError 异常。...在这种情况下创建的迭代器将调用没有参数的 object,以便对其 __next__() 方法进行调用;如果返回的值等于 sentinel,则会触发StopIteration,否则将返回该值。...如果传递额外的 iterable 参数,function 必须采用多个参数并应用于并行所有迭代中的项目。使用多个迭代器时,当最短迭代器耗尽时,迭代器停止。...使用单个迭代参数,它将返回 1 元组的迭代器。没有参数,它返回一个空的迭代器。
(generator)发生异常来通知退出 +-- Exception 常规错误的基类 +-- StopIteration 迭代器没有更多值 +-- StopAsyncIteration...必须通过异步迭代器对象的__anext__()方法引发以停止迭代 +-- ArithmeticError 所有数值计算错误的基类 | +-- FloatingPointError...+-- BufferError 与缓冲区相关的操作时引发 +-- EOFError 没有内建输入,到达EOF 标记 +-- ImportError...在目录上请求文件操作 | +-- NotADirectoryError 在不是目录的事物上请求目录操作 | +-- PermissionError 在没有访问权限的情况下运行操作...TabError Tab 和空格混用 +-- SystemError 一般的解释器系统错误 +-- TypeError 对类型无效的操作 +-- ValueError
最终,在 3.7 中,旧的 __aiter__ 协议将被废弃,如果 __aiter__ 返回的不是异步迭代器,则会引发 RuntimeError。...在重构这些函数时,如果删除或新增了 yield 相关语句就可能会导致一些不明显的错误; 只能在 yield 语法支持的地方进行异步调用,无法异步调用类似 with 或 for 这样的语句,限制了可用性。...稍后会在提案中提及:新的 async with 语句允许 Python 程序在进入或退出上下文上时执行异步调用,而新的 async for 语句可以在迭代器中执行异步调用。...异步迭代器和 async for 所谓异步迭代器,是一种可以在 iter 和 next 方法中调用异步代码的迭代器。...为什么不复用现有魔术方法 存在一个异步迭代器和异步上下文管理器的备选方案,提议在声明中添加 async 关键字来复用现有的魔术方法: class CM: # 代替 __aenter__ async
例如,以下代码在 items 为一个序列(sequence)时可以良好地运行,但是如果调用者将 item 重构为一个可消耗的迭代器,则代码会悄悄地产生缩短的、不匹配的结果: def apply_calculations...调用内置类 zip 时,如果参数的长度不同,则生成的迭代器会引发 ValueError。...参数类型错误时抛出 TypeError(如果 iters 只包含一个元素,不是一个 zip 迭代器)。 否则,参数数量不对时抛出 TypeError。...(7)变更 zip 的默认行为 zip 的默认行为没有什么“错” ,因为在许多情况下,这确实是正确处理大小不等的输入的方法。例如,在处理无限迭代器时,它非常有用。...(9)引发一个 AssertionError 没有内置函数或内置类的 API 会引发 AssertionError。
如果异常没有处理或捕捉,程序就会用traceback终止程序的执行,如果是在多线程程序中,则会终止当前线程的执行。...+-- SystemError # 解释器中的非致命系统错误 +-- TypeError # 给操作传递了错误的类型 +-- ValueError # 无效类型...TypeError: unsupported operand type(s) for /: 'str' and 'str' 结论: 任何情况下finally语句都会执行。...在函数内引发异常时,如果异常没有被捕获到,那么它就会被传播到函数被调用的地方。...a中引发的异常,会传递到父函数的调用出 ...: print('exit b') # a中抛出异常之后传递到b,中止b的执行 ...: In [3]: b()
当我们使用一个循环来循环某些东西时,它被称为迭代。 这是过程本身的名字。 生成器Generators 生成器是迭代器,但是只能迭代一次。 这是因为他们没有将所有的值存储在内存中,他们在运行中生成值。...生成器最适合计算大量结果集(特别是涉及循环本身的计算),因为您不希望在同一时间为所有结果分配内存。...我们已经讨论过我们只能迭代一次生成器,但是我们没有测试过。 在测试之前,您需要了解Python的另一个内置函数next()。 它允许我们访问序列的下一个元素。...你可能想知道为什么使用for循环时不会出现这个错误? 那么答案很简单。 for循环自动捕获这个错误,然后停止调用next()。 你知道Python中的一些内置数据类型也支持迭代吗?...它从一个迭代中返回一个迭代器对象。 虽然int不是可迭代的,但我们可以在字符串上使用它!
在研究 typeshed 时,我发现了 bug 报告 #4051:Mypy 没有警告说将 None 作为内置 max() 函数的参数之一是非法的,或者传递一个在某个时刻产生 None 的可迭代对象也是非法的...② 在调用.load('ABC')时,Mypy 解释了为什么str不行:str....如果b没有__radd__,或者调用它返回NotImplemented,则引发TypeError,并显示不支持的操作数类型消息。...警告 如果中缀运算符方法引发异常,则会中止运算符分派算法。在TypeError的特定情况下,通常最好捕获它并返回 NotImplemented。...④ 否则,尝试从other中获取一个迭代器。⁷ ⑤ 如果失败,引发一个解释用户应该做什么的异常。 在可能的情况下,错误消息应明确指导用户解决方案。
为什么序列是可迭代的:iter 函数 每当 Python 需要对对象x进行迭代时,它会自动调用iter(x)。 iter内置函数: 检查对象是否实现了__iter__,并调用它以获取迭代器。...毕竟,当尝试在不可迭代对象上进行迭代时,Python 引发的异常足够清晰:TypeError: 'C' object is not iterable。...如果你可以比简单地引发TypeError更好,那么在try/except块中这样做而不是进行显式检查。显式检查可能在稍后持有对象以进行迭代时是有意义的;在这种情况下,尽早捕获错误会使调试更容易。...A B C ① 从可迭代对象构建迭代器it。 ② 反复调用迭代器上的next以获取下一个项目。 ③ 当没有更多项目时,迭代器会引发StopIteration。...⑥ 因为g是一个迭代器,调用next(g)会获取yield产生的下一个项目。 ⑦ 当生成器函数返回时,生成器对象会引发StopIteration。 生成器函数构建一个包装函数体的生成器对象。
greet,然后传入参数 someone,然后函数内,一个 print 语句其中 someon 是一个没有定义的变量,然后通过 greet (‘Chad’),调用刚才定义的 greet 函数,运行之后会出现如下错误信息...然后,greet 函数接受一个 someone 和一个可选的 greeting,之后调用 print 函数,在 print 中调用 who_to_greet 函数并传入参数 someone。...最后,greet_many(),将迭代 people 列表并调用 greet 函数。如果通过调用 greet()引发异常,则会打印一个简单的问候语。...只要提供了正确的输入,此代码就没有任何可能导致异常被引发的错误。...有时在引发异常之后,另一部分代码会捕获该异常并导致异常。在这种情况下,Python 将按接收顺序输出所有异常信息,最外层的异常信息处于 Traceback 内容的最下面位置。
常规错误的基类 StopIteration 迭代器没有更多的值 GeneratorExit 生成器(generator)发生异常来通知退出 StandardError 所有的内建标准异常的基类 ArithmeticError...在最后一种情况下,args将逐个构造函数的参数包含为元组。 以下异常是实际引发的异常。 异常AssertionError 当assert声明失败时提起。...异常EOFError 当其中一个内置函数(input()或raw_input())在没有读取任何数据的情况下触发文件结束条件(EOF)时引发。...异常RuntimeError 当检测到不属于任何其他类别的错误时引发。相关联的值是一个字符串,表示正确的错误。 异常StopIteration 由迭代器的next()方法引发,表明没有其他值。..._exit()如果绝对有必要立即退出(例如,在调用后的子进程os.fork())中,则可以使用该函数。
6 同步错误处理 同步代码在大多数情况下很简单,它的错误处理也是如此。 常规函数的错误处理 同步代码的执行顺序和代码的编写顺序一致。...为了 从生成器中提取值,我们可以使用两种方法: 在迭代器对象上调用 next() for...of 的 迭代 以我们的示例为例,要从生成器获取值,我们可以这样做: function* generate(...) { yield 33; yield 99; } const go = generate(); 当我们调用生成器函数时,go 成为我们的迭代器对象。...但是,这种方法在大多数情况下没有多大意义。稍后我们将看到,使用 Promises 进行异步错误处理可提供更好的开发体验。...从异步生成器函数返回的迭代器对象也有一个 throw() 方法,非常像它的同步形式。
特别是在某些情况下,我们可能希望停止程序或在发生不良情况时通知用户。...如果你重新赋值给 const 声明的变量时,就会引发 TypeError 错误。...当我们在浏览器中执行愚蠢的操作时,它们会被抛出,例如: document.body.appendChild(document.cloneNode(true)); 结果: Uncaught DOMException...{ yield 33; yield 99; } 生成器函数的返回值是一个迭代器对象(iterator object)。...除了next()之外,从生成器返回的迭代器对象还具有throw()方法。
领取专属 10元无门槛券
手把手带您无忧上云