python之进阶函数(迭代器、装饰器等)

一、迭代器

用时间换空间

可迭代对象Iterable

迭代对象Iterator

##创建迭代类
class Myiterator:
    def __init__(self):
        self.i = 0

    def __next__(self):

        if (self.i < 20):
            self.i += 2
            return self.i
        else:
            raise StopIteration


iter = Myiterator()


# 创建可迭代类
class Myiterable:
    def __iter__(self):
        return iter


ite = Myiterable()
for i in ite:
    print(i)

python迭代器的协议:迭代器必须同时包含__iter__和__next__ 

##创建迭代器
class Myiterator:
    def __init__(self):
        self.i = 0

    def __iter__(self):
        return self

    def __next__(self):
        if (self.i < 20):
            self.i += 2
            return self.i
        else:
            raise StopIteration


ite = Myiterator()
for i in ite:
    print(i)


l=[1,2,3,4]#可以for循环的都是可迭代对象
i=l.__iter__()
print(i.__next__())#1
print(i.__next__())#2

二、生成器

#生成器
def mygen():
    gen=0
    while gen<10:
        gen+=1
        yield gen

#迭代器的升级版
ge=mygen()
print(next(ge))
print("==================")
#生成器表达式
gens=(i*i for i in range(0,10))
for i in gens:
    print(i)

三、高阶函数

函数作为参数

import time
def foo():
    print("foo开始")
    time.sleep(2)
   
def bar():
    print("bar开始")
    time.sleep(3)

def timer(func):
    start=time.time()
    func()
    print("用时:",time.time()-start)

timer(foo)

四、闭包函数

外部自由变量被内部引用则称为闭包函数,自由变量在没有被调用的时候不会被删除

def foo():
    print("foo开始")
    x=20
    def bar():
        
        print("bar开始")
        print(x)
    return bar

func=foo()
func()

bar函数因为被外部 func引用,因此不会因为foo执行而空间被销毁。

x因为函数调用,因此不会被销毁

五、装饰器函数

不改变原函数基础上,对内部结构进行更改

import time
def foo():
    print("foo功能")
    time.sleep(3)

def bar():
    print("bar功能")
    time.sleep(2)

def timer(func):
    def wrapper():
        start=time.time()
        func()
        print("用时:",time.time()-start)

    return wrapper

bar=timer(bar)
bar()

foo=timer(foo)
foo()
import time
@timer
def foo():
    print("foo功能")
    time.sleep(3)

@timer#等价于bar=timer(bar)
def bar():
    print("bar功能")
    time.sleep(2)

def timer(func):
    def wrapper():
        start=time.time()
        func()
        print("用时:",time.time()-start)

    return wrapper

bar()

foo=timer(foo)
foo()

 装饰器小案例(每个函数装饰器的调用空间是独立的)

#计数函数调用次数
def calledNum(func):
    count=0
    def inner():
        nonlocal count
        count+=1
        func()
        print(f"调用{func.__name__}了{count}次")

    return inner


@calledNum
def bar():
   print("bar")

@calledNum
def foo():
    print("foo")

bar()
bar()

foo()

六、并发

稍后更新

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值