首页 > 代码库 > 迭代器

迭代器

有参装饰器:
     @函数(参数)
 
#模拟数据库认证功能
login_dic={
    ‘user‘:None,
    ‘status‘:False,
}
db_path=r‘F:/a.txt‘
def deco(auth_type=‘file‘):            #包了一个  auth_path    默认打开方式是file方式,可以通过传参来指定
    def auth(func):
        def wrapper(*args,**kwargs):
            if auth_type == ‘file‘:                #判断如果认证类型是本地文件方式,执行
                if login_dic[‘user‘] and login_dic[‘status‘]:
                    res = func(*args, **kwargs)
                    return res
 
                name=input(‘your name: ‘)
                password=input(‘your password: ‘)
                with open(db_path,‘r‘,encoding=‘utf-8‘) as f:
                    user_dic=eval(f.read())
 
                if name in user_dic and password == user_dic[name]:
                        print(‘login ok‘)
                        login_dic[‘user‘]=name
                        login_dic[‘status‘]=True
                        res=func(*args,**kwargs)
                        return res
                else:
                    print(‘login err‘)
            elif auth_type == ‘ldap‘:      #如果的ladp方式,打印
                print(‘ldap认证方式‘)
            elif auth_type == ‘mysql‘:      #如果是mysql方式,打印
                print(‘mysql认证方式‘)
            else:
                print(‘不知到的认证方式‘)      #其他方式,打印
        return wrapper
    return auth
 
@deco(auth_type=‘abc‘) #@auth #index=auth(index)
def index():
    print(‘welecome to index‘)
 
@deco(auth_type=‘ldap‘)        #  ldap  方式
def home(name):
    print(‘welecome %s to home page‘ %name)
 
index()            #执行  index 是file方式
 
home(‘egon‘)
 
####用户可以通过传不同参数来执行不同的逻辑######################################################################
 
 
迭代器:
     迭代:
          1. 重复
          2. 下一次重复是基于上一次的结果
 
whlie Ture:
     cmd=inupt(‘----->:‘)
     print(cmd)
############################每一次重复都是一次新的,着不是迭代
 
l=[‘a‘,‘b‘,‘c‘,‘d‘]
count=0
while count < len(l):
     print(l[count])
     count+=1
 
for count in range(len[l]):
     print(l[count])
############################每一次循环是基于上一次的,这是迭代(这些是依赖索引的迭代)
 
d={‘a‘:1,‘b‘:2,‘c‘:3}
     for k in d:
     print(k)
############################对于无序的,直接如代码实例循环迭代(对有索引的同样适用)
 
 
python为了提供一种不依赖于索引的迭代方式,
python会为一些对象内置__iter__方法
obj.__iter__称为可迭代的对象
 
有__iter__方法的都是可迭代对象(
     字符串
     列表
     元组
     字典
     集合
     文件
 
#####################################################
 
有.__iter__()方法的, 执行后得到的结果就是迭代器  下面的 i 就是迭代器
 
i=d.__iter__()
 
得到的迭代器  i  :     既有__iter__方法,又有一个__next__方法
 
迭代器对象也是可迭代对象
迭代器执行__iter__方法,仍是迭代器
 
 
 
判断可迭代对象还是迭代器对象:
from collections in port Itreable,Iterator
str1=‘hello‘
list1=[1,2]
tuple1=(1,2)
dic={‘a‘,:1}
set1={1,2,3}
f=open(‘a.txt’,‘w‘)
 
print(isinstance(***,Iterable))   # 是 Ture 就是可迭代的对象
print(isinstance(***,Iterator))   # 是 ture 就是迭代器对象
 
 
for循环迭代:
d={‘a‘:1,‘b‘:2,‘c‘:3}
###############################################################for  循环原理:  把 in 后面的对象执行__iter__方法,得到迭代器,然后自动 next 一下给 i 然后打印,然后再继续循环,直到报出 StopIteration ,自动捕捉然后停止循环###############################
for i in d:                              
i=d.__iter__() # 调用方法 i 就叫迭代器
print(i)                          #     <dict_keyiterator object at 0x000001CEC5A41458>
print(i.__next__())               #     a
print(i.__next__())               #     b
print(i.__next__())               #     c
print(i.__next__())               #     Traceback (most recent call last):
                                  #     File "F:/PYlearn/lx.py", line 76, in <module>
                                  #     print(i.__next__())
                                  #     StopIteration
                                        #提示没有值了
 
while 循环迭代:
while Ture:
     try:
          i=obj.__next__()
          print(i)
     execept StopIteration:
          break
 
#####################跟for一样,不过没有值了不会自动捕捉那个提示,需要自己加上,(try:   execpt 用来实现捕捉的功能)
 
迭代器的优点:
     1.提供一种不依赖索引的取值方式
     2.惰性计算,节省内存  (拿到的 i 是一个内存地址,需要值就next一下就可以,一个next就取一个值,同一时间在内存中就一个值,这样省内存)
 
迭代器的缺点:
     1.取值不如按照索引的取值方便 (由于不按照索引取值,所以不能准确的拿到一个值,只能用 next 一个个取值)
     2.一次性的取值,只能往后取,不能往前取值
     3.无法获取长度

迭代器