迭代器 #迭代器即迭代的工具,那什么是迭代呢? #迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值
1、为何要有迭代器?对于序列类型:字符串、列表、元组,我们可以使用索引的方式迭代取出其包含的元素。但对于字典、集合、文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依赖于索引的迭代方式,这就是迭代器2、什么是可迭代对象?可迭代对象指的是内置有__iter__方法的对象,即obj.__iter__,如下 'hello'.__iter__ (1,2,3).__iter__ [1,2,3].__iter__ { 'a':1}.__iter__ { 'a','b'}.__iter__ open('a.txt').__iter__ 3、什么是迭代器对象? 可迭代对象执行obj.__iter__()得到的结果就是迭代器对象 而迭代器对象指的是即内置有__iter__又内置有__next__方法的对象 文件类型是迭代器对象 open('a.txt').__iter__() open('a.txt').__next__() 4、注意: 迭代器对象一定是可迭代对象,而可迭代对象不一定是迭代器对象 5.用法
dic={ 'a':1,'b':2,'c':3} iter_dic=dic.__iter__() #得到迭代器对象,迭代器对象即有__iter__又有__next__,但是:迭代器.__iter__()得到的仍然是迭代器本身 iter_dic.__iter__() is iter_dic #True print(iter_dic.__next__()) #等同于next(iter_dic) # print(iter_dic.__next__()) #抛出异常StopIteration,或者说结束标志 6.for循环
#基于for循环,我们可以完全不再依赖索引去取值了dic={ 'a':1,'b':2,'c':3} for k in dic: print(dic[k]) for循环的工作原理 1:执行in后对象的dic.__iter__()方法,得到一个迭代器对象iter_dic 2: 执行next(iter_dic),将得到的值赋值给k,然后执行循环体代码 3: 重复过程2,直到捕捉到异常StopIteration,结束循环 生成器
只要函数内部包含有yield关键字,那么函数名()的到的结果就是生成器,并且不会执行函数内部代码 yield相当于return 程序就停住了 生成器就是迭代器 三元表达式
name=input('姓名>>: ')res='SB' if name == 'alex' else 'NB' print(res) 装饰器 1.高阶函数 2.闭包 3.函数嵌套 1.函数闭包
内部函数包含对外部作用域而非全局作用域的引用提示:之前我们都是通过参数将外部的值传给函数,闭包提供了另外一种思路,包起来喽,包起呦,包起来哇 2.函数嵌套
def father(auth_type): print('from father %s' %auth_type ) def son(): name='linhaifeng_1' print('我的爸爸是%s' %name) def grandson(): print('我的爷爷是%s' %auth_type) grandson() son() father('filedb')
3.高阶函数
''' 高阶函数定义: 1.函数接收的参数是一个函数名 2.函数的返回值是一个函数名 3.满足上述条件任意一个,都可称之为高阶函数 '''
计时加法器
import time def cal(l): start_time=time.time() res=0 for i in l: time.sleep(0.1) res+=i stop_time = time.time() print('函数的运行时间是%s' %(stop_time-start_time)) return res print(cal(range(100))) 装饰器的实现1
import time def timmer(func): #func=test def wrapper(): # print(func) start_time=time.time() func() #就是在运行test() stop_time = time.time() print('运行时间是%s' %(stop_time-start_time)) return wrapper @timmer #test=timmer(test) def test(): time.sleep(3) print('test函数运行完毕') test() # test=timmer(test) #返回的是wrapper的地址 # test() #执行的是wrapper() # @timmer 就相当于 test=timmer(test)
装饰器的实现2加上返回值
import time def timmer(func): #func=test def wrapper(): start_time=time.time() res=func() #就是在运行test() stop_time = time.time() print('运行时间是%s' %(stop_time-start_time)) return res return wrapper @timmer #test=timmer(test) def test(): time.sleep(3) print('test函数运行完毕') return '这是test的返回值' res=test() #就是在运行wrapper print(res) 装饰器的实现3传入参数
1. import time def timmer(func): #func=test1 def wrapper(*args,**kwargs): #test('linhaifeng',age=18) args=('linhaifeng') kwargs={'age':18} start_time=time.time() res=func(*args,**kwargs) #就是在运行test() func(*('linhaifeng'),**{'age':18}) stop_time = time.time() print('运行时间是%s' %(stop_time-start_time)) return res return wrapper @timmer def test1(name,age,gender): time.sleep(1) print('test1函数运行完毕,名字是【%s】 年龄是【%s】 性别【%s】' %(name,age,gender)) return '这是test的返回值' test1('alex',18,'male') print(test1('alex',18,'male')) 2.
import time def timmer(func): def wrapper(*args,**kwargs): start_time=time.time() res=func(*args,**kwargs) stop_time = time.time() print('函数运行时间是%s' %(stop_time-start_time)) return res return wrapper @timmer #相当于cal等于timmer(cal) def cal(l): res=0 for i in l: time.sleep(0.1) res+=i return res res=cal(range(20)) print(res)
装饰器实现带有参数验证功能
user_list=[ { 'name':'alex','passwd':'123'}, { 'name':'linhaifeng','passwd':'123'}, { 'name':'wupeiqi','passwd':'123'}, { 'name':'yuanhao','passwd':'123'}, ] current_dic={ 'username':None,'login':False} def auth(auth_type='filedb'): def auth_func(func): def wrapper(*args,**kwargs): print('认证类型是',auth_type) if auth_type == 'filedb': if current_dic['username'] and current_dic['login']: res = func(*args, **kwargs) return res username=input('用户名:').strip() passwd=input('密码:').strip() for user_dic in user_list: if username == user_dic['name'] and passwd == user_dic['passwd']: current_dic['username']=username current_dic['login']=True res = func(*args, **kwargs) return res else: print('用户名或者密码错误') elif auth_type == 'ldap': print('鬼才特么会玩') res = func(*args, **kwargs) return res else: print('鬼才知道你用的什么认证方式') res = func(*args, **kwargs) return res return wrapper return auth_func @auth(auth_type='filedb') #auth_func=auth(auth_type='filedb')-->@auth_func 附加了一个auth_type --->index=auth_func(index) def index(): print('欢迎来到京东主页') @auth(auth_type='ldap') def home(name): print('欢迎回家%s' %name) # @auth(auth_type='sssssss') def shopping_car(name): print('%s的购物车里有[%s,%s,%s]' %(name,'奶茶','妹妹','娃娃')) # print('before-->',current_dic) # index() # print('after--->',current_dic) # home('产品经理') shopping_car('产品经理')