python生成式与生成器,python怎么生成软件
生成列表生成器是python内置的一个非常强大的生成器,可以用来生成列表。在学习生成器之前,先了解一下列表生成公式,有助于我们团队的生成器理解。
产品的语法格式如下
[exp for ITER _ var in iterable if _ exp]列表生成公式的实际执行过程如下:
迭代iterable中的每个元素,每次迭代首先判断if_exp表达式结果是否为真,为真则进行下一步,为假则进行下一次迭代;将迭代结果赋给iter_var,然后通过exp得到一个新的计算值;最后,通过exp获得的所有计算值都以新列表的形式返回。如果不需要过滤迭代元素,可以省略if_exp。
如果要生成1到100的整数列表,可以用list(range(1,101)),如果要1到100的整数平方,可以用loop来实现。
List=[] for x in range (1,101): list。append (x * x) print (list)除了选择,我们还可以使用列表生成公式来实现。
List=[x * x for x in range (1,101)] print (list)现在我们需要从1到100的所有偶数的平方。我们也可以使用列表生成公式来实现这一点。
List=[x * x for x in range (1,101) if x% 2==0] print (list)利用列表产生式,我们可以编写简洁的代码快速初始化列表。
生成器从名字上可以理解为生成数据的工具。生成器一直按照一些特定的规则生成数据,直到结束。
生成器的语法规则如下:
(iterable if_exp中iter_var的exp)从形式上看,生成器与列表生成器非常相似。生成器只是用圆括号替换了列表生成器的方括号。但是实际使用起来差别很大。如果一个列表中的元素太多,那么列表生成方法会占用大量的内存空间,而生成器一次只生成一个元素,既节省了内存空间,又能获得完整的列表内容。
#!/usr/无奈的外套/env python 3 #-*-编码:UTF-8-*-list 1=[x * x for x in range(1,20)if x % 2==0]list 2=(x * x for x in range(1,20)if x % 2==0)print(type(list 1))print(type(list 2))print(list 1)print(list 2)for n in list 2:print(n)for n in list 2:print(n)上述代码执行结果如下:
Class list class generator [4,16,36,64,100,144,196,256,324] generator对象gen exprat0x 1011633904163664100144196256324]从上面代码的执行结果中我们可以看到,列表生成公式是用来生成使用生成器生成一个不包含任何元素的生成器。当我们用for循环迭代时,可以得到生成器生成的整个列表的元素,但是生成器只能迭代一次,迭代完成后,就不能再得到内容了。这也是迭代器的特点。
发电机的用途很多,很多地方替换清单都是不错的选择。特别是对于大量的值,链表占用内存比较多,生成器的好处就是占用内存少。所以没必要把生成器实例化成列表直接操作,以显示其迭代优势。
上面的列表是一个比较简单的生成器,可以通过列表生成直接修改。如果是比较复杂的生成器,需要使用包含yield的函数来实现。让我们通过yield函数实现上面的列表(包括1到20所有偶数的平方)。
#!/usr/无奈的外套/env python 3 #-*-编码:UTF-8-*-def even _ squares (start,end): for n in range (start,end):if n % 2==0:yield n * nlist=even _ squares(1,20)print(type(list))print(list)for n in list:print(n)上述代码执行结果如下
class generator generator object even _ squares at0x 10 aa 38 c 00416364100144196256324从上面的代码运行结果可以看出,使用yield函数得到的结果和使用list生成公式的生成器得到的结果是完全一样的。
该发电机具有以下特点:
它可以以类似于列表生成公式的方式或通过使用yield函数来生成。生成器只在使用时生成数据,可以用来节省内存空间。生成器实际上是一个特殊的迭代器,可以使用for循环进行迭代。只记录当前位置,只向前不向后。“发电机只能使用一次,需要重新初始化”。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。