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)