您的位置:首页 > 编程语言 > Python开发

python学习 生成器 列表生成式 迭代器

2017-03-02 07:45 585 查看
递归问题

1.用递归函数需要注意防止栈溢出。在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出

2.解决递归调用栈溢出的方法是通过尾递归优化,事实上尾递归和循环的效果是一样的,所以,把循环看成是一种特殊的尾递归函数也是可以的

3.尾递归是指,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况



def fact(n):
return fact_iter(n, 1)

def fact_iter(num, product):
if num == 1:
return product
return fact_iter(num - 1, num * product)

fact_iter(5, 1)

===> fact_iter(5, 1)
===> fact_iter(4, 5)
===> fact_iter(3, 20)
===> fact_iter(2, 60)
===> fact_iter(1, 120)
===> 120


range(5)
表示从0到4

切片(相当于substr,字符串截取)

L[开启切的位置,从0开始:结算位置]

负数者从最后开始切,第一个是从-1开始,第二个从0开始(反过来的0).第二个参数不能大于第一个参数

L[开始位置,-1表示最后一位:结束位置]

例:我有L=['a','b','c','d']

L[-1:] 结果是d

L[-2:-1] 结果是c

也可以切tuple和字符串,只是数据类型不会变 

使用列表生成式

生成一个1-10的数组

d = [x for x in range(1,11)] 

import os

d = [d for d in os.listdir('.')]

列出当前目录的所以文件名和目录

zip()例子

L = [1,2,3,4]

C = [5,6,7,8]

lx = [i for i inzip(L,C)]

print(lx)

>>> [(1, 5), (2, 6), (3, 7), (4, 8)]

生成器/杨辉三角例子

要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的
[]
改成
()
,就创建了一个generator

>>> L = [x * x for x in range(10)]
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x1022ef630>


如果一个函数定义中包含
yield
关键字,那么这个函数就不再是一个普通函数,而是一个generator,

最难理解的就是generator和函数的执行流程不一样。函数是顺序执行,遇到
return
语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用的时候执行,遇到
yield
语句返回,再次执行时从上次返回的
yield
语句处继续执行

杨辉三角例子/调用只执行了一次,每次执行是把上一次的lsit a 加上一个空list,得到一个二维的list,然后zip把顺序换一下。看上面的zip函数,然后列表生成式生成list,i是一个list,然后sum求每个list的和,然后得到最终的list返回

def triangles():

    a = [1]

    print('调用')

    while True:

        yield a

#print为测试用

        print('每行二维list:',[i for i in zip([0] + a, a + [0])])

        a = [sum(i) for i in zip([0] + a, a + [0])]

n = 0

for t in triangles():

    print(t)

    n = n + 1

    if n == 5:

        break

结果

[1]

[1, 1]

[1, 2, 1]

[1, 3, 3, 1]

[1, 4, 6, 4, 1]

[1, 5, 10, 10, 5, 1]

[1, 6, 15, 20, 15, 6, 1]

[1, 7, 21, 35, 35, 21, 7, 1]

[1, 8, 28, 56, 70, 56, 28, 8, 1]

[1, 9, 36, 84, 126, 126, 84, 36, 9, 1]

测试结果

调用

[1]

每行二维list: [(0, 1), (1, 0)]

[1, 1]

每行二维list: [(0, 1), (1, 1), (1, 0)]

[1, 2, 1]

每行二维list: [(0, 1), (1, 2), (2, 1), (1, 0)]

[1, 3, 3, 1]

每行二维list: [(0, 1), (1, 3), (3, 3), (3, 1), (1, 0)]

[1, 4, 6, 4, 1]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: