python迭代器,推导式,生成器,装饰器

目录

迭代器

推导式

生成器

装饰器


迭代器

迭代器是一种可以被遍历的对象类型。字符串,列表或元组对象,甚至自定义对象都可用于创建迭代器

可迭代对象的优点:可以直观查看里面的对象,如直接查看列表的内容,提供了一种通用不依赖索引的迭代取值方式

创建迭代器

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函数。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值