python 的生成器,迭代器,递归, 闭包
程序员文章站
2022-06-11 22:08:13
...
生成器
"""
生成器: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)