Python中迭代器和列表解析怎么使用?


本文摘自php中文网,作者零下一度,侵删。

迭代器:初探

上一章曾经提到过,其实for循环是可用于任何可迭代的对象上的。实际上,对Python中所有会从左至右扫描对象的迭代工具而言都是如此,这些迭代工具包括了for循环、列表解析、in成员关系测试以及map内置函数等。

“可迭代对象”的概念在Python中是相当新颖的,基本这就是序列观念的通用化:如果对象时实际保存的序列,或者可以再迭代工具环境中一次产生一个结果的对象,那就看做是可迭代的。

>>文件迭代器
作为内置数据类型的文件也是可迭代的,它有一个名为__next__的方法,每次调用时,就会返回文件中的下一行。当到达文件末尾时,__next__会引发内置的StopIteration异常,而不是返回空字符串。

这个接口就是Python中所谓的迭代协议:有__next__方法的对象会前进到下一个结果,而在一系列结果的末尾时,则会引发StopIteration。任何这类对象都认为是可迭代的。任何这类对象也能以for循环或其他迭代工具遍历,因为所有迭代工具内部工作起来都是在每次迭代中调用__next__,并且捕捉StopIteratin异常来确定何时离开。

Python 迭代器和列表解析

1)迭代器

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

一种特殊的数据结构,以对象形式存在

       >>> i1 = l1.__iter__()

       >>> i1 = iter(l1)

       可迭代对象:

           序列:      list、str、tuple

           非序列:     dict、file

           自定义类:  __iter__()、 __getitem__()

  注意:

        若要实现迭代器,需要在类中定义next()方法

        要使迭代器指向下一个对象,则使用成员函数 next()

            i1.next()

        当没有元素时,会引发StopIteration异常

        for循环可用于任何可迭代对象

         

        例:   >>> l1 = ['Sun','Mon','Tue','Wed','Thu','Fri','Sat']

               >>> i1 = l1.__iter__()

               >>> il.next()

               'Sun'

               >>> il.next()

               'Mon'

2)列表解析 [ ]

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

根据已有列表,高效生产新列表的方式。 常用于实现创建新的列表,因此要放置于 [ ] 中

语法:

    [ expression for iter_var in iterable ]

    [ expression for iter_var in iterable if cond_expr ]

 

    os模块中  listdir() 能够列出所有文件

    例:事先定义l1 l2        l1 = [ 1,2,3,4,5 ]     l2=[ ]               

           >>>  for i in l1:

                   l2.append(i**2)                     l2列表内各项为l1的平方

           >>>  print l2

           [1, 4, 9, 16, 25]

 

            >>> l3 = [ i**2 for i in l1 ]               l3列表内各项为l1的平方

            [1, 4, 9, 16, 25]

           

            >>> l4 = [ i**2 for i in l1 if i>=3 ]       l3列表内各项为l1中 >= 3的平方

            [9, 16, 25]

             

     例题:  l1 = ['x','y','z']     l2 = [1,2,3]  应用列表解析方法使其各项相乘

             

            >>> l3 = [ (i,j) for  i in l1 for j in l2 ]     for循环内部嵌套一个for循环实现各项乘

            [('x', 1), ('x', 2), ('x', 3), ('y', 1), ('y', 2), ('y', 3), ('z', 1), ('z', 2), ('z', 3)]

3)生成器 ( )

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

惰性计算、延迟求值

生成器表达式并不真正创建数字列表,而是返回一个生成器对象,此对象在每次计算出一个条目后,把这个条目产生出来(一次返回一个值)

语法:

    ( expr for iter_var in iterable )

    ( expr for iter_var in iterable  if cond_expr )

 

 例:  >>> l1 = ( i**2 for i in range(2,11,2))

       >>> l1.next()

       2

       >>> l1 = ( i**2 for i in range(2,11) if i%2==0 )

       >>> l1.next()

       2

 注意:

    序列过长,并且每次只获取一个元素时,应当考虑使用生成器表达式而不是列表解析

    列表解析与生成器的关系相当于range()与xrange()

4)产生偏移和元素

1

2

3

4

5

6

7

8

9

enumerate

同时偏移缩印和偏移元素,使用enumerate()函数

此内置函数返回一个生成器对象

>>> S = 'Hello,world'

>>> a = enumerate(S)

>>> a.next()

(0,'H')

>>> a.next()

(1,'e')

以上就是Python中迭代器和列表解析怎么使用?的详细内容,更多文章请关注木庄网络博客!!

相关阅读 >>

简单易学的Python语言,黑客也喜欢她

Python 实现一行输入多个值

Python格式化输出是什么意思

Python如何记录调用堆栈日志实现方法?

Python中map是什么意思

Python中操作文件之seek()方法的使用

Python如何实现无限循环

Python判断闰年程序是什么

Python如何调用c语言函数的使用详解

解决Python删除文件的权限错误问题

更多相关阅读请进入《Python》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...