python学习 生成器 列表生成式 迭代器
来源:互联网 发布:线上展厅制作软件 编辑:程序博客网 时间:2024/05/17 21:50
递归问题
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学习(七)——列表生成式、生成器
- Python高级特性(切片 迭代 列表生成式 生成器 迭代器)学习笔记
- 【python】列表生成式和生成器
- 列表生成式,列表生成器,迭代器
- 列表生成式,列表生成器,迭代器
- python-生成式、生成器、迭代器
- Python学习 Day 4 函数 切片 迭代 列表生成式 生成器
- python学习笔记(7)-高级特性(三)-列表生成式与生成器
- python切片、迭代、生成器、列表生成式等高级特性学习
- python3 列表生成式、生成器、迭代器
- Python高级特性-迭代(Iteration)-列表生成式-生成器
- 2016.4.10Python列表生成式及生成器generator
- Python(八)切片、迭代、列表生成式、生成器
- 初学python:切片、迭代、列表生成式、生成器
- python——切片 迭代 列表生成式 生成器
- cpu负荷
- 硬盘IO负荷
- JVM内存区域划分
- QML控件拖动并靠边停留
- MFC中模态和非模态对话框的创建和区别
- python学习 生成器 列表生成式 迭代器
- H3C Comware V7新增的RBAC
- 判断机器是否开机
- Java的反射机制
- Numpy 创建数组
- postgres数据导入导出
- 15款最好用的思维导图(心智图 )工具
- collections OrderedDict
- SQL Server 同期数据到Postgres