from collections.abc import Iterable
from collections.abc import Iterator
#==============切片==============='''
切片:取list和tuple中[s:t)区间的元素,如果s=o或者t为最后可以省略不写
可以进行切片的对象:list,tuple,str
'''
L=list(range(10))print(L)print(L[0:3])#取[0,3)print(L[:3])#取[0,3)print(L[2:5])#取[2,5)print(L[5:])#从5取到最后print(L[-2:])#负号表示倒数print(L[:10:2])#最后的2表示步长,步长为1的时候可以省略#==============迭代==============='''
迭代:使用for循环去对可以迭代对象进行迭代
可迭代对象:list,dict
'''
L=list(range(5))#list的迭代for x in L:print(x,end=" ")print("")
d ={'a':1,'b':2,'c':3}#字典的迭代for key in d:print(key,end=" ")#默认情况是对key进行迭代print("")for value in d.values():#对value进行迭代print(value,end=" ")print("")for key,value in d.items():#对key:value对进行迭代print(key,":",value,end="\t")print("")#判断可迭代对象print(isinstance('abc', Iterable))print(isinstance([1,2,3,4], Iterable))print(isinstance(d, Iterable))print(isinstance(1234, Iterable))#enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身for i, value inenumerate(['A','B','C']):#相当于加索引号print(i, value)#==============列表生成式==============='''
是Python内置的非常简单却强大的可以用来创建list的生成式。
生成原则:
1、第一项生成列表的元素,并且是最内层且套的语句
2、从第二项其开始语句层层嵌套,第一个语句放在最里面。
'''
L=[x * x for x inrange(1,11)]#相当于将循环体写在最前面,变成最终的list元素print(L)
L=[x * x for x inrange(1,11)if x %2==0]#用if语句进行控制(不能有else):最前面的式子是最里面的表达式print(L)
L=[m + n for m in'ABC'for n in'XYZ']#最前面的式子是最里面的表达式,前后的关系是嵌套的关系print(L)
L=[x if x %2==0else-x for x inrange(1,11)]#最前面可以是一个if else语句(必须有else)print(L)#=====================生成器===================='''
定义:
通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。
而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,
那后面绝大多数元素占用的空间都白白浪费了。所以,如果列表元素可以按照某种算法推算出来,
那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。
在Python中,这种一边循环一边计算的机制,称为生成器:generator。
构造生成器的方法:
1、只要把一个列表生成式的[]改成()
2、用函数来定义,通过关键词yield
'''print('#=====================生成器====================\n')
L =[x * x for x inrange(10)]
g =(x * x for x inrange(10))print(L)print(g)#可以通过next()函数获得generator的下一个返回值print(next(g))#没有更多的元素时,抛出StopIteration的错误#generator也是可迭代对象,所以可以使用for进行迭代for x in g:print(x,end="\t")print("")#注意:生成器是不能后退的#函数生成器生成斐波那契数列deffib(max):
n,a, b =0,0,1while n <max:yield b #每次迭代都停止在这个地方,将b返回
a, b = b, a + b
n+=1#执行过程与函数是一样的,只是每次到yield就停止,下次接着当前位置继续执行
f = fib(6)for x in f:print(x,end="\t")print("")#=====================迭代器====================print("#=====================迭代器====================")'''
可迭代对象:
可以直接作用于for循环的对象统称为可迭代对象:Iterable
1、是集合数据类型,如list、tuple、dict、set、str等;
2、一类是generator,包括生成器和带yield的generator function。
可以使用isinstance()判断一个对象是否是Iterable对象:
迭代器:
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
可以使用isinstance()判断一个对象是否是Iterator对象:
'''print(isinstance({}, Iterable))print(isinstance([], Iterable))
f = fib(6)print(isinstance(f, Iterable))print(isinstance(123, Iterable))print("")print(isinstance({}, Iterator))print(isinstance([], Iterator))print(isinstance(f, Iterator))print(isinstance(123, Iterator))#可以看出迭代器是可迭代对象,但可迭代对象不一定是迭代器#可以使用iter()函数,将可迭代对象变成迭代器print(isinstance(iter('abc'), Iterator))