三器一闭

一.迭代器

迭代概念

就是一种获取数据的方式,通过for循环获取数据的过程也叫迭代。

可迭代对象

指可以通过for循环遍历的对象,例如:列表、字典、元组、字符串等。也可以自定义可迭代对象。

  • 判断对象是否是可迭代对象:isinstance('对象', Iterable) 返回结果True或False
迭代器

迭代器可以获取可迭代对象的数据时记录当前获取的位置。迭代器只能一直往前获取,不会后退,直到获取完后,再去获取则会抛出异常StopIteration异常

  • 获取一个可迭代对象的迭代器:迭代器 = iter(可迭代对象)
  • next获取迭代器里的数据:date = next(迭代器)
  • for获取迭代器里的数据:fro i in 迭代器:
    当for循环获取完数据后,会自动处理StopIteration异常
自定义迭代器
  • 只要在类中定义__iter__方法的对象,就是一个可迭代对象,在__iter__方法中返回一个迭代器
class MyList(object):
    """自定义可迭代对象"""
    def __init__(self):
        self.items = []

    def add(self, val):
        self.items.append(val)

    def __iter__(self):
        myiterator = MyIterator(self)
        return myiterator
  • 定义一个迭代器类实现__next__方法,这里__iter__返回self
class MyIterator(object):
    """定义迭代器"""
    def __init__(self, mylist):
        self.mylist = mylist
        # current记录当前访问的位置
        self.current = 0

    def __next__(self):
        # 判断是否全部迭代完毕
        if self.current < len(self.mylist.items):
            # 每次获取一个值然后返回
            item = self.mylist.items[self.current]
            self.current += 1
            return item
        else:
            raise StopIteration

    def __iter__(self):
        return self

二.生成器

生成器概念

生成器是一种特殊的迭代器,可以一边循环一边计算的机制称之为生成器

生成器的创建

方式1:将列表推导式中的[]改为()

list01 = (x for x in range(100))

方式2:在函数中定义yield

def test1():
    yield

三.闭包

闭包的定义

在一个函数里嵌套定义了另外一个函数,里面的函数使用外部函数中的变量,最后把里面的函数作为外部函数的返回值反回,这样就形成一个闭包

作用

闭包可以让里面的函数用外面函数的变量,这样就保证了此时的变量在局部起效果,而非所有函数都可以调用。

定义一个闭包
def test(num1):
    def test_in(num2):
        print('我是test_in')
        return num1+num2
	# 根据实际情况需不需要返回里面的函数
    return test_in

四.装饰器

装饰器介绍

在类中,通过@装饰器对方法进行添加功能的方式就是装饰器,装饰器是为了在不改动源代码的基础上给方法添加功能,实现的开闭原则。

定义装饰器
def test1(func):
    def test2(*args, **kwargs):
        print("%s called at %s"%(func.__name__, ctime()))
        func(*args, **kwargs)
    return wrapped_func

@timefun
def func(a, b, c):
    print(a+b+c)

foo(2,4,6)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中,"三器一闭"指的是迭代器、生成器、装饰器和闭包这四个概念。它们都是Python中非常重要且强大的编程概念。 1. 迭代器(Iterator):迭代器是一个对象,它实现了迭代器协议,即包含`__iter__()`和`__next__()`方法。通过调用`__next__()`方法,迭代器可以逐个返回元素,直到没有元素可返回时抛出`StopIteration`异常。迭代器可以用于遍历可迭代对象,如列表、元组、字典等。 2. 生成器(Generator):生成器是一种特殊的迭代器,它使用函数来创建。生成器函数使用`yield`关键字来暂停函数的执行,并返回一个值。每次调用生成器的`__next__()`方法时,函数会从上次暂停的位置继续执行,直到再次遇到`yield`关键字。生成器可以节省内存,并且可以按需生成数据。 3. 装饰器(Decorator):装饰器是一种用于修改函数或类的行为的函数。它可以在不修改原始函数或类的情况下,通过将其传递给装饰器函数来添加额外的功能。装饰器使用`@`语法来应用于函数或类定义之前。 4. 闭包(Closure):闭包是指一个函数对象,它可以访问并修改其词法作用域之外的变量。闭包在函数内部定义了一个内部函数,并返回该内部函数。内部函数可以访问外部函数的变量,即使外部函数已经执行完毕。闭包可以用于实现函数工厂、实现私有变量和缓存结果等功能。 以下是一个简单的示例,演示了迭代器、生成器、装饰器和闭包的使用: ```python # 迭代器 class MyIterator: def __init__(self, data): self.data = data self.index = 0 def __iter__(self): return self def __next__(self): if self.index >= len(self.data): raise StopIteration value = self.data[self.index] self.index += 1 return value # 生成器 def my_generator(): yield 1 yield 2 yield 3 # 装饰器 def my_decorator(func): def wrapper(): print("Before function execution") func() print("After function execution") return wrapper @my_decorator def my_function(): print("Inside function") # 闭包 def outer_function(x): def inner_function(y): return x + y return inner_function # 使用迭代器 my_list = [1, 2, 3] my_iterator = MyIterator(my_list) for item in my_iterator: print(item) # 使用生成器 my_generator = my_generator() for item in my_generator: print(item) # 使用装饰器 my_function() # 使用闭包 add_5 = outer_function(5) print(add_5(3)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值