Python讲解,python总结笔记
迭代程序
本节讨论迭代器。只讨论一个特殊的方法——_ _ ITER _ _这是迭代器规则的基础。
迭代器规则
迭代意味着多次重复做某事——就像在循环中做一样。__iter__方法返回迭代器。迭代器是带有next方法的对象。当调用下一个方法时,迭代器将返回它的下一个值。如果调用了下一个方法,但是迭代器没有返回值,将抛出StopIteration异常。
这里有几个Queponachi的例子,使用迭代器如下:
班级小谎:
def __init__(self):
self.a=0
self.b=1
定义下一个(自己):
self.a,self.b=自我
回归自我
def __iter__(self):
回归自我
fibs=Fibs()
对于fib中的f:
如果f 1000:
打印f
Break #因为设置了Break,所以循环在这里停止。
1597
内置函数iter可以从iterable对象中获取迭代器。
it=iter([1,2,3])
it.next()
一个
it.next()
2
从迭代器获取序列
除了在迭代器和可迭代对象上迭代,还可以转换成序列。在大多数可以使用序列的情况下,可以用迭代器来代替。
等级测试员:
值=0
定义下一个(自己):
self.value=1
if self.value 10:引发StopIteration
回归自我价值
def __iter__(self):
回归自我
ti=TestIterator()
列表(ti)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
建设者
生成器也称为简单生成器。生成器可以帮助读者编写非常优雅的代码。当然,不使用生成器也可以编写任何程序。
创建生成器
创建一个生成器就像创建一个函数一样简单。
定义展平(嵌套):
对于嵌套子列表:
对于子列表中的元素:
屈服元素
嵌套=[[1,2],[3,4],[5]]
#使用for循环
对于展平(嵌套)中的数量:
打印编号
一个
2
三
四
五
#或使用列表功能
列表(平铺(嵌套))
[1, 2, 3, 4, 5]
递归生成器
上面创建的生成器只能处理两级嵌套,两个for循环用于处理嵌套。如果您想处理任何级别的嵌套,该怎么办?比如,你可以为每一层嵌套添加一个For循环,但是你不知道嵌套有多少层,所以你必须使解决方案更加灵活。现在你可以用递归来解决它。
def fla(aa):
尝试:
对于aa中的bb:
对于fla中的cc(bb):
产量cc
除了类型错误:
产量aa
List (Fla ([[1],2],3,4,[5,[6,7]],8]) #注意括号有很多级。
[1, 2, 3, 4, 5, 6, 7, 8]
调用fla有两种情况:基本情况和需要递归的情况。
在基本情况下,函数被告知展开一个元素。在这种情况下,for循环将抛出TypeError异常,并且生成将产生一个元素。
如果列表被扩展,则需要特殊情况处理。程序必须遍历所有子列表,并对它们调用fla。
-
上面的方法有一个问题:如果aa是类字符串对象(string、Unicode、UserString等。),那么它就是一个不会引发TypeError的序列,但是你不想在这样的对象上迭代。
为了处理这种情况,您必须在生成器的开头添加一个check语句。尝试用字符串拼接传入对象,看是否会出现TypeError。这是检查一个对象是否类似于一个字符串的最简单快捷的方法。
定义展平(嵌套):
尝试:
#不要迭代类似字符串的对象
try:嵌套的“”
除了类型错误:通过
否则:引发类型错误
对于嵌套子列表:
对于展平中的元素(子列表):
屈服元素
除了类型错误:
产出嵌套
列表(扁平化([foo ,[bar ,[baz]]))
[foo , bar , baz]
如果嵌套“”引发了TypError,它将被忽略。如果没有抛出TypeError,内部try语句将抛出自己的TypeError异常。
生成器方法
一个新的生成器属性是在生成器开始运行后为其提供一个值的能力。性能生成器与“外部世界”通信的通道:
*外部作用域访问生成器的send方法,就像下一个方法一样,只是前者使用一个参数(“消息”sent-any对象)
*在内部,发电机是暂停的。yield现在用作表达式,而不是语句。换句话说,当生成器重新运行时,yield方法返回一个值,即send方法外部发送的值。如果使用next方法,yield方法将返回None。
下面的简单示例说明了这种机制:
定义中继器(值):
虽然正确:
新=(收益值)
如果new不为None:value=new
r=中继器(42)
r.next()
四十二个
r.send(你好,世界!)
“你好,世界,”
另外两种方法的生成器:
*throw方法(用异常类型、可选值和回溯对象调用)用于在生成器中抛出异常(在yield表达式中)。
*close方法(调用时不带参数)用于停止生成器。
否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。