1.迭代器
迭代器是容器:程序中无法直接创建一个迭代器,只能将别的序列转换成迭代器.
不支持增删改查,也不能取下标
特点:打印迭代器的时候无法查看所有的元素,也无法统计元素个数,迭代器也无法获取元素的个数;
获取元素的时候只能一个一个的取(每次只能获取最前面的那个元素)而且元素取一个就少一个.
i1 = iter(‘abc’)
主要功能 : 查
不管以什么方式从迭代器中获取了到某个元素,那么这个元素一定会消失.
1)查单个: next(迭代器) - 获取迭代器中最前面的那个元素
next(i1) #a
next(i1) #b
next(i1) #c
next(i1) #d
next(i1) #如果里面没东西了,就 报错
2)遍历:
2.生成器
1生成器也是容器:和其他容器相比是直接保存多个数据,生成器保存的是参数多个数据的算法.
生成器获取数据的方式和特点和迭代器一样.
2调用一个带有yield关键字的函数就可以得到一个生成器对象
3控制生成器产生数据和对应的值:
一个生成器产生的数据的个数和值由创建生成器调用的那个函数的函数体在执行的时候会遇到几次yield以及每次后面的值来决定,
个数 - 由遇到yield的次数决定
值 - 由yield后面的数据决定
4.生成器创建数据的原理
每次获取生成器的数据的时候,就会去执行创建这个生成器的函数体,但每次执行都会执行到yield就停下来
装饰器
1.什么是装饰器 - 给已经定义号的函数添加功能的工具
装饰器就是一个函数,这个函数即是实参高阶函数,又是返回值高阶函数
2.给函数添加功能
语法(无参装饰器):
def 函数名1(装饰器的名字,见名知意)(原函数:fn):
def 添加完功能的新函数(*args,**kwargs)
result = 调用原函数
添加新功能
return 原函数
return 添加完功能的新函数
使用的时候
@函数名1 #自动将下面的函数名当作参数
语法(有参装饰器):
def 函数名1(装饰器的名字,见名知意)(参数列表):
def 无参装饰器temp(原函数:fn)
def 添加完功能的新函数(*args,**kwargs)
result = 调用原函数
添加新功能
return 原函数
return 添加完功能的新函数
return 无参装饰器temp
# 练习1 在函数结果后面添加===end===
# def pr_end(fn):
# def new_fn(*args, **kwargs):
# result = fn(*args, **kwargs)
# print('======end=======')
# return result
#
# return new_fn
# @pr_end
# def aa():
# print(123)
# aa()
# print('\n---------------------我是华丽的分割线---------------------\n')
#
#
# def pr_end1(fn):
# def new_fn(*args, **kwargs):
# print('======end=======')
# return fn(*args,**kwargs)
#
# return new_fn
#
#
# @pr_end1
# def aa():
# print(123)
# aa()
#
# print('\n---------------------我是华丽的分割线---------------------\n')
# 练习2:写一个装饰器,用法如下
# 没有装饰器返回值如果是: 100 @tag(p) -> <p>100</p>
# 没有装饰器返回值如果是: 'abc' @tag(a) -> <a>abc</a>
def header1(paramater):
def temp(fn):
def new_fn(*args,**kwargs):
revers = fn(*args,**kwargs)
return f'<{paramater}>{revers}</{paramater}>'
return new_fn()
return temp
@header1('p')
def n1():
return 'abc'
print(n1)
@header1('a')
def n2():
return 123
print(n2)
print('\n---------------------我是华丽的分割线---------------------\n')
# 练习3: 写一个装饰器(针对返回值是数字的函数),用法如下
# 12 -> @operation('+', 100) -> 112
# 12 -> @operation('-', 20) -> -8
# 12 -> @operation('*', 3) -> 36
# 12 -> @operation('/', 3) -> 4.0
def operation(bol,num3):
def temp(fn):
def new_fn(*args, **kwargs):
revers = fn(*args, **kwargs)
return eval(str(revers)+bol+str(num3))
return new_fn()
return temp
@operation('+',100)
def nn():
return 12
print(nn)
@operation('-',20)
def nn():
return 12
print(nn)
@operation('*',3)
def nn():
return 12
print(nn)
@operation('/',3)
def nn():
return 12
print(nn)