首页 > 代码库 > 迭代器
迭代器
有参装饰器:
@函数(参数)
#模拟数据库认证功能
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.无法获取长度
迭代器
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。