目录
迭代器
迭代器是一种可以被遍历的对象类型。字符串,列表或元组对象,甚至自定义对象都可用于创建迭代器
可迭代对象的优点:可以直观查看里面的对象,如直接查看列表的内容,提供了一种通用不依赖索引的迭代取值方式;
创建迭代器
1.使用Python内置的iter( )方法创建迭代器对象
from collections import Iterable #Iterable迭代类型
alist = [1,2,3]
print(type(alist))
iter_alist = iter(alist) # 将列表转换成迭代器对象
print(type(iter_alist))
2.使用next( )方法获取迭代器的下一个元素
from collections import Iterable # Iterable迭代类型
alist = [1,2,3]
iter_alist = iter(alist) # 将列表转换成迭代器对象
print(next(iter_alist))
print(next(iter_alist))
print(next(iter_alist))
3.使用for循环遍历迭代器:
from collections import Iterable #Iterable迭代类型
alist = [1,2,3]
#将列表转换成迭代器对象
iter_alist = iter(alist)
for item in iter_alist:
print(item)
推导式
可以帮你在某些场合写出比较精简的代码。但没有它,也不会有太多的影响。用于快速生成新的数据对象,推导式的结果为相应的数据类型。
推导式格式:新变量 = 括号+对象处理语句+for循环语句
列表推导式
lis = [x*2 for x in range(1, 10)] print(lis)
字典推导式
# 字典推导式 {k:v for k,v in dic.items()}
# 将一个字典的键值倒换
new_dic2 = {v:k for k, v in dic.items()}
print(new_dic2)# 将一个字典的键转换成大写
new_dic3 = {k.upper():v for k, v in dic.items()}
print(new_dic3)# 保留name和score两个键值对
new_dic4 = {k:v for k, v in dic.items() if k=="name" or k=="scores"}
print(new_dic4)
集合推导式
a = {x for x in 'abracadabra'}
print(a)
元组推导式
tup = (x for x in range(9))
print(tup)
生成器
在Python中,这种一边循环一边计算出元素的机制,称为生成器:generator。 生成器是一种特殊的迭代器,生成器自动实现了“迭代器协议”,不需要再手动实现两方法。
创建生成器(两种方式)
1.生成器推导式
tup = (x for x in range(3))
2.yield关键字
在 Python中,使用yield返回的函数会变成一个生成器
yield 是一个类似 return 的关键字,只是这个函数返回的是个生成器对象
def mySum():
print('before')
print('after')
yield 'result'
f = mySum()
print(f,next(f))
装饰器
装饰器函数必须为闭包函数,(内函数使用外函数的变量,外函数返回值为内函数)
装饰器放在对象的上面,就是可以在不修改原有代码的情况下,为被装饰的对象增加新的功能或者附加限制条件。
装饰器有很多种,有函数的装饰器,也有类的装饰器。装饰器在很多语言中的名字也不尽相同,它体现的是设计模式中的装饰模式。
装饰器的语法是将@装饰器名,放在被装饰对象上面。同一对象可以同时存在多个装饰器
def outer(func): func为装饰器对象变量
def inner():
print('认证功能操作')
result = func() #执行func函数调用
return result
return inner #函数作返回值
# 装饰器的对象为f1
@outer
def f1():
print('业务部门1的数据接口......')
@outer
def f2():
print('业务部门2的数据接口......')
@outer
def f3():
print('业务部门3的数据接口......')
@outer
def f100():
print('业务部门100的数据接口......')
#基础平台部门开发了上百个函数的API
#各部分分别调用自己部分的API
f1()
f2()
f3()
f100()
-1程序开始运行,从上往下解释,读到def outer(func):的时候,发现这是个函数定义,于是把函数体加载到内存里。
- 2.读到@outer的时候,程序被@这个语法吸引住了,解释器知道这是个装饰器,按规矩要立即执行的,于是程序开始运行@后面那个名字outer所定义的函数。
- 3.程序返回到outer函数,开始执行装饰器的语法规则。规则是:
被装饰的函数的名字会被当作参数传递给装饰函数。装饰函数执行它自己内部的代码后,会将它的返回值赋值给被装饰的函数。原来的f1函数被当做参数传递给了func,而f1这个函数名之后会指向inner函数。