迭代器
可迭代对象
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