程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

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

发布于2019-08-22 17:42     阅读(1159)     评论(0)     点赞(18)     收藏(2)


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)



所属网站分类: 技术文章 > 博客

作者:集天地之正气

链接:https://www.pythonheidong.com/blog/article/53245/75e864af351fd24b8e92/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

18 0
收藏该文
已收藏

评论内容:(最多支持255个字符)