python 的生成器,迭代器,递归, 闭包

生成器

"""
生成器:generator
yield关键字的函数即为生成器,生成器的返回值为迭代器类型。

生成器的优点:

    一次返回一个结果,延迟计算。这对于大数据量处理,是个非常有用的优势。占用内存量是工程师必须考虑的一个问题。
    提高代码可读性。使用生成器,代码行数更少。
    
生成器有两种表示形式:

    生成器函数:外表看上去像是一个函数,但是没有用return语句一次性的返回整个结果对象列表,使用yield语句一次返回一个结果。
    生成器推导式:类似列表推导式,将方括号换成了圆括号,返回按需产生的一个结果对象,而不是构建一个结果列表。
"""

# 实例如下
def gen_fun(_list):
    for i in _list:
        yield i * i


if __name__ == '__main__':
    data = gen_fun([1, 2, 3, 4])
    # 输出结果是: <class 'generator'>
    print(type(data))
    # 输出数据: <class 'generator'>
    _gen = (x for x in range(1, 10))
    print(type(_gen))
    print(data.__next__())

迭代器

"""
迭代器: 只不过实现了一个迭代器协议的容器对象, 它必须包括两个方法:
__next__: 返回容器的下个元素
__iter__: 返回迭代器本身
1.迭代 迭代是访问集合元素的一种方式,可以将某个数据集内的数据“一个挨着一个的取出来”,就叫做迭代
2.可迭代协议 协议就是互相规定好。可迭代协议的定义非常简单,就是内部实现了__iter__方法。
3.迭代器协议:必须拥有__iter__方法和__next__方法。
Iterable: 可迭代的
Iterator: 迭代器

"""
from collections import Iterable, Iterator


# 生成器的实现流程
class CountDown(object):
    def __init__(self, step):
        self.step = step

    def __next__(self):
        if self.step <= 0:
            raise StopIteration
        self.step -= 1
        return self.step

    def __iter__(self):
        return self


class CountDown2(object):
    def __init__(self, _list):
        self._list = _list
        self.step = len(_list)

    def __next__(self):
        if self.step <= 0:
            raise StopIteration
        self.step -= 1
        return self._list[self.step]

    def __iter__(self):
        return self


if __name__ == '__main__':
    # 判断是不是迭代器
    data = isinstance([1, 2, 3], Iterator)
    print(data)

递归函数

"""
如果一个函数在内部调用了自身,这个函数就被称为递归函数。
必要条件: 
     1. 函数内部调用自己
     2. 必须要退出程序的条件

"""


def sum_number(n):
    if n <= 0:
        return 0
    return n+sum_number(n-1)


if __name__ == '__main__':
    data = sum_number(100)

闭包函数

# -*- coding: utf-8 -*-
"""
在函数中可以(嵌套)定义另一个函数时,如果内部函数引用了外部函数的变量,则可能产生闭包。
闭包可以用来在一个函数与一组“私有”变量之间创建关联关系。在给定函数被多次调用过程中,这些私有变量能够保持持久性。 
"""


def make_closure(msg):
    def close_fun():
        print(msg)
    return close_fun


def make_fun(name):
    def fun(contant):
        return '{}:{}'.format(name, contant)
    return fun


if __name__ == '__main__':
    a = make_closure('hello')
    a()
    _f = make_fun('word')
    data = _f('python')
    print(data)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您解答关于迭代器、装饰器和冒泡排序的问题。 首先,迭代器是一种可以遍历一个容器中元素的对象,例如列表或字典。要实现一个迭代器,可以定义一个包含 `__iter__()` 和 `__next__()` 方法的类。`__iter__()` 方法返回迭代器对象本身,而 `__next__()` 方法返回下一个元素。 接下来是装饰器。装饰器是一种函数或类,用于包装其他函数或类并修改它们的行为。装饰器函数需要在函数定义之前加上 `@decorator_name` 的语法糖。其作用是不改变源代码的情况下对函数进行增强。 最后是冒泡排序的递归实现。冒泡排序是一种简单的排序算法,基本思想是重复地交换相邻的未按顺序排列的元素。递归实现就是把排序过程分解为更小的子问题,直到子问题可以直接解决为止。 下面是迭代器和装饰器递归实现冒泡排序的 Python 代码: ```python # 定义迭代器 class MyIterator: def __init__(self, my_list): self.list = my_list self.idx = 0 def __iter__(self): return self def __next__(self): if self.idx == len(self.list): raise StopIteration else: self.idx += 1 return self.list[self.idx-1] # 定义装饰器 def my_decorator(func): def wrapper(*args, **kwargs): print("Before function is executed.") result = func(*args, **kwargs) print("After function is executed.") return result return wrapper # 递归实现冒泡排序 @my_decorator def recursive_bubble_sort(l): for i, num in enumerate(l[:-1]): if num > l[i+1]: l[i], l[i+1] = l[i+1], l[i] if len(l) > 1: recursive_bubble_sort(l[:-1]) return l ``` 希望这些信息能够帮助到您,如果您需要进一步的解释,请随时询问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值