#函数 --2天 #函数的定义和调用 #def 函数名(形参) #函数体 #return返回值 #调用 函数名(实参) #站在形参的角度上:位置参数,*args,默认参数(陷阱),**kwargs #站在实参的角度上:按位置传,按照关键字传 #返回值:没有返回值 返回一个值 返回多个值 #接收返回值:没有返回值不接收,返回一个值作一个变量接收,返回多个值用一个变量或者对应数目变量接收#闭包函数 --在内部函数引用外部函数的变量#装饰器函数 --装饰器一定是闭包函数 #装饰器的作用 --在不改变原来函数的调用方式的情况下,在这个函数前后添加新的功能 #完美的符合了一个开发原则:开放封闭原则 #对扩展是开发的 #对修改是封闭的 #基础的装饰器 # from functools import wraps # def wrapper(func): # @wraps(func) # def inner(*args,**kwargs): # '''在函数被调用之前添加的代码''' # ret=func(*args,**kwargs) #func是被装饰的函数,在这里被调用 # return ret # return inner # 使用---@wrapper # def func(): #inner # pass #func name # 带参数的装饰器 def outer(形参): def wrapper(func): def inner(*args,**kwargs): '''在函数被调用之前添加的代码''' ret=func(*args,**kwargs) #func是被装饰的函数,在这里被调用 # '''在函数被调用之前添加的代码''' return ret return inner return wrapper @outer(True) def func(): pass#迭代器和生成器--两天
#迭代器l=[1,2,3]#索引#循环 for#for i in l:# i## for k in dic:# pass#enumerate# print(dir([]))#告诉我列表拥有的所有方法# print(dir({}))#告诉我列表拥有的所有方法# print(dir(''))#告诉我列表拥有的所有方法# print(dir(range(10)))#告诉我列表拥有的所有方法# ret=set(dir([]))&set(dir({}))&set(dir(''))&set(dir(range(10)))# print(ret)#iterable# print('__iter__'in dir(int))# print('__iter__'in dir(bool))# print('__iter__'in dir(list))# print('__iter__'in dir(dict))# print('__iter__'in dir(set))# print('__iter__'in dir(tuple))# print('__iter__'in dir(enumerate([])))# print('__iter__'in dir(range(1)))#只要能被for循环的数据类型 就一定拥有__iter__方法# print([].__iter__())#一个列表执行了__iter__()之后的返回值就是一个迭代器# print(dir([]))# print(dir([].__iter__()))# print(set(dir([].__iter__()))-set(dir([])))# print([l,'a','bbb'].__iter__().__length_hint__()) # 元素个数# l=[1,2,3]# iterator=l.__iter__()# print(iterator.__next__())# print(iterator.__next__())# print(iterator.__next__())# print(iterator.__next__())#lterable 可迭代的--->_iter_ #只要含有__iter__的方法都是可迭代的#[].__iter__()迭代器 -->__next__#通过next就可以从迭代器中一个一个的取值#只要含有__iter__方法的都是可迭代的---可迭代协议#迭代器协议--内部含有__next__和__iter__方法的就是迭代器# print('__iter__'in dir([].__iter__()))# print('__next_'in dir([].__iter__()))#迭代器的概念#迭代器协议---内含有__next__和__iter__方法的就是迭代器#迭代器协议和可迭代协议#可以被for循环的都是可迭代的#可迭代的内部都有__iter__方法#只要是迭代器一定可迭代#可迭代的.__iter__()方法就可以得到一个迭代器#迭代器中的__next__()方法可以一个一个的获取值#for循环其实就是在使用迭代器#iterator#可迭代对象# print([].__iter__())# print(range(20))#for#只有是可迭代对象的时侯才能用for#当我们遇到一个新的变量,不确定不能for循环的时侯,就判断它是否可迭代#迭代器的好处 #从容器类型中一个一个的取值,会把所的的值都取到 #节省内存空间 #迭代器并不会有内存中再占用一大块内存 #而是随着循环每次生成一个 #每次next每次给我一个#rnge#f# l=[1,2,3,45]# iterator=l.__iter__()# while True:# print(iterator.__next__())# print(range(100000000000))# print(list(range(100000000)))#生成器# 生成器函数# def generator():# print(1)# return 'a'## ret=generator()# print(ret)#只要含有yield关键字的函数都是生成器函数#yield不能和return共用并且需要写在函数内# def generator():# print(1)# yield 'a'#生成器函数:执行之后得到一个生成器作为返回值# ret=generator()# print(ret)# print(ret.__next__())def generator(): print(1) yield 'a' print(2) yield 'b' yield 'c'g=generator()for i in g: print(i)# ret=g.__next__()# print(ret)# ret=g.__next__()# print(ret)# ret=g.__next__()# print(ret)#姓哈哈%idef wahaha(): for i in range(200): yield '姓哈哈%s'%ig=wahaha()count=0for i in g: print(i) if count > 50: print(i) if count > 50: breakprint('*******',g.__next__())for i in g: count+=1 print(i) if count > 50: print(i) if count > 50: break