1.切片
切片可以取list、tuple、string的元素
python语言中把字符串看做一个tuple,因此可以通过for in 循环取出所有的字符,同样可以通过切片取出一部分字符
list/tuple/string变量名[a:b:c]
a表示开始取得索引位置,b表示结束的索引位置(不包括在内,因此可以比最后的索引大1,即swift中的endindex)
c表示间隔多少个取值,可以是负数,倒着取值
a、b可以省略,表示取到终点,c可以省略,默认为1
被取得变量是什么类型,取完还是什么类型
2.如1中所述,for循环的对象可以是多种类型,这些类型叫做可迭代对象。
当我们使用for循环时,只要作用于一个可迭代对象,for循环就可以正常运行
如何判断一个对象是可迭代对象:通过collections模块的Iterable类型判断
python内置函数isinstance():判断一个变量是否是已知的类型,具体见内置函数页
其中没有iterable(可迭代类型),需要我们手动导入。
from collections import Iterabl
然后用instance(a,iterable)
来判断是否是可迭代对象(可用if),然后打印:
for 变量(可多个) in 可迭代对象(此时会自动给变量赋值) print(变量)
如果对象中没有这么多变量,则出现错误
ValueError: not enough values to unpack (expected m, got n)
对于dict需要说明的是,其中对象只有一个即key,value需要写
for i in dict.values()
(这与swift不同,swift中把key与value作为两个变量)
dict.values实际上也是一个迭代器 迭代的时候不可以少(),此类函数如reversed都是如此,输出需要()
输出key与value用到dict.items()
否则提示:
TypeError: 'builtin_function_or_method' object is not iterable
该函数或方法不可迭代
3.列表生成式(省略循环步骤生成一个list)
[要生成的式子关于x的函数 for x in range(a, b)]
for循环后面还可以加上if判断
还可以使用多层循环,如:
>>> [m + n for m in 'ABC' for n in 'XYZ'] ['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
4.生成器generator(为了节省空间不计算只储值)
在Python中,可以简单地把列表生成式改成generator,也可以通过函数实现复杂逻辑的generator。
(1)把列表生成式改成generator:把列表生成式[]变为()即可得到
(2)定义函数时将print()改为yield
怎么打印出generator的每一个元素呢?
如果要一个一个打印出来,可以通过next()函数获得generator的下一个返回值直到出现StopIteration的错误
或用循环打印
是generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。如果用for、print()执行,实际上也相当于不断地next()、遇到yield返回、再次next()。(这点在迭代器中会继续提到)
因此你会发现,如果一直用next()、或者循环调用函数,你无法得到结束语句return中的信息(从执行顺序理解)
a = (x for x in range(10)) next(a) 0 next(a) 1 next(a) 2 next(a) 3 next(a) 4
for m in a:\ print(m) 5 6 7 8 9
generator中元素用过后不可以再调用
如何得到return语句:如果想要拿到返回值,必须捕获StopIteration错误,返回值包含在StopIteration的value中:
except StopIteration as e: print('Generator return value:', e.value) break
在except里面用except Exception as e 接受异常,然后把这个e打印出来看
5.迭代器
可以直接作用于for循环的数据类型有以下几种:
(1)集合数据类型,如list、tuple、dict、set、str等;
(2)generator,包括生成器和带yield的generator function。
这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。
Python的for循环本质上就是通过将对象变为一个迭代器再不断调用next()函数实现的。
而可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
可迭代对象不一定是迭代器。
可以使用isinstance()判断一个对象是否是Iterator对象
from collections import Iterator isinstance((x for x in range(10)), Iterator) True isinstance([], Iterator) False isinstance({}, Iterator) False isinstance('abc', Iterator) False
生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。
把list、dict、str等Iterable变成Iterator可以使用iter()函数:
isinstance(iter([]), Iterator) True isinstance(iter('abc'), Iterator) True
why:可以把迭代器这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。
Iterator甚至可以表示一个无限大的数据流
所以list、tuple、string已知长度,不能看做iterator