函数高级部分
装饰器
迭代器与生成器
一 可迭代的对象——>在Python但凡内置有__iter__方法的对象,都是可迭代对象。(字符串,列表,字典,元组,集合,文件)
iterable:可迭代的------对应的标志
二 迭代器:迭代取值的工具,可迭代的对象执行__iter__方法得到的返回值就是迭代器对象。
迭代器对象:指的是既有内置__iter__方法,又内置有__next__方法的对象。
执行迭代器对象的__next__得到的是迭代期的下一个值。
执行迭代器对象的__iter__得到的任然是迭代器本身。
什么是迭代?迭代是一个重复的过程,并且每次重复都是基于上一次的结果而来。
1 print(dir([1,2].__iter__()))#查看列表迭代器的所有方法 2 print(dir([1,2]))#查看列表的所有方法 3 print(set(dir([1,2].__iter__()))-set(dir([1,2])))
iter_l=[1,2,3,4,5,6].__iter__() print(iter_l.__length_hint__())#获取迭代器中元素的长度 # print(iter_l.__setstate__(4))#根据索引指定从哪里开始迭代 print(iter_l.__next__()) print(iter_l.__next__()) print(iter_l.__next__())#一个一个的取值 print(next(iter_l)) #next(iter_l)这个方法和iter_l.__next__()方法一样,推荐用next(iter_l)这个
l=[1,2,3,4,5] a=l.__iter__() # print(next(a)) # print(next(a)) # print(next(a)) # print(next(a)) # print(next(a)) # print(next(a)) #上面的列表长度只有5个,而你多打印了,就会报错。处理的情况如下,就不会报错了 while True: try: item=a.__next__() print(item) except StopIteration: # 异常处理 break
三 可迭代和迭代器的相同点:都可以用for循环
四 可迭代和迭代器的不同点:就是迭代器内部多实现了一个__next__方法
五 判断迭代器和可迭代的方法:
第一种:判断内部是不是实现了__next__方法
1 '__iter__' in dir(str)#如果__iter__在这个方法里面,就是可迭代的。
第二种:
Iterable 判断是不是可迭代对象
Iterator 判断是不是迭代器
用法:
from collections import Iterable from collections import Iterator #比如给一个字符串 s='abc' print(isinstance(s,Iterable))#isinstance判断类型的 print(isinstance(s,Iterator))
判断range函数和map函数
map1=map(abs,[1,-2,3,-4]) print(isinstance(map1,Iterable)) print(isinstance(map1,Iterator))#map方法自带迭代器 s=range(100)#是一个可迭代的,但是不是迭代器 print(isinstance(s,Iterable)) print(isinstance(s,Iterator))
迭代器代码:
# strx='zhangrenguo' # listx=['read','run','play'] # dictx={'name':'zrg','age':18,'sex':'male'} # # iter_dictx = iter(dictx) # print(iter_dictx) # iter_dictx = dictx.__iter__() # print(iter_dictx) # while True: # try: # print(iter_dictx.__next__()) # except StopIteration: # break # tuplex=(1,2,3,4,5) # x=open('a.txt','r',encoding='utf-8') # for循环:迭代器循环 # in后跟的一定是可迭代对象 # iter_listx=iter(listx) # print(next(iter_listx)) # print(iter(strx)) # print(next(x)) # for i in x: # print(i) # # for k in dictx: # print(k,dictx[k]) # iter_strx=strx.__iter__() # while True: # try: # print(iter_strx.__next__()) # except StopIteration: # break # iter_listx=listx.__iter__() # while True: # try: # print(iter_listx.__next__()) # except StopIteration: # break # iter_dictx=dictx.__iter__() # while True: # try: # print(iter_dictx.__next__()) # except StopIteration: # break # iter_x=x.__iter__() # while 1: # try: # print(iter_x.__next__()) # except StopIteration: # break # for i in 10: # pass # list(10) # names=['a','b','c','d'] # iter_names=iter(names) # # l1=list(iter_names) # print(l1) # # l2=list(iter_names) # print(l2) # # f=open('a.txt','rt',encoding='utf-8') # print(list(f)) # print(list(f)) # print(list(f)) # # info = {'name':'zrg','age':24,'sex':'male'} # # info.__iter__() # iter_info = info.__iter__() # # iter_info.__next__() # print(iter_info.__next__()) # print(iter_info.__next__()) # print(iter_info.__next__()) # # print(iter_info.__next__()) # s1 = {'a','b','c','d',1,3,5,6,8,'zrg','egon'} # iter_s1 = s1.__iter__() # print(iter_s1.__next__()) # print(iter_s1.__next__()) # print(iter_s1.__next__()) # print(iter_s1.__next__()) # print(iter_s1.__next__()) # print(iter_s1.__next__()) # print(iter_s1.__next__()) # print(iter_s1.__next__()) # print(iter_s1.__next__()) # print(iter_s1.__next__()) # print(iter_s1.__next__()) # print(iter_s1.__next__()) # print(iter_s1.__next__()) # print(iter_s1.__next__()) # print(iter_s1.__next__())