Python_面向对象_递归
--递归本质
函数调用是通过栈(stack)这种数据结构实现的
每当进入一个函数调用,栈区就会加一层栈帧,
每当函数返回,栈区就会减一层栈帧,但栈区空间有限,要注意防止栈溢出
# 递归函数:在函数内部,自己调用其自身即是递归函数
# 递归最简易的原型
"""
递归非常占用内存空间,使用递归如果层级过大 不建议使用,内存容易溢出
递归每一层调用的函数空间必须都执行完毕才算结束
不能无限递归,需要给递归限制跳出的条件
"""
def digui(n):
print(n)
if n>0:
digui(n-1)
print(n)
digui(5)
def jiecheng(n):
if n == 1:
return 1
return n * jiecheng(n-1)
res2 = jiecheng(5)
print(res2)
--尾递归
尾递归:在函数返回的时候,调用其本身,并且,return语句不包含表达式。(简单来说是递归函数,且只调用自己非表达式)
尾递归意义:使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况.(需要Python解释器支持)
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)
res = fact(5)
print(res)
***了解内容--start--***
栈:后进先出的一种数据结构
堆:排序后的一种树状数据结构
--内存中的栈区 : 自动分配 自动释放
栈区:按照后进先出的数据结构(栈),无论创建或销毁都是自动为数据分配内存,释放内存(系统自动做的)
--内存中的堆区 : 手动分配 手动释放
堆区:按照排序后的树状数据结构(堆),可优先取出必要数据,无论创建或销毁都是手动分配内存,释放内存(程序员手动做的)
运行程序时在内存中执行,会因为数据类型的不同而在内存的不同区域运行
因不同语言对内存划分的机制不一,但大体来讲,有如下四大区域
栈区: 分配局部变量空间.
堆区: 是用于手动分配程序员申请的内存空间.
静态区(全局栈区): 分配静态变量,全局变量空间.
代码区(只读区,常量区): 分配常量和程序代码空间的.
栈区 堆区 静态区 代码区 都是内存中的一段空间
***了解内容--end--***
--匿名函数:lambda表达式
"""
lambda语法:lambda 参数 : 返回值
不带参数的写法 #案例 lambda : 10
带参数的写法 案例:lambda a,b: a+b
条件分支的写法 lambda n : "偶数" if n % 2==0 else "奇数"
"""
# 案例1 不带参数
def niminghanshu():
return 10
res = lambda : 10
print(res())
# 案例2 带上参数
def niminghanshu2(a,b):
return a+b
func = lambda a,b : a+b
res = func(5,6)
print(res)
# 案例3 条件分支写法
def niminghanshu3(n):
if n % 2 == 0:
return "偶数"
else:
return "奇数"
func = lambda n : "偶数" if n % 2==0 else "奇数"
res = func(11)
print(res)
# 迭代器:可以被next()函数调用并不断返回下一个值的对象称为迭代器(Iterator 迭代器是对象)
# 迭代器是一种惰性序列,它通过计算把值依次的返回,而不是一次性的得到所有数据放到内存中
# 迭代器
for i in range(1,10):
print(i)
from collections import Iterable,Iterator
res1 = isinstance(range(1,10), Iterable) #判断是否是
# 可迭代的 可迭代的对象
res2 = isinstance(range(1,10),Iterator)
print(res1)
print(res2)
# 用iter 函数 把具有可迭代性的数据 转换成 迭代器
res3 = iter(range(1,10))
print(res3)
res4 = isinstance(res3,Iterator)
print(res4)
"""
res5 = range(1,10)
next(res5)
"""
print("<==>")
res6 = iter(range(1,5))
print("<==123==>")
print(res6)
res7 = next(res6)
res8 = next(res6)
res9 = next(res6)
res10 = next(res6)
"""
# Iterable可迭代的 Iterator迭代器
from collections import Iterable,Iterator
res1 = isinstance(range(1,10), Iterable) #判断是否是可迭代的
res2 = isinstance(iter(range(1,10)), Iterator) #判断是否是迭代器
res3 = list(range(1,10)) #list可以强转具有迭代性的数据或者迭代器
print(res1)
print(res2)
print(res3)
"""
# 首先获得Iterator对象: 通过iter把可迭代对象 转换成 迭代器
it = iter([1, 2, 3, 4, 5])
***了解内容--start--***
# 循环:
while True:
try:
# 获得下一个值:
x = next(it)
except StopIteration:
# 遇到StopIteration就退出循环
break
***了解内容--end--***
惰性序列:没有一次性的把所有数据都放在序列中,而是遍历一个放一个,这样的序列
range 是 可迭代对象
range 和 迭代器 能够产生惰性序列
转载于:https://www.cnblogs.com/bling-bling-star/p/9382688.html
Python_面向对象_递归相关推荐
- Python_面向对象_类1
面向对象:减少重复代码,提高效率,比函数式编程更高效 类的创建: 实例属性又称:成员变量,成员属性(或者字段) 面向对象的三大特性: 一.封装 把客观事物封装为抽象的类,并对外只暴露一个可用接口 使用 ...
- Python_机器学习_算法_第4章_4.决策树算法
Python_机器学习_算法_第4章_4.决策树算法 文章目录 Python_机器学习_算法_第4章_4.决策树算法 决策树算法 学习目标 4.1 决策树算法简介 学习目标 小结 4.2 决策树分类原 ...
- Python_机器学习_算法_第1章_K-近邻算法
Python_机器学习_算法_第1章_K-近邻算法 文章目录 Python_机器学习_算法_第1章_K-近邻算法 K-近邻算法 学习目标 1.1 K-近邻算法简介 学习目标 1 什么是K-近邻算法 1 ...
- python 读grid 数据_科学网—Python_机器学习_总结14:Grid search - 李军的博文
机器学习中存在两类参数:通过训练数据学习得到的参数:---可认为是辨识得到的参数,例如模型系数: 在学习算法中单独需要优化的参数--超参.调优参数:---算法自身的系数,例如决策树的深度参数: Gri ...
- 怎么确定自己是第几层递归_递归(1)——理解递归思想
通俗易懂的博客: 博客: 递归的使用(图解)_ITdevil的博客-CSDN博客_递归图解 什么是递归? 简单的说:递归就是方法自己调用自己 递归特点: 有临界点 当一个方法执行完毕,或者遇到retr ...
- java递归api_javaAPI_IO流基础_递归使用
IO流_递归 1.递归概述 递归指的是方法定义中调用自身方法的情况. 2.递归的注意事项 (1).要有出口,否则就是死递归 (2).次数不能太多,否则就内存溢出 (3).构造方法不能递归使用[不然在创 ...
- 复习JavaFile类_递归_综合案例
复习File类_递归 主要内容 File类 递归 第一章 File类 1.1 概述 java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和删除等操作, 这里需要注意 ...
- python sklearn 梯度下降法_科学网—Python_机器学习_总结4:随机梯度下降算法 - 李军的博文...
=============================================================== 总结如下: 1.随机梯度下降算法可以看成是梯度下降算法的近似,但通常它能 ...
- python类方法和实例方法syntax errors_《Fluent Python》CH.11_面向对象_接口:从协议到抽象基类...
主要内容 首先,本章说明抽象基类的常见用途:实现接口时作为超类使用 说明抽象基类如何检查具体子类是否符合接口定义,以及如何使 用注册机制声明一个类实现了某个接口,而不进行子类化操作 最后, 说明如何让 ...
最新文章
- 2021年大数据Flink(十八):Flink Window操作
- qt中继承pushbutton自定义控件设置按钮样式
- Maven 系列 2:Maven 本地仓库与远程仓库配置完整步骤以及修改 settings.xml 后的完整内容(配置非私服,远程仓储镜像强力推荐阿里云)
- codeproject上发现的DataSet调试利器
- C++学习笔记-利用rapidJSON读取JSON数据
- C/C++静态库编译报错(/usr/bin/ld:cannot find -lpthread,/usr/bin/ld:cannot find -lc)
- ORACLE中关于外键缺少索引的探讨和总结
- Mozilla为Firefox添加新的CSRF保护
- js JavaScript实战练习——小球碰撞反弹(详细)
- javacv获取摄像头列表
- java怎么同时实现鼠标监听和键盘监听_JavaScript如何实现监听键盘输入和鼠标监点击...
- 内网渗透测试:隐藏通讯隧道技术
- 【PS】抠图,通道抠图
- 安卓 Share微博客户端 3.9 精简高级版 修改版
- 【趣读官方文档】1.管家的抉择 (Android进程生命周期)
- 科技生活第一季:解读数字孪生概念 —— 智慧城市大脑
- 解决2021版本idea定位图标消失
- 077 三角函数定积分性质
- Excel VBA: 自动生成巡检报表并通过邮件定时发送
- 【论文泛读62】HybridQA:通过表格和文本数据进行多跳问答的数据集
热门文章
- 27-----BBS论坛
- 类内的函数共享给对象使用
- 组合数据类型综合练习
- HelloMyBLOG!!!
- Eclipse远程调试HDP源代码
- Node.js:Windows7下搭建的Node.js服务(来玩玩服务器端的javascript吧,这可不是前端js插件)...
- 查看sqlserver版本
- OTL、OCL、BTL电路及其判断方法
- pythonfor输入多个数字_我一天学会了python最基础的编程
- three.js加载3d模型_可加载5亿多边形,InsiteVR推Quest端BIM协作应用《Resolve》