# -*- coding: utf-8 -*-
"""
迭代器: 可迭代对象
           更新迭代,重复的,循环的一个过程更新迭代每次都有新的内容
           可以进行循环更新的一个实实在在的值
           专业角度;可迭代对象,内部含有‘__iter__’方法的对象
           str list tuple dict set range  文件句柄
           获取一个对象的所有方法dir()
           专业角度 内部含有‘__iter__’方法的对象‘__iter__’ in dir(对象)
            优点: 存储的数据能直接显示
                 拥有的方法较多,操作方便
            缺点: 占用内存
                  不能直接通过for循环取值但可以通过索引取值
        迭代器:内部含有‘__iter__’方法和'__next__'方法的对象‘
        obj=iter(对象)
        next(obj)  取值
        优点:节省内存 惰性机制(next一次取一个值)
        缺点:速度慢
"""
"""
生成器本质是迭代器的一种
但生成器是我们用Python代码构建的数据结构,迭代器是提供的或转化得来的
def func():
    print(12)
    print(12)
    yield 3
    print(88)
    yield 4
ret=func()
print(ret)
print(next(ret))
return 函数中只存在一个return结束函数 并且给函数的执行者返回值
有yield并且yield在return前是生成器函数 
"""
"""
列表推导式 循环模式 [i for i in range(101)]
         筛选模式[i for i in range(101) if i%3==0]
"""
"""
生成器推导式 print((i for i in range(101)))  <generator object <genexpr> at 0x00000221B2980F20>
obj=(i for i in range(101))
for i in obj:print(i)
"""
"""
1.闭包只能存在嵌套的函数中
2.内层函数对外层函数非全局变量的引用
3.外层函数返回内层函数
这个使用了外部函数的内部函数叫做闭包
被引用的非全局变量也称作自由变量,这个自由变量会与内层函数产生一个绑定关系
自由变量不会在内存中消失 修改自由变量使用nonlocal
作用:保证数据的安全
判断  print(avg.__code__.co_freevars)
"""
"""
内置函数
int()
bin()#十进制-》二进制
oct()#十进制-》八进制
hex()#十进制-》十六进制
int("16进制",16) 16进制转10进制
divmod()  #返回商与余数的元组
round() #保留小数位数
pow(4**5) #x的冥方  第三个参数对其取余
ord() 
chr()
repr  返回一个对象的string形式
print(repr('da'))
all 判断一个可迭代化对象全是True才是true
any() 有一个是true就是true
print(self, *args, sep=' ', end='\n', file=None)
sep='' 分隔符  end不换行
给定列表 [1,2,3,4] 输出1234
from functools import reduce
lst=[1,2,3,4] #lst=[1,23,4]会失败
l = reduce(lambda x,y:x*10+y,lst)
print(l)
[21,12,1,3,2,32,2] 输出 2112132322
lst = 
sum=0
middle=0
middle1=0
for i in range(len(lst)):
    if i==0 :
        middle=lst[i]
    while i+1<len(lst):
        print('1111',middle)
        s=10**len(list(str(lst[i+1])))
        middle1=middle*s+lst[i+1]
        print('22222',middle1)
        middle=middle1
        break
print(middle1)
 
  
  
装饰器   本质上是一个闭包函数
功能:   不修改已有函数的源代码
        不修改已有函数的调用功能
        给已有函数添加新的功能
def func1(obj1):     #如果闭包函数的参数有且只有一个并且是函数类型 那么这个闭包函数叫做装饰器
    def inner():
        print("已添加验证")
        obj1()
    return inner
@func1
def comment():
    print("已发表评论")
if __name__='__main__':
    comment()
 
  
通用装饰器
def decorator(func):
    def inner(*args,**kwargs):
        print("正在执行")
        num=func(*args,**kwargs)
        return num
    return inner
@decorator
def add(num1,num2):
    result=num1+num2
    print("结果为",result)
add(1,2)
 
多个装饰器:先执行内部的装饰器,在执行外部的。
带有参数的装饰器:在原有的装饰器前再加一个函数
"""