函数高级部分

装饰器

 

 

 

迭代器与生成器

一 可迭代的对象——>在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__())

 

posted @ 2019-02-14 09:25  张仁国  阅读(173)  评论(0编辑  收藏  举报
目录代码