#装饰器:在不改变源代码和调用方式的基础之上给函数增加新的功能
def deco(func):
def wrapper():
func() #(test)的test是实参 将这个实参赋予func即 func = test
print('this is new 功能')
return wrapper
def test(): #源代码
print('欢迎') #源代码
test=deco(test) #(test)的test是实参 将这个实参赋予给形参func即 func = test
test() #test = deco()执行结果的返回值即 即test = wrapper
# 调用test()即是调用wrapper() 然后执行 wrapper()这个函数 执行func()即是test()(上边给func赋予的实参)
#执行完test这个函数之后就执行print('this is new 功能')
#正常写法
def deco(func):
def wrapper():
func()
print('this is new 功能')
return wrapper
@deco #test=deco(test)
def test():
print('欢迎')
test()
#迭代器
#1.迭代是一个重复的过程,即每一次重复为一次迭代,
#2.并且每次迭代的结果都是下一次迭代的初始值
# l = [1,2,3]
# count=0
# while count<len(l): #首先是重复动作,其次上一次的结果是下一次的初始值,因此,是迭代
# print(l[count])
# count+=1
#为什么要有迭代器?什么是可迭代对象?什么是迭代器对象?
#1.为何要有迭代器?
# 对于序列类型:字符串、列表、元组,我们可以使用索引的方式迭代取出其包含的元素。
# 但对于字典、集合、文件等类型是没有索引的,若还想取出其内部包含的元素,
# 则必须找出一种不依赖于索引的迭代方式,这就是迭代器。
l1 = [1,2,3]
t1 = (1,2,3)
str1 = '123'
num1 = 100
num2 = 100.1
s1 = {1,2,3}
d1 = {'name':'aaa','age':'bbb'}
f = open('mariadb.repo','r', encoding='utf-8')
# 2.什么叫做可迭代对象?obj有.__iter__方法的都叫做可迭代对象
l1.__iter__()
t1.__iter__()
str1.__iter__()
s1.__iter__()
d1.__iter__()
f.__iter__()
# 3.什么叫做迭代器对象?obj有.__iter__和.__next__方法的叫做迭代器对象
f.__next__()
f.__iter__()
res1 = iter(l1)
res2 = iter(t1)
str3 = iter(str1)
res4 = iter(s1)
res5 = iter(d1)
#for的作用:
# 1.把可迭代对象变成迭代器对象
# 2.过滤错误信息
# for i in l1:#iter(l1)
# print(i)
# 总结:迭代器对象一定是可迭代对象,而可迭代对象不一定是迭代器对象
#什么是生成器?
#只要函数里有yield关键字,那么函数名()得到的结果就是生成器,生成器就是迭代器,并且不会执行函数内部代码
#return只能返回一个值,而yield可以返回多个值
#生成器优点:
# 同一时间只存储一个值,节省内存空间
#生成器的缺点:
# 只能向后取值,不能往前取值
def test():
for i in range(100):
yield i
res = test()
for k in res:
print(k)
#print(next(res))
# print(next(res))
# print(next(res))