python高级特性

发布时间 2023-03-31 16:15:12作者: 阡陌芊芊

切片

取list或者tuple的部分元素,可以用脚本取,还可以用切片取:

 

 tuple也是一种list,唯一区别是tuple不可变。因此,tuple也可以用切片操作,只是操作的结果仍是tuple

字符串'xxx'也可以看成是一种list,每个元素就是一个字符。因此,字符串也可以用切片操作,只是操作结果仍是字符串

 

迭代

如果给定一个list和tuple,我们可以通过for循环来遍历这个list和tuple,这种遍历我们称为迭代(Iteration)

Python的for循环不公可以用在list和tuple上,还可作用在dict,字符串等上。

 上面的for循环里面,同时引用两个变量,在python里面很常见,如下:

 

 

   如何判断一个对象是可迭代对象呢?方法是通过collections.abc模块的Iterable类型判断

 

 

列表生成式

列表生成式即List Comprehensions,是Python内置的非常简单却强大 的可以用来 创建list的生成式

 

 

 for循环后面还可以加上if判断,这样我们就可以筛选出仅偶数的平方:

>>> [x * x for x in range(1, 11) if x % 2 == 0]
[4, 16, 36, 64, 100]

运用列表生成式,可以通过一行代码实现列出当前目录下所有文件和目录名:

>>> import os # 导入os模块,模块的概念后面讲到
>>> [d for d in os.listdir('.')] # os.listdir可以列出文件和目录
['.emacs.d', '.ssh', '.Trash', 'Adlm', 'Applications', 'Desktop', 'Documents', 'Downloads', 'Library', 'Movies', 'Music', 'Pictures', 'Public', 'VirtualBox VMs', 'Workspace', 'XCode']

还可以使用两层循环,可以生成全排列:

>>> [m + n for m in 'ABC' for n in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']

列表生成式可以使用两个变量来生成list:
>>> d = {'x': 'A', 'y': 'B', 'z': 'C' }
>>> [k + '=' + v for k, v in d.items()]
['y=B', 'x=A', 'z=C']

把list中所有的字符串变成小写:

>>> L = ['Hello', 'World', 'IBM', 'Apple']
>>> [s.lower() for s in L]
['hello', 'world', 'ibm', 'apple']

 

列表生成式中使用if...else

使用列表生成式的时候,在for后面的if 是筛选条件,不能带else

把if写在for 前面时必须加else,否则报错

 

 

生成器

为了节约存储空间,如果列表元素可以按照某种算法推算出来,这样就不必创建完整的list。在python中,这种一边循环一边计算的机制,称为生成器:generator。

创建一个generator,有多种方法。第一种方法,只要把一个列表生成式的[]改成(),就创建了一个generator:

 

 L和g的区别仅在于最外层的[] 和(),L是一个list ,而g是一个generator

可以通过next()函数获得generator的下一个返回值

由于generator也是可迭代对象,所以可以使用for循环

 

 

generator非常强大。如果推算的算法比较复杂,用类似列表生成式的for循环无法实现的时候,还可以用函数来实现。

 

可迭代对象:可以直接作用于for循环的对象统称为可迭代对象:Iterable

可以使用isinstance()判断一个对象是否是Iterable对象

>>> from collections.abc import Iterable
>>> isinstance('abc', Iterable)
True
>>> isinstance((x for x in range(10)), Iterable)
True

 

迭代器:可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator

可以使用isinstance()判断一个对象是否是Iterator对象

>>> from collections.abc import Iterator
>>> isinstance((x for x in range(10)), Iterator)
True
>>> isinstance('abc', Iterator)
False

 

生成器都是Iterator对象,但list,dict,str,tuple虽然是Iterable,却不是Iterator

listdictstrIterable变成Iterator可以使用iter()函数:

>>> isinstance(iter('abc'), Iterator)
True