--递归本质
  函数调用是通过栈(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_面向对象_递归相关推荐

  1. Python_面向对象_类1

    面向对象:减少重复代码,提高效率,比函数式编程更高效 类的创建: 实例属性又称:成员变量,成员属性(或者字段) 面向对象的三大特性: 一.封装 把客观事物封装为抽象的类,并对外只暴露一个可用接口 使用 ...

  2. Python_机器学习_算法_第4章_4.决策树算法

    Python_机器学习_算法_第4章_4.决策树算法 文章目录 Python_机器学习_算法_第4章_4.决策树算法 决策树算法 学习目标 4.1 决策树算法简介 学习目标 小结 4.2 决策树分类原 ...

  3. Python_机器学习_算法_第1章_K-近邻算法

    Python_机器学习_算法_第1章_K-近邻算法 文章目录 Python_机器学习_算法_第1章_K-近邻算法 K-近邻算法 学习目标 1.1 K-近邻算法简介 学习目标 1 什么是K-近邻算法 1 ...

  4. python 读grid 数据_科学网—Python_机器学习_总结14:Grid search - 李军的博文

    机器学习中存在两类参数:通过训练数据学习得到的参数:---可认为是辨识得到的参数,例如模型系数: 在学习算法中单独需要优化的参数--超参.调优参数:---算法自身的系数,例如决策树的深度参数: Gri ...

  5. 怎么确定自己是第几层递归_递归(1)——理解递归思想

    通俗易懂的博客: 博客: 递归的使用(图解)_ITdevil的博客-CSDN博客_递归图解 什么是递归? 简单的说:递归就是方法自己调用自己 递归特点: 有临界点 当一个方法执行完毕,或者遇到retr ...

  6. java递归api_javaAPI_IO流基础_递归使用

    IO流_递归 1.递归概述 递归指的是方法定义中调用自身方法的情况. 2.递归的注意事项 (1).要有出口,否则就是死递归 (2).次数不能太多,否则就内存溢出 (3).构造方法不能递归使用[不然在创 ...

  7. 复习JavaFile类_递归_综合案例

    复习File类_递归 主要内容 File类 递归 第一章 File类 1.1 概述 java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和删除等操作, 这里需要注意 ...

  8. python sklearn 梯度下降法_科学网—Python_机器学习_总结4:随机梯度下降算法 - 李军的博文...

    =============================================================== 总结如下: 1.随机梯度下降算法可以看成是梯度下降算法的近似,但通常它能 ...

  9. python类方法和实例方法syntax errors_《Fluent Python》CH.11_面向对象_接口:从协议到抽象基类...

    主要内容 首先,本章说明抽象基类的常见用途:实现接口时作为超类使用 说明抽象基类如何检查具体子类是否符合接口定义,以及如何使 用注册机制声明一个类实现了某个接口,而不进行子类化操作 最后, 说明如何让 ...

最新文章

  1. 2021年大数据Flink(十八):Flink Window操作
  2. qt中继承pushbutton自定义控件设置按钮样式
  3. Maven 系列 2:Maven 本地仓库与远程仓库配置完整步骤以及修改 settings.xml 后的完整内容(配置非私服,远程仓储镜像强力推荐阿里云)
  4. codeproject上发现的DataSet调试利器
  5. C++学习笔记-利用rapidJSON读取JSON数据
  6. C/C++静态库编译报错(/usr/bin/ld:cannot find -lpthread,/usr/bin/ld:cannot find -lc)
  7. ORACLE中关于外键缺少索引的探讨和总结
  8. Mozilla为Firefox添加新的CSRF保护
  9. js JavaScript实战练习——小球碰撞反弹(详细)
  10. javacv获取摄像头列表
  11. java怎么同时实现鼠标监听和键盘监听_JavaScript如何实现监听键盘输入和鼠标监点击...
  12. 内网渗透测试:隐藏通讯隧道技术
  13. 【PS】抠图,通道抠图
  14. 安卓 Share微博客户端 3.9 精简高级版 修改版
  15. 【趣读官方文档】1.管家的抉择 (Android进程生命周期)
  16. 科技生活第一季:解读数字孪生概念 —— 智慧城市大脑
  17. 解决2021版本idea定位图标消失
  18. 077 三角函数定积分性质
  19. Excel VBA: 自动生成巡检报表并通过邮件定时发送
  20. 【论文泛读62】HybridQA:通过表格和文本数据进行多跳问答的数据集

热门文章

  1. 27-----BBS论坛
  2. 类内的函数共享给对象使用
  3. 组合数据类型综合练习
  4. HelloMyBLOG!!!
  5. Eclipse远程调试HDP源代码
  6. Node.js:Windows7下搭建的Node.js服务(来玩玩服务器端的javascript吧,这可不是前端js插件)...
  7. 查看sqlserver版本
  8. OTL、OCL、BTL电路及其判断方法
  9. pythonfor输入多个数字_我一天学会了python最基础的编程
  10. three.js加载3d模型_可加载5亿多边形,InsiteVR推Quest端BIM协作应用《Resolve》