python学习 生成器 列表生成式 迭代器
2017-03-02 07:45
585 查看
递归问题
1.用递归函数需要注意防止栈溢出。在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出
2.解决递归调用栈溢出的方法是通过尾递归优化,事实上尾递归和循环的效果是一样的,所以,把循环看成是一种特殊的尾递归函数也是可以的
3.尾递归是指,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况
例
fact_iter(5, 1)
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和函数的执行流程不一样。函数是顺序执行,遇到
杨辉三角例子/调用只执行了一次,每次执行是把上一次的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]
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]
相关文章推荐
- Python高级特性(切片 迭代 列表生成式 生成器 迭代器)学习笔记
- python学习笔记,列表生成式,生成器
- Python高级特性(切片,迭代,列表生成式、生成器、迭代器)
- Python学习:列表生成式和列表生成器
- 学习7: 列表生成式,生成器,迭代器,可迭代对象
- Python day5:列表生成式,生成器,迭代器
- Python3中的列表生成式、生成器与迭代器实例详解
- Python学习笔记(六)Python的列表生成式、生成器
- Python中的列表生成式与生成器学习教程
- python学习-Day15-python生成式和生成器、迭代器、装饰器
- 【Python】[高级特性]切片,迭代,列表生成式,生成器,迭代器
- python迭代器和生成器(3元运算,列表生成式,生成器表达式,生成器函数)
- Python学习(七)——列表生成式、生成器
- python3 列表生成式、生成器、迭代器
- python2.7学习笔记(6) ——高级特性:切片、迭代、列表生成式、生成器
- 初学Python——列表生成式、生成器和迭代器
- python的高级特性:切片,迭代,列表生成式,生成器,迭代器
- python切片、迭代、生成器、列表生成式等高级特性学习
- Python笔记-列表生成式、生成器generator(包括斐波拉契数列)、迭代器Iterator
- Python之列表生成式、生成器、可迭代对象与迭代器