一、Python generator高级方法介绍
Python yield 是generator实现各种功能的核心。除了yield之外,generator对象还可以使用以下方法:
.send():一般用于发送消息
.throw():可以抛出异常
.close():关闭generator对象
通过以上方法可以构建出一个事件循环消息系统。基于这样一种循环结构,你可以在程序中添加一个数字,基于此来启动下一个数字的搜索。在操作中可以使用throw()方法来处理异常,并且在满足给定条件的情况下调用方法close()来关闭这个generator对象。
首先来看下这段代码:
我们运行一下这条语句看下效果:
print(is_palindrome(10100))
根据上面代码逻辑应该返回False:
再运行这条语句:
print(is_palindrome(10101))
下面使用yield来改造上面这段代码,改造后的代码并不返回True或者False:
Yield本质上来说是一个表达式而不是一条语句(当然你可以把它作为语句使用),这里通过yield返回值给调用者。当调用者再次调用这个方法时,关于变量i的赋值会有两种情况,一种情况是调用者调用方法时没有传入新的值,那么i会被赋予之前通过yield产生的值;而如果调用者传入了新的值,那么变量i会被赋予新的值。我们可以通过这样的方式来操作yield产生的值。更重要的是,调用者可以使用方法send()来发送一个值给generator对象,当在上面这段代码中执行yield之后的下一条指令时,就会把发送的值赋予变量i。
你可以检查是否i不为None,这是因为可以在generator对象上调用next()方法(使用for循环时就会发生这种情况)。如果i有值,那么就使用新的值来更新它,但是与i是否有值无关,上面的代码都会使num的值递增并且重新启动循环来查找符合palindrome结构的数字。
二、应用示例解析
下面写一个调用方法来看下上面提到的代码是如何工作的。
在这段代码中,首先创建一个generator对象,然后迭代循环这个对象,通过调用send()方法返回值给generator对象。这段代码只会在一旦找到一个符合palindrome结构(譬如数字10101)的数字时才会使用yield产生一个值,然后使用len()方法取得这个值的位数,通过方法send()发送10 ** digits给generator对象,并给变量i赋值为10 ** digit,这时方法infinite_palindrome()就会更新num并启动新的循环来检查符合palindrome结构的数字。
下面是执行这段代码之后输出的效果: