Python – 递归和生成器

递归

自己调用自己,但是要分解它的参数

def fact(n):
    if n == 0:
        return 1
    else:
        return n*fact(n-1)
print(fact(5))

# 120

1、递归必须包含一个基本出口(base case),否则会无限递归,最终导致栈溢出.比如这里就是n==0返回1

2、递归必须包含一个可以分解的问题(recursive case),想要求得fact(n),就需要用nfact(n-1)

3、递归必须要向着递归出口靠近(toward the base case).这里每次递归调用都会n-1,向着递归出口n==0靠近

递归求和

def get_sum(num):  # 递归完成1+2+3...+10的和
    if num>=1:
        res = num + get_sum(num -1)
    else:
        res = 0
    return res
res = get_sum(12)
print(res)

迭代器

迭代器是一个可以记住遍历的位置对象.

迭代器对象从集合的第一个元素开始访问,直到所有的元素被完全被访问完结束.

迭代器有两个基本方法iter()和next(),其中iter()用来创建迭代器对象.next()用来遍历字符串,列表或元祖对象时经常会用到迭代器.

lst = ["苹果", "香蕉", "橘子", "桃子"]
aa = iter(lst)  # 创建迭代器对象
print(next(aa))
print(next(aa))
print(next(aa))
# 苹果
# 香蕉
# 橘子

# 迭代器只能往前遍历元素,而不会后退,用for语句遍历
lst = ["奔驰", "宝马", "奥迪", "别克"]
bb = iter(lst)
for a in bb:
    print(a, end=" ")
# 奔驰 宝马 奥迪 别克

生成器=构造器

在Python中,使用yield的函数被称为生成器.

与普通函数不同的是,生成器将返回一个迭代器的函数,而且生成器只能用于迭代操作.可见,生成器是一种特殊的迭代器.

在调用生成器的过程中,每次遇到yield时函数会暂停并保存当前所有的运行信息,返回yield的值.并在下一次执行next()方法时从当前位置继续运行.

list = [[1, 2], [3, 4], [5, 6], [7, 8]]  # 创建一个嵌套列表
def qtlb(list):  # 创建生成器
    for aa in list:
        for bb in aa:
            yield bb

for nn in qtlb(list):
    print(nn)

在需要的时候产生结果,节省我们资源,不使用的时候不占内存

每次执行到yield,因为底层的实现就是中断的原理,保存栈帧,加载栈帧.

迭代器:带状态的对象,它会记录当前迭代所在的位置,以便下次迭代的时候获取正确的元素;

生成器:在Python中是一种很常用也很好用的数据结构,比起列表(list)来说,迭代器最大的优势就是延迟计算,按需使用,从而提高开发体验和运行效率,以至于在Python3中map,filter等操作返回的不再是列表而是迭代器.把一个列表生成式的[]中括号改为()小括号,就创建一个生成器

list = [x*x for x in range(10)]  # 列表生成式
print(list)

generator_ex = (x*x for x in range(10))  # 生成器
print(generator_ex)

# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
# <generator object <genexpr> at 0x031A0F08>

生成?是特殊的迭代?,

1、列表表达式的 [] 改为 () 即可变成生成?

2、函数在返回值得时候出现yield就变成生成?,而不是函数了;

中括号换成小括号即可

原文地址:https://www.cnblogs.com/qingaoaoo/p/12344926.html

时间: 2024-10-07 18:50:39

Python – 递归和生成器的相关文章

python——迭代器、生成器、装饰器

迭代器 迭代器规则 迭代:重复做一些事很多次,就像在循环中那样. 不仅可以对字典和序列进行迭代,还可以对其他对象进行迭代:只要该对象实现了__iter__方法. __iter__方法会返回一个迭代器(iterator),所谓的迭代器就是具有next方法(这个方法在调用时不需要任何参数)的对象.在调用next方法时,迭代器会返回他的下一个值.如果next方法被调用,但迭代器没有值可以返回,就会引发一个StopIteration异常. 注意:迭代器规则在3.0中有一些变化.在新的规则中,迭代器对象应

python迭代器、生成器和yield语句

http://blog.csdn.net/pipisorry/article/details/22107553 一.迭代器(iterator) 迭代器:是一个实现了迭代器协议的对象,Python中的迭代器协议就是有next方法的对象会前进到下一结果,而在一系列结果的末尾是,则会引发StopIteration.任何这类的对象在Python中都可以用for循环或其他遍历工具迭代,迭代工具内部会在每次迭代时调用next方法,并且捕捉StopIteration异常来确定何时离开. 迭代器对象要求支持迭代

python中的生成器函数是如何工作的?

以下内容基于python3.4 1. python中的普通函数是怎么运行的? 当一个python函数在执行时,它会在相应的python栈帧上运行,栈帧表示程序运行时函数调用栈中的某一帧.想要获得某个函数相关的栈帧,则必须在调用这个函数且这个函数尚未返回时获取,可能通过inspect模块的currentframe()函数获取当前栈帧. 栈帧对象中的3个常用的属性: f_back : 调用栈的上一级栈帧 f_code: 栈帧对应的c f_locals: 用在当前栈帧时的局部变量; 比如: >>&g

(转)python基础学习-----生成器和迭代器

在Python中,很多对象都是可以通过for语句来直接遍历的,例如list.string.dict等等,这些对象都可以被称为可迭代对象.至于说哪些对象是可以被迭代访问的,就要了解一下迭代器相关的知识了. 迭代器 迭代器对象要求支持迭代器协议的对象,在Python中,支持迭代器协议就是实现对象的__iter__()和next()方法.其中__iter__()方法返回迭代器对象本身:next()方法返回容器的下一个元素,在结尾时引发StopIteration异常. __iter__()和next()

Python学习-39.Python中的生成器

先回顾列表解释 1 lista = range(10) 2 listb = [elem * elem for elem in lista] 那么listb就将会是0至9的二次方. 现在有这么一个需求,需要存储前10个斐波那契数到硬盘. 那么先写产生斐波那契数的函数: 1 def fib(max): 2 n,a,b = 0,0,1 3 while n < max: 4 print(b) 5 a,b = b,a + b 6 n+=1 这样就会打印出前max个斐波那契数了.接着我们再修改一下.(因为我

python中的生成器

python中的生成器其实就是一个特殊的迭代器,相比于每次迭代获取数据获得(通过next()函数)时生成元素,迭代的位置,数值返回等都需要我们设计.我们可以采用更加简洁的语法即生成器(generator). 通过列表生成式,我们可以直接创建一个列表.但是,如果我们说我们可能会通过算法根据前面的999999个数推出100w个数,但是我们此时只需要使用到前几个数,那么通过列表保存100w个数来备用就会用到巨大的空间.而我们却不一定会用到第100w个数,白白浪费了庞大的空间.因此我们就需要用到了生成器

汉诺塔问题的Python递归实现

汉诺塔问题的python递归实现 学习python遇到的第一个问题:汉诺塔问题的实现.首先是不知道什么是汉诺塔问题,然后是不知道怎么实现.于是百度了下,结果如下: 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘 def hanoi(n,x,y,z): i

Python递归报错:RuntimeError: maximum recursion depth exceeded in comparison

Python中默认的最大递归深度是989,当尝试递归第990时便出现递归深度超限的错误: RuntimeError: maximum recursion depth exceeded in comparison 简单方法是使用阶乘重现: 1 #! /usr/bin/env Python 2 3 def factorial(n): 4 5 if n == 0 or n == 1: 6 7 return 1 8 9 else: 10 11 return(n * factorial(n - 1)) >

Python递归遍历目录下所有文件

#自定义函数: import ospath="D:\\Temp_del\\a" def gci (path): parents = os.listdir(path) for parent in parents: child = os.path.join(path,parent) #print(child) if os.path.isdir(child): gci(child) # print(child) else: print(child) gci(path) #使用os.walk方