7.31 python日学 迭代器,生成器,装饰器

1.迭代
迭代是访问集合元素的一种方式,可以将某个数据集内的数据"一个挨着一个的取出来",就叫迭代
2.迭代协议
必须拥有__iter__()和__next__()方法

print(dir([]))

print(set(dir([])) & set(dir({})) & set(dir("")))

print(‘iter’ in dir(int))#整型无法迭代

a=set(dir([]).iter())

b=set(dir())

print(a-b)

print([1,2,3].iter().length_hint())

k=[1,2,3]

d=k.iter()

print(d.next())

print(d.next())

print(d.next())

2.for循环原理
for循环一个可迭代对象,iter()方法返回一个迭代器,for先判断对象可迭代,然后调用迭代器的__next__()方法获取值

b=‘abcdefg’

for x,y in enumerate(b):

print(x,y)

3.迭代器的作用
节约内存,取的时候再生成数据

4.应用场景

斐波那契数列

class Fib():

def init(self,num):

self.num=num

self.a=1#0

self.b=1

self.current=1

def iter(self):

return self

def next(self):

if self.current<=self.num:

temp=self.a#

self.a,self.b=self.b,self.a+self.b

self.current+=1

return temp#self.a

else:

raise StopIteration

for x in Fib(10):

print(x)

5.生成器
一个包含yield的函数就是一个生成器函数,并且yield和return不能并存,yield只能用在函数内
生成器函数执行后会得到一个生成器作为返回值,并不会执行函数体
执行了__next__()方法之后才会执行函数体,并且获得返回值
yield和return相同的是可以返回值,但是不同的是yield不会结束函数

for x in Fib(10):

print(x)

def shengchan(n):

i=1

while i<=n:

yield i#yield可以返回值,包含yield关键字的函数就是生成器函数,这个函数不会立刻执行,执行了next方法才会执行函数体,并通过yield返回值,返回后不会立刻结束函数,而是保留函数状态,等待下一次使用

i+=1

x=shengchan(5)

print(x)

for y in x:

print(y)

def dee():

yield 1

yield 2

yield 3

x=dee()

print(next(x))

print(next(x))

print(next(x))

send函数
send获取下一个值的效果和next()基本一致,只是获取下一个值的时候,给上一个yield的位置传递一个数据

def g():

print(‘a’)

x=yield 10

print(‘收到数据’,x)

yield x+5

x=g()

print(next(x))

b=x.send(999)

print(b)

yield from
yield from遍历出可变数据类型中的数据

def g():

yield from ‘AB’

yield from range(5)

for x in g():

print(x)

6.生成器表达式

b=(i for i in range(5))

print(b)

for x in b:

print(x)

for i in range(5):

print(next(b))

7.装饰器

闭包
在python中创建一个闭包一般有三个要求:
1.闭包函数必须有内嵌函数
2.内嵌函数必须要引用外层函数的变量
3.闭包函数返回内嵌函数的地址(函数名称)

def waibu(b):

a=3

def neibu(x):

return x*a+b

return neibu

x=waibu(9)

print(x(5))

print(x(7))

装饰器
本质:一个闭包函数
作用:在不修改原函数机器调用方式的情况下对原函数功能进行扩展
格式:@装饰器名称

import time

def decor(f):

def neibu():

t=time.time()

f()

t2=time.time()

print(‘程序用时 {}’.format(t2-t))

return neibu

@decor

def func():

s=0

for i in range(100000000):

s+=1

print(s)

func()

解决被装饰函数不能查看信息的bug
导入wraps

from functools import wraps

@wraps(func)

from functools import wraps

def acor(f):

@wraps(f)#用来解决不能显示错误信息的bug

def nb(a,b):

print(’*********’)

d=f(a,b)

print(’*********’)

return d

return nb

@acor

def func(a,b):

‘’’

:param a:

:param b:

:return:

‘’’

c=a+b

return c

print(func(2,3))

8.@property装饰器
内置装饰器函数,把一个方法调用方式变成属性调用方式(将一个方法当属性使用)。注意@property装饰器只能在面向对象中使用。
访问使用@property装饰器的函数可以直接调用函数名(会执行一段功能(函数)然后返回值)
@property装饰器只能修饰不带参数的方法

class A():

def init(self,name):

self.name=name

@property#把方法当做属性来使用,只能修饰不带参数的方法

def age(self):

return self.__age

@age.setter

def age(self,age):#同名方法,多的参数时用来设置值的

if age<0 or age>100:

print(‘不对’)

self.__age=0

else:

self.__age=age

a=A(‘zs’)

a.age=39

print(a.age)

a.age=400

print(a.age)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值