码迷,mamicode.com
首页 > 其他好文 > 详细

迭代器,生成器,装饰器,递归

时间:2019-07-20 17:09:19      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:model   递归   ges   word   特性   png   number   递归函数   loaded   

迭代器

  可迭代对象

    1)定义:在python中,但凡内部含有--itter--方法的对象,都是可迭代对象

     可以通过dir()去判断一个对象具有什么方法

     dir()会返回一个列表,这个列表中含有该对象的以字符串形式的所有方法

技术图片View Code

    从字面意思来说:可迭代对象就是一个可以重复取值的数据集。

    从专业角度来说:但凡内部含有iter方法的对象,都是可迭代对象 。 可迭代对象可以通过判断该对象是否有’iter’方法来判断。

    可迭代对象的优点: 可以直观的查看里面的数据。操作方法多,灵活

    可迭代对象的缺点:

      1.占用内存。

      2.可迭代对象不能迭代取值(除去索引,key以外)。

  迭代器定义

    从字面意思来说:可以迭代取值的工具

    从专业角度来说:在python中内部含有--iter--方法并且含有--next--方法的对象就是迭代器

    2)如何判断该对象是否是迭代器

      通过dir()来判断

技术图片View Code

    3) 可迭代对象如何转化成迭代器:

l1 = [1, 2, 3, 4, 5, 6]
obj = l1.__iter__()  obj。就是迭代器

    4) 迭代器取值:

技术图片View Code

 

    5) while模拟for的内部循环机制:

技术图片View Code

    6)小结:

      迭代器特性:

      惰性机制:next一次,去一个值,绝不多取

      节省内存:每次取值都在内存中将上一次数据释放,加载当前数据

      取值时不能走回头路,只能一直向下取值, ? 不能直观查看里面的数据,操作方法少,不灵活,效率相对低 以时间换空间:迭代器 以空间换时间:字典

 

可迭代对象与迭代器的对比: 

  可迭代对象:
       是一个私有的方法比较多,操作灵活(比如列表,字典的增删改查,字符串的常用操作方法等),比较直观,但是占用内存,而且不能直接通过循环迭代取值的这么一个数据集。
?
       应用:当你侧重于对于数据可以灵活处理,并且内存空间足够,将数据集设置为可迭代对象是明确的选择。
?
     迭代器:
       是一个非常节省内存,可以记录取值位置,可以直接通过循环+next方法取值,但是不直观,操作方法比较单一的数据集。
?
       应用:当你的数据量过大,大到足以撑爆你的内存或者你以节省内存为首选因素时,将数据集设置为迭代器是一个不错的选择。(可参考为什么python把文件句柄设置成迭代器)。

 

 

生成器:

  初始生成器

  生成器的本质是迭代器 唯一的不同就是:迭代器都是python给我们提供的已经写好的工具或者通过数据转化得来的 生成器使我们需要通过python代码构建的工具

  生成器的构建方式:

  在python中有三种方式来创建生成器:

    1.通过生成器函数 ?

    2.通过生成器推导式 ?

    3.python内置函数或者模块提供(其实1,3两种本质上差不多,都是通过函数的形式生成,只不过1是自己写的生成器函数,3是python提供的生成器函数而已)

  生成器函数

  通过研究生成器函数来构建生成器函数

技术图片View Code

  yield必须和next一一对应

技术图片View Code
  yield和yield from的区别:

    yield :是生成器的标识,next必须和yield一一对应

    yield from:替代了内层for循环,提高了效率。


技术图片View Code

推导式:

1.列表推导式
技术图片View Code
[结果,语法] # 容器
技术图片View Code
2.集合推导式
{结果 语法} 容器
s = {i for i in range(10)}
print(s)
?
3.字典推导式:
print({i:i+1 for i in range(10)})
?
4.生成器推导式
print(i for i in range(10))

闭包

  闭包的定义:

    1.闭包是嵌套在函数中的函数 ?

    2.闭包必须是内层函数对外层函数的变量(非全局变量)的引用

  优点:

    自由变量不会会随着函数的结束而消失,保证了数据的安全

    装饰器的本质是闭包

技术图片    怎样查看闭包? 函数名.__ code__ .co _freevars 返回None 就不是闭包

  闭包的应用:

    1.一些重要的数据用闭包创建,保证了数据的安全,

    闭包中被引用的变量(也叫自由变量)不会随着函数的结束而消失。

    2.装饰器的本质就是闭包

技术图片

 

技术图片View Code

装饰器

  装饰器定义:在不改变原装饰的函数的源代码及其调用方式的前提下,为其添加额外的功能

  装饰器遵循的原则:

     开放封闭原则:

     对扩展开放 ? 对源代码封闭 ? 不能改变原有的调用方式

  标准板装饰器
技术图片View Code
  带参数的装饰器
技术图片View Code

 

  执行流程

技术图片

 

   多个装饰器装饰一个函数

技术图片View Code

  执行流程

技术图片

 技术图片

 

递归

  递归函数:在一个函数里在调用这个函数本身。

  递归默认的最大深度:1000

  递归的最大深度:998

  递归根本:逆推,终止条件(return)

技术图片View Code

斐波那契数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233

技术图片View Code

迭代器,生成器,装饰器,递归

标签:model   递归   ges   word   特性   png   number   递归函数   loaded   

原文地址:https://www.cnblogs.com/guzhaowen/p/11218187.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!