python系列教程163——更多迭代协议例子

朋友们,如需转载请标明出处:https://blog.csdn.net/jiangjunshow

声明:在人工智能技术教学期间,不少学生向我提一些python相关的问题,所以为了让同学们掌握更多扩展知识更好地理解AI技术,我让助理负责分享这套python系列教程,希望能帮到大家!由于这套python教程不是由我所写,所以不如我的AI技术教学风趣幽默,学起来比较枯燥;但它的知识点还是讲到位的了,也值得阅读!想要学习AI技术的同学可以点击跳转到我的教学网站。PS:看不懂本篇文章的同学请先看前面的文章,循序渐进每天学一点就不会觉得难了!

除了for循环外,还有很多工具都有自动迭代的能力。

下面是经典的for循环自动迭代文件的代码:

>>>for line in open('script1.py'):    # Use file iterators

...    print(line.upper(),end='')

...

IMPORT SYS

PRINT(SYS.PATH)

X = 2

PRINT(2 ** 33)

除了for循环外,列表解析、in成员关系测试、map内置函数以及像sorted和zip调用这样的内置函数也都使用了迭代协议。当应用于一个文件时,所有这些使用文件对象的迭代器都自动地按行扫描:

>>>uppers = [line.upper() for line in open('script1.py')]

>>>uppers

['IMPORT SYS\n','PRINT(SYS.PATH)\n','X = 2\n','PRINT(2 ** 33)\n']




>>>map(str.upper,open('script1.py'))          # map is an iterable in 3.0






>>>list( map(str.upper,open('script1.py')) )

['IMPORT SYS\n','PRINT(SYS.PATH)\n','X = 2\n','PRINT(2 ** 33)\n']




>>>'y = 2\n' in open('script1.py')

False

>>>'x = 2\n' in open('script1.py')

True


>>>sorted(open('script1.py'))

['import sys\n','print(2 ** 33)\n','print(sys.path)\n','x = 2\n']




>>>list(zip(open('script1.py'),open('script1.py')))

[('import sys\n','import sys\n'),('print(sys.path)\n','print(sys.path)\n'),

('x = 2\n','x = 2\n'),('print(2 ** 33)\n','print(2 ** 33)\n')]




>>>list(enumerate(open('script1.py')))

[(0,'import sys\n'),(1,'print(sys.path)\n'),(2,'x = 2\n'),

(3,'print(2 ** 33)\n')]




>>>list(filter(bool,open('script1.py')))

['import sys\n','print(sys.path)\n','x = 2\n','print(2 ** 33)\n']




>>>import functools,operator

>>>functools.reduce(operator.add,open('script1.py'))

'import sys\nprint(sys.path)\nx = 2\nprint(2 ** 33)\n'

还有些函数其实也变相地使用了迭代功能。例如,sum调用计算任何可迭代对象中的总数,如果一个可迭代对象中任何的或所有的项为真的时候,any和all内置函数分别返回True;max和min分别返回一个可迭代对象中最大和最小的项。如下示例中的所有工具接受任何可迭代对象作为一个参数,并且使用迭代协议来扫描它,但返回单个的结果:

>>>sum([3,2,4,1,5,0])      # sum expects numbers only

15

>>>any(['spam','','ni'])

True

>>>all(['spam','','ni'])

False

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

5

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

1

list和tuple内置函数,字符串join方法也会使用对象的迭代协议:

>>>list(open('script1.py'))

['import sys\n','print(sys.path)\n','x = 2\n','print(2 ** 33)\n']




>>>tuple(open('script1.py'))

('import sys\n','print(sys.path)\n','x = 2\n','print(2 ** 33)\n')




>>>'&&'.join(open('script1.py'))

'import sys\n&&print(sys.path)\n&&x = 2\n&&print(2 ** 33)\n'




>>>a,b,c,d = open('script1.py')

>>>a,d

('import sys\n','print(2 ** 33)\n')




>>>a,*b = open('script1.py')  # 3.0 extended form

>>>a,b

('import sys\n',['print(sys.path)\n','x = 2\n','print(2 ** 33)\n'])

另外,在函数调用中可能会用到的一种特殊的*arg形式,它也会使用迭代协议把一个集合的值解包为单个的参数:

>>>def f(a,b,c,d): print(a,b,c,d,sep='&')

...

>>>f(1,2,3,4)

1&2&3&4

>>>f(*[1,2,3,4])                  # Unpacks into arguments

1&2&3&4




>>>f(*open('script1.py'))            # Iterates by lines too!

import sys

&print(sys.path)

&x = 2

&print(2 ** 33)

你可能感兴趣的:(python系列教程,python,开发语言,后端)