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 in enumerate(['A', 'B', 'C']):#相当于加索引号
print(i, value)
#==============列表生成式===============
'''
是Python内置的非常简单却强大的可以用来创建list的生成式。
生成原则:
1、第一项生成列表的元素,并且是最内层且套的语句
2、从第二项其开始语句层层嵌套,第一个语句放在最里面。
'''
L=[x * x for x in range(1, 11)] #相当于将循环体写在最前面,变成最终的list元素
print(L)
L=[x * x for x in range(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 == 0 else -x for x in range(1, 11)] #最前面可以是一个if else语句(必须有else)
print(L)
#=====================生成器====================
'''
定义:
通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。
而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,
那后面绝大多数元素占用的空间都白白浪费了。所以,如果列表元素可以按照某种算法推算出来,
那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。
在Python中,这种一边循环一边计算的机制,称为生成器:generator。
构造生成器的方法:
1、只要把一个列表生成式的[]改成()
2、用函数来定义,通过关键词yield
'''
print('#=====================生成器====================\n')
L = [x * x for x in range(10)]
g = (x * x for x in range(10))
print(L)
print(g)
#可以通过next()函数获得generator的下一个返回值
print(next(g))#没有更多的元素时,抛出StopIteration的错误
#generator也是可迭代对象,所以可以使用for进行迭代
for x in g:
print(x,end="\t")
print("")
#注意:生成器是不能后退的
#函数生成器生成斐波那契数列
def fib(max):
n,a, b =0, 0, 1
while 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))
Python基础:高级特性
最新推荐文章于 2024-07-31 07:00:00 发布