xml地图|网站地图|网站标签 [设为首页] [加入收藏]

Python列表生成式与生成器操作示例,迭代器和生

来源:http://www.ccidsi.com 作者:集成介绍 人气:134 发布时间:2019-10-04
摘要:正文实例呈报了Python列表生成式与生成器操作。分享给我们供我们仿效,具体如下: 前言 那篇博客写了比较久,其实写每一篇博客用的时日也许挺长的,相当不够那便于团结的上学,

正文实例呈报了Python列表生成式与生成器操作。分享给我们供我们仿效,具体如下:

前言

那篇博客写了比较久,其实写每一篇博客用的时日也许挺长的,相当不够那便于团结的上学,也想共享一下。在此以前也说了创制了一个微信群,Python 学习探讨群,今后独有 三十八个左右的同伙,假设有意思味出席学习商讨的话,能够加作者微信:androidwed,拉你进群。想看回以前的文章,也得以经过 Gitbook 查看,招待提议难题和点下 star,及时查阅更新。

列表生成式:能够用来创制list的生成式

目录

图片 1

草根学Python(七) 迭代器和生成器

举例想要生成类似[1*1,2*2,3*3,…..100*100]的这种list

一、迭代

哪些叫做迭代?

比方在 Java 中,我们透过 List 集结的下标来遍历 List 集结中的元素,在 Python 中,给定四个 list 或 tuple,我们能够通过 for 循环来遍历这一个 list 或 tuple ,这种遍历正是迭代。

可是,Python 的 for 循环抽象程度要高于 Java 的 for 循环的,为啥那样说啊?因为 Python 的 for 循环不仅可以够用在 list 或tuple 上,还足以成效在别的可迭代对象上。也正是说,只如果可迭代的对象,无论有未有下标,都以能够迭代的。

比如:

# -*- coding: UTF-8 -*-

# 1、for 循环迭代字符串
for char in 'liangdianshui' :
    print ( char , end = ' ' )

print('n')

# 2、for 循环迭代 list
list1 = [1,2,3,4,5]
for num1 in list1 :
    print ( num1 , end = ' ' )

print('n')

# 3、for 循环也可以迭代 dict (字典)
dict1 = {'name':'两点水','age':'23','sex':'男'}

for key in dict1 :    # 迭代 dict 中的 key
    print ( key , end = ' ' )

print('n')

for value in dict1.values() :   # 迭代 dict 中的 value
    print ( value , end = ' ' )

print ('n')

# 如果 list 里面一个元素有两个变量,也是很容易迭代的
for x , y in [ (1,'a') , (2,'b') , (3,'c') ] :
    print ( x , y )

输出的结果如下:

l i a n g d i a n s h u i 

1 2 3 4 5 

name age sex 

两点水 23 男 

1 a
2 b
3 c

可以用

二、Python 迭代器

上边轻易的介绍了一晃迭代,迭代是 Python 最强劲的功用之一,是访谈集结成分的一种艺术。今后标准步入正题:迭代器,迭代器是三个方可记住遍历的职位的靶子。

迭代器对象从集合的首先个因素初步访问,直到全部的要素被访谈完结束。

迭代器只好往前不会滞后。

迭代器有八个主导的法子:iter() 和 next(),且字符串,列表或元组对象都可用于创设迭代器,迭代器对象能够利用正规 for 语句实行遍历,也足以选拔 next() 函数来遍历。

切实的实例:

# 1、字符创创建迭代器对象
str1 = 'liangdianshui'
iter1 = iter ( str1 )

# 2、list对象创建迭代器
list1 = [1,2,3,4]
iter2 = iter ( list1 )

# 3、tuple(元祖) 对象创建迭代器
tuple1 = ( 1,2,3,4 )
iter3 = iter ( tuple1 )

# for 循环遍历迭代器对象
for x in iter1 :
    print ( x , end = ' ' )

print('n------------------------')

# next() 函数遍历迭代器
while True :
    try :
        print ( next ( iter3 ) )
    except StopIteration :
        break

末尾输出的结果:

l i a n g d i a n s h u i 
------------------------
1
2
3
4
[x * x for x in range(1,11)]

三、lsit 生成式(列表生成式)

如此就能够生成,除了那一个之外,前面仍是能够加多判定标准来筛选

1、创建 list 的方式

事先经过我们的学习,都了然哪些创建一个 list ,可是有个别情状,用赋值的情势创立八个 list 太难为了,极度是有规律的 list ,贰个一个的写,多少个几个赋值,太费劲了。举个例子要生成三个有 30 个成分的 list ,里面的成分为 1 - 30 。大家得以那样写:

# -*- coding: UTF-8 -*-

list1=list ( range (1,31) )
print(list1)

输出的结果:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]

那一个其实在前头也可以有涉嫌过:比方有个例证,打字与印刷九九乘法表,用这个办法其实就几句代码就足以了,具体可以看后面包车型客车这些章节:标准化语句和循环语句综合实例

而是,假设用到 list 生成式,能够一句代码就生成九九乘法表了。具体看代码:

print('n'.join([' '.join ('%dx%d=-' % (x,y,x*y)  for x in range(1,y 1)) for y in range(1,10)]))

最后输出的结果:

1x1= 1
1x2= 2 2x2= 4
1x3= 3 2x3= 6 3x3= 9
1x4= 4 2x4= 8 3x4=12 4x4=16
1x5= 5 2x5=10 3x5=15 4x5=20 5x5=25
1x6= 6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36
1x7= 7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49
1x8= 8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64
1x9= 9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81

然则,这里大家先要了然哪些创设 list 生成式

比如

2、list 生成式的创设

先是,lsit 生成式的语法为:

[expr for iter_var in iterable] 
[expr for iter_var in iterable if cond_expr]

第一种语法:首先迭代 iterable 里存有剧情,每三次迭代,都把 iterable 里相应内容放到iter_var 中,再在表明式中选拔该 iter_var 的内容,最终用表明式的测算值生成贰个列表。

其次种语法:加入了决断语句,唯有满意条件的从头到尾的经过才把 iterable 里相应内容放到 iter_var 中,再在表达式中央银行使该 iter_var 的剧情,最后用表达式的臆度值生成二个列表。

实在简单了然的,因为是 list 生成式,由此一定是用 [] 括起来的,然后中间的说话是把要转换的因素放在前方,前面加 for 循环语句可能 for 循环语句和判别语句。

例子:

# -*- coding: UTF-8 -*-
lsit1=[x * x for x in range(1, 11)]
print(lsit1)

输出的结果:

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

能够见到,正是把要调换的因素 x * x 放到前边,后边跟 for 循环,就足以把 list 创造出来。那么 for 循环前面有 if 的情势吗?又该怎么着知道:

# -*- coding: UTF-8 -*-
lsit1= [x * x for x in range(1, 11) if x % 2 == 0]
print(lsit1)

出口的结果:

[4, 16, 36, 64, 100]

本条例子是为着求 1 到 10 中偶数的平方根,上边也谈到, x * x 是要调换的因素,前面那部分其实正是在 for 循环中嵌套了叁个 if 剖断语句。

那么有了那一个知识点,大家也足以猜度出,for 循环之中也嵌套 for 循环。具体示例:

# -*- coding: UTF-8 -*-
lsit1= [(x 1,y 1) for x in range(3) for y in range(5)] 
print(lsit1)

输出的结果:

[(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (2, 1), (2, 2), (2, 3), (2, 4), (2, 5), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5)]

事实上掌握了 list 生成式是怎么着结合的,就轻巧精晓这一个事物了。因为 list 生成式只是把后面学习的知识点举办了咬合,换到了一种更简短的写法而已。

[x * x for x in range(1,11) if x%2=0] 

四、生成器

那般就可以筛选出唯有偶数的平方

1、为啥必要生成器

通过上边包车型大巴读书,能够知晓列表生成式,咱们得以一直创立贰个列表。然而,受到内存限制,列表容积肯定是有限的。并且,创建三个包蕴一千万个要素的列表,不止占用异常的大的囤积空间,要是大家只是供给探望前面多少个因素,那前面绝大多数要素占用的上空都白白浪费了。

据此,要是列表成分得以遵从某种算法推算出来,那大家是还是不是足以在循环的进程中持续推算出后续的要素呢?那样就不必制造完整的 list,进而省去大批量的上空。在 Python 中,这种单方面循环一边图谋的编制,称为生成器:generator。

在 Python 中,使用了 yield 的函数被称呼生成器(generator)。

跟平时函数不一样的是,生成器是三个回去迭代器的函数,只好用来迭代操作,更简明点清楚生成器正是叁个迭代器。

在调用生成器运维的历程中,每趟碰到 yield 时函数会暂停并保存当前持有的运作音讯,再次来到yield的值。并在下贰次推行next()方法时从近来地方接二连三运维。

那正是说如何创制叁个生成器呢?

还是能用多层循环来生成全排列

2、生成器的创导

最简便易行最轻松易行的措施正是把一个列表生成式的 [] 改成 ()

# -*- coding: UTF-8 -*-
gen= (x * x for x in range(10))
print(gen)

出口的结果:

<generator object <genexpr> at 0x0000000002734A40>

创设 List 和 generator 的区分仅在于最外层的 []() 。可是生成器并不真正创立数字列表, 而是再次来到四个生成器,那几个生成器在每回计算出贰个条约后,把那些条约“爆发” ( yield ) 出来。 生成器表明式使用了“惰性总计” ( lazy evaluation,也是有翻译为“延迟求值”,笔者觉着这种按需调用 call by need 的办法翻译为惰性越来越好有的),独有在追寻时才被赋值( evaluated ),所以在列表比较长的情景下行使内部存款和储蓄器上更实用。

那正是说依旧知道了怎么样创设叁个生成器,那么怎么查看里面包车型客车要素呢?

[m n for m in 'ABC' for n in 'XYZ']

3、遍历生成器的要素

按我们的构思,遍历用 for 循环,对了,大家得以推行:

# -*- coding: UTF-8 -*-
gen= (x * x for x in range(10))

for num  in  gen :
    print(num)

是的,间接那样就足以遍历出来了。当然,下边也涉及了迭代器,那么用 next() 可以遍历吗?当然也是足以的。

总的说来 列表生成式能够飞快的改造知足条件的list

4、以函数的样式达成生成器

地方也关系,创设生成器最简便最简便易行的形式就是把三个列表生成式的 [] 改成 ()。为什么遽然来个以函数的花样来创设呢?

实际生成器也是一种迭代器,可是你只可以对其迭代二回。那是因为它们并未把持有的值存在内存中,而是在运营时生成值。你通过遍历来选取它们,要么用一个“for”循环,要么将它们传递给自由能够实行迭代的函数和协会。并且事实上应用中,大好些个的生成器都以透过函数来达成的。那么大家该如何通过函数来创设呢?

先不急,来看下这些例子:

# -*- coding: UTF-8 -*-
def my_function():
    for i in range(10):
        print ( i )

my_function() 

出口的结果:

0
1
2
3
4
5
6
7
8
9

倘若大家必要把它成为生成器,我们只须求把 print ( i ) 改为 yield i 就足以了,具体看下修改后的事例:

# -*- coding: UTF-8 -*-
def my_function():
    for i in range(10):
        yield i

print(my_function()) 

出口的结果:

<generator object my_function at 0x0000000002534A40>

只是,那个例子非常不合乎利用生成器,发挥不出生成器的性情,生成器的最佳的采纳应该是:你不想同偶然候将富有总结出来的大度结果集分配到内部存款和储蓄器个中,极度是结果集里还隐含循环。因为如此会耗十分的大的资源。

例如说上面是一个计算斐波那契数列的生成器:

# -*- coding: UTF-8 -*-
def fibon(n):
    a = b = 1
    for i in range(n):
        yield a
        a, b = b, a   b

# 引用函数
for x in fibon(1000000):
    print(x , end = ' ')

运作的服从:

图片 2

测算斐波那契数列的生成器

你看,运转二个这么打大巴参数,也不会说有卡死的意况,因为这种方法不会使用太大的财富。这里,最难明白的就是generator 和函数的奉行流程不等同。函数是逐条实行,境遇 return 语句只怕最后一行函数语句就赶回。而成为 generator 的函数,在每一回调用 next() 的时候奉行,蒙受 yield语句再次回到,再次实施时从上次重临的 yield 语句处继续实施。

譬如说这一个事例:

# -*- coding: UTF-8 -*-
def odd():
    print ( 'step 1' )
    yield ( 1 )
    print ( 'step 2' )
    yield ( 3 )
    print ( 'step 3' )
    yield ( 5 )

o = odd()
print( next( o ) ) 
print( next( o ) ) 
print( next( o ) ) 

输出的结果:

step 1
1
step 2
3
step 3
5

能够看出,odd 不是不足为奇函数,而是 generator,在实践进度中,蒙受 yield 就暂停,后一次又继续实施。实施 3 次 yield 后,已经未有 yield 能够进行了,纵然您承继打印 print( next( o ) ) ,就能够报错的。所以平日在 generator 函数中都要对不当实行捕获。

下边是三个让list中持有字符串变为小写的事例

5、打字与印刷杨辉三角

透过学习了生成器,大家得以一向运用生成器的知识点来打字与印刷杨辉三角:

# -*- coding: UTF-8 -*-
def triangles( n ):         # 杨辉三角形
    L = [1]
    while True:
        yield L
        L.append(0)
        L = [ L [ i -1 ]   L [ i ] for i in range (len(L))]

n= 0
for t in triangles( 10 ):   # 直接修改函数名即可运行
    print(t)
    n = n   1
    if n == 10:
        break

输出的结果为:

[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
[1, 6, 15, 20, 15, 6, 1]
[1, 7, 21, 35, 35, 21, 7, 1]
[1, 8, 28, 56, 70, 56, 28, 8, 1]
[1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
[s.lower() for s in ['TIM','JOHN','MARY']

五、迭代器和生成器综合例子

因为迭代器和生成器基本是互通的,因而有个别知识点需求综合在一道

本文由68399皇家赌场发布于集成介绍,转载请注明出处:Python列表生成式与生成器操作示例,迭代器和生

关键词: 68399皇家赌场 【Python】

最火资讯