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

迭代器

  可迭代对象

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

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

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

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

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

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

    可迭代对象的缺点:

      1.占用内存。

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

  迭代器定义

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

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

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

      通过dir()来判断

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

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

    4) 迭代器取值:

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

    6)小结:

      迭代器特性:

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

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

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

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

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

生成器:

  初始生成器

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

  生成器的构建方式:

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

    1.通过生成器函数 ?

    2.通过生成器推导式 ?

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

  生成器函数

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

  yield必须和next一一对应

  yield和yield from的区别:

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

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


推导式:

1.列表推导式

[结果,语法] # 容器

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.装饰器的本质就是闭包

装饰器

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

  装饰器遵循的原则:

     开放封闭原则:

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

  标准板装饰器

  带参数的装饰器

  执行流程

  多个装饰器装饰一个函数

  执行流程

递归:

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

  递归默认的最大深度:1000

  递归的最大深度:998

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

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

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

时间: 2024-10-08 19:44:00

迭代器,生成器,装饰器,递归的相关文章

Python 迭代器&生成器,装饰器,递归,算法基础:二分查找、二维数组转换,正则表达式,作业:计算器开发

本节大纲 迭代器&生成器 装饰器  基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式,运算后得出结果,结果必须与真实的计算器所得出的结果一致 迭代器&

python学习笔记(5)--迭代器,生成器,装饰器,常用模块,序列化

生成器 在Python中,一边循环一边计算的机制,称为生成器:generator. 如: 1 >>> g = (x * x for xin range(10)) 2 >>> g3 <generator object <genexpr> at 0x1022ef630> 此处g就是一个生成器. 迭代器 我们已经知道,可以直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list.tuple.dict.set.str等: 一类是gene

python 迭代器 生成器 装饰器

迭代器 可以直接作用于for循环的对象统称为可迭代对象(Iterable). 可以被next()函数调用并不断返回下一个值的对象称为迭代器(Iterator). 所有的Iterable均可以通过内置函数iter()来转变为Iterator. names = iter(['sun', 'ibm', 'sunny']) print(names) print(names.__next__()) print(names.__next__()) print(names.__next__()) print(

迭代器/生成器/装饰器

迭代器 迭代器对象要求支持迭代器协议的对象,在Python中,支持迭代器协议就是实现对象的__iter__()和next()方法.其中__iter__()方法返回迭代器对象本身:next()方法返回容器的下一个元素,在结尾时引发StopIteration异常 可迭代对象 如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration),默认的list.tuple.stri.dict对象都是可以迭代的. isinstance(obj

Python 全栈开发五 迭代器 生成器 装饰器

一.迭代器 迭代器是一个可以记住遍历的位置的对象.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退. 迭代器有两个基本的方法:iter() 和 next(). 字符串,列表或元组对象都可用于创建迭代器,生成迭代器的方法是iter(): >>li = [1,2,3,4,5] >>it = iter(li) #生成一个迭代器 >>it.__next__() 1 >>next(it) #以上两种next都可以使用 2 >

Day4 - Python基础4 迭代器、装饰器、软件开发规范

Python之路,Day4 - Python基础4 (new版) 本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 孩子,我现在有个需求,看列表[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],我要求你把列表里的每个值加1,你怎么实现?你可能会想到2种方式 >>> a [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>

Python_Day5_迭代器、装饰器、软件开发规范

本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 1.列表生成式,迭代器&生成器 列表生成 >>> a = [i+1 for i in range(10)] >>> a [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访

python -- 迭代器和装饰器

迭代器和装饰器在python中的使用十分常见,下面是个人对迭代器和装饰器的理解 迭代器 1.迭代器 iter 的特点: (1).访问者不需要关心迭代器的内部结构,仅需要通过__next__()方法不断去取下一个内容 (2).不能随机访问集合(不是set,只是一些元素的聚集体)中的某个值,只能从头到尾依次访问 (3).访问到一半时不能后退(过去的就过去了,不能回头) (4).便于循环比较大的数据集合,节省内存(每次需要了指定数据时,才把该读取到内存中,eg:迭代文件时,内存中每一时刻都只有文件的一

Python求索之路3——迭代器、装饰器、生成器、正则

1.迭代器 迭代器是访问数据集合的一种方式,它只能从集合的第一个元素开始顺序访问,直到最后一个元素结束.类似于linux里的cat命令,只能挨行读取文本内容,不可以跳到中间或者尾部读取(不会把所有的数据都读到内存中),对于上G的文件,比较节约内存.该迭代的好处就是它事先不需要准备好集合里的所有元素,遍历到该元素时才会计算处理该元素,这点与列表有很大的不同. 示例1: a = iter(['add','dfdf','dfdfd']) print a.next()#取第一个值 print a.nex