Python3 高级特性
切片
- list、tuple、string都可以使用切片功能
- 第一个元素的索引为
0
,倒数第一个元素的索引为-1
迭代
可迭代对象
* 集合数据类型:list
、tuple``dict``set``str
* generator
,包括生成器和带yield
的generator function
可以采用collections
模块的Iterable
类型判断是否是可迭代对象
>>>from collections import Iterable
>>>isinstance('abc',Iterable)
True
>>>isinstance([1,2,3],Iterable)
True
>>>isinstance(123,Iterable)
False
list
、tuple
的迭代可以采用for...in
完成。dict
的存储与list
的顺序排列不同。默认dict
迭代的是key
。
如果要迭代value
,可以用for value in d.values()
。
如果要迭代key
、value
,可以用for k,v in d.items()
- 对
list
实现类似Java的下标循环,采用enumerate
可以把一个list变成索引-元素对,可以在for
同时迭代索引和元素本身
for i,value in enumerate(['A','B','C'])
print(i,value)
0 A
1 B
2 C
列表生成式
- 生成
[1,2,3,4,5,6,7,8,9,10]
可以用list(range(1,11))
- 生成
[1x1,2x2,3x3,...,10x10]
,用列表生成式
>>>[x*x for x in range(1,11)]
[1,4,9,16,25,36,49,64,81,100]
- 筛选出仅偶数的平方
>>>[x*x for x in range(1,11) if x%2 == 0 ]
[4,16,36,64,100]
- 使用两层循环,生成全排列
>>>[m+n for m in 'ABC' ro n in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
- 列出当前目录下所有文件和目录名
>>>import os
>>>[d for d in os.listdir('.')] #os.listdir可以列出文件和目录
- 把list中所有字符串变成小写
>>>L=['Hello','World','IBM','Apple']
>>>[s.lower() for s in L]
['hello', 'world', 'ibm', 'apple']
生成器
概念
生成器把结果保存为生成器的状态,在每次进行迭代时返回一个值,直到遇到Stop Iteration异常结束
语法
- 生成器表达式:通过
list
解析语法,把[]
换成()
>>>L=[x*x for x in range(10)]
>>>L
[0,1,4,9,16,25,36,49,64,81]
>>>g=(x*x for x in range(10))
>>>g
<generator object <genexpr> at 0x1022ef630>
- 生成器函数:在函数中出现了
yield
关键字,那么该函数不再是普通函数,而是生成器函数,Python解释器会将其视为一个generator
普通函数和generator生成器的区别
- 普通函数调用直接返回结果,generator函数的调用,返回一个generator对象;(调用generator时可以先创建一个对象,再用next()方法不断获得下一个返回值,但实际中通常用for循环实现)
- generator在执行过程中,遇到yield就中断,下次又继续执行
迭代器
- 可以被
next()
调用并不断返回下一个值的对象称为迭代器Iterator
- 生成器都是
Iterator
对象,但list
、dict
、str
虽然是Iterable
,却不是Iterator
。
把list
、dict
、str
等Iterable
变成Iterator
可以使用iter()
>>>isinstance(iter([]),Iterator)
True
>>>isinstance(iter('abc'),Iterator)
True
- 凡是可作用于
for
循环的对象都是Iterable
类型 - 凡是可作用于
next()
的对象都是Iterator
类型