切片
在索引查询中使用 : 查询就是切片的标志性用法
#声明一个list
>>> L = list(range(100))
>>> L
[0, 1, 2, 3, ..., 99]
#0代表索引开始的位置,3代表索引结束的位置
#缺省状态下, **:** 前面是0,后面是list最后一个索引
#如L[:3](作用相同),L[1:](跳过第一个)
>>> L[0:3]
[0, 1, 2]
- 查询索引可以是负数,负数代表倒着查询
- 两个 : 时,最后面的数字表示跳过个数
- 原数据可以是list tuple,可以是字符串
- 原数据是什么类型,切片后仍然是该类型
#读取后10位
>>> L[-10:]
[90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
#前10个,每两个读取一个
>>> L[:10:2]
[0, 2, 4, 6, 8]
迭代
通过for...in来完成的就是迭代
- dict迭代的是key。如果要迭代value,可以用for value in d.values(),如果要同时迭代key和value,可以用for k, v in d.items()。
- 使用enumerate函数可以把一个list变成索引-元素对
#测试对象是否允许迭代
>>> from collections import Iterable
>>> isinstance('abc', Iterable) # str是否可迭代
True
#类型转换使用迭代
>>> for i, value in enumerate(['A', 'B']):
... print(i, value)
...
0 A
1 B
列表生成式
将输出与for写在一行的形式,生成结果不改变原有集合数据,自动生成转换过渡集合
#有判断的循环,转换成小写
>>>L1 = ['Hello', 'World', 18, 'Apple', None]
>>>[s.lower() for s in L1 if isinstance(s, str)]
['hello', 'world', 'apple']
#嵌套循环
>>> [m + n for m in 'ABC' for n in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
#字典
>>> d = {'x': 'A', 'y': 'B', 'z': 'C' }
>>> [k + '=' + v for k, v in d.items()]
['y=B', 'x=A', 'z=C']
生成器
- generator保存的是算法,每次调用next(g),就计算出g的下一个元素的值,没有元素的时候抛出StopIteration的错误。
- 使用了关键字yield,程序遇到它就停止,再次执行next函数时,会从上次停止的位置继续。
#b的值直接赋给了a,a+b的值直接赋给了b,没有临时变量完成了交换
a, b = b, a + b
#这样的格式用于捕获直接使用next函数导致的异常值
try:
pass
except StopIteration as e:
raise #ex.value
else:
pass
finally:
pass
#杨辉三角
def triangles():
L = [1]
while True:
yield L[:]
L.append(0)
#打印出修改结果前的数据,便于理解列表生成式
#print('循环修改前',L)
L = [L[i - 1] + L[i] for i in range(len(L))]
#调用杨辉三角
for t in triangles():
print(t)
迭代器
- 迭代对象 Iterable,是有限的数据,可以for循环
- 迭代器 Iterator,是无限大算法,可以next取值
- 将迭代对象 Iterable→迭代器 Iterator 使用iter()函数
网友评论