python全栈开发- 前⽅⾼能-迭代器
python_day_12
今日主要内容
1, 函数名的应用,第一类对象
函数名可以像变量一样进行使用
1.赋值
2.作为list元素
3.作为参数
4.作为返回值
2, 闭包
内部函数访问外部函数的局部变量.
好处:
- 1.安全
- 2.常驻内存. 提高效率
- 3, 迭代器
可迭代对象(Iterable):内部包含__iter__().
迭代器(Iterator): 内部含有__iter__() __next__()
str, list, tuple, set, dict
f, range
迭代器的特点:
- 1.省内存
- 2.惰性机制
- 3.只能向前.
11. 前方高能-迭代器 本节主要内容:
- 1. 函数名的使⽤以及第⼀类对象
- 2. 闭包
- 3. 迭代器
⼀. 函数名的运⽤.
函数名是⼀个变量, 但它是⼀个特殊的变量, 与括号配合可以执⾏函数的变量.
1. 函数名的内存地址
- def func():
- print("呵呵")
- print(func)
- 结果:
- <function func at 0x1101e4ea0>
2. 函数名可以赋值给其他变量
- def func():
- print("呵呵")
- print(func)
- a = func # 把函数当成⼀个变量赋值给另⼀个变量
- a() # 函数调⽤ func()
3. 函数名可以当做容器类的元素
- def func1():
- print("呵呵")
- def func2():
- print("呵呵")
- def func3():
- print("呵呵")
- def func4():
- print("呵呵")
- lst = [func1, func2, func3]
- for i in lst:
- i()
4. 函数名可以当做函数的参数
- def func():
- print("吃了么")
- def func2(fn):
- print("我是func2")
- fn() # 执⾏传递过来的fn
- print("我是func2")
- func2(func) # 把函数func当成参数传递给func2的参数fn.
5. 函数名可以作为函数的返回值
- def func_1():
- print("这⾥是函数1")
- def func_2():
- print("这⾥是函数2")
- print("这⾥是函数1")
- return func_2
- fn = func_1() # 执⾏函数1. 函数1返回的是函数2, 这时fn指向的就是上⾯函数2
- fn() # 执⾏上⾯返回的函数
⼆. 闭包 什么是闭包? 闭包就是内层函数, 对外层函数(非全局)的变量的引⽤. 叫闭包
- def func1():
- name = "alex"
- def func2():
- print(name) # 闭包
- func2()
- func1()
- 结果:
- alex
我们可以使⽤__closure__来检测函数是否是闭包. 使⽤函数名.__closure__返回cell就是 闭包. 返回None就不是闭包
- def func1():
- name = "alex"
- def func2():
- print(name) # 闭包
- func2()
- print(func2.__closure__) # (<cell at 0x10c2e20a8: str object at
- 0x10c3fc650>,)
- func1()
问题, 如何在函数外边调⽤内部函数呢?
- def outer():
- name = "alex"
- # 内部函数
- def inner():
- print(name)
- return inner
- fn = outer() # 访问外部函数, 获取到内部函数的函数地址
- fn() # 访问内部函数
那如果多层嵌套呢? 很简单, 只需要⼀层⼀层的往外层返回就⾏了
- def func1():
- def func2():
- def func3():
- print("嘿嘿")
- return func3
- return func2
- func1()()()
由它我们可以引出闭包的好处. 由于我们在外界可以访问内部函数. 那这个时候内部函 数访问的时间和时机就不⼀定了, 因为在外部, 我可以选择在任意的时间去访问内部函数. 这 个时候. 想⼀想. 我们之前说过, 如果⼀个函数执⾏完毕. 则这个函数中的变量以及局部命名 空间中的内容都将会被销毁. 在闭包中. 如果变量被销毁了. 那内部函数将不能正常执⾏. 所 以. python规定. 如果你在内部函数中访问了外层函数中的变量. 那么这个变量将不会消亡. 将会常驻在内存中. 也就是说. 使⽤闭包, 可以保证外层函数中的变量在内存中常驻. 这样做 有什么好处呢? 非常⼤的好处. 我们来看⼀个关于爬⾍的代码:
- from urllib.request import urlopen
- def but():
- content = urlopen("http://www.xiaohua100.cn/index.html").read()
- def get_content():
- return content
- return get_content
- fn = but() # 这个时候就开始加载校花100的内容
- # 后⾯需要⽤到这⾥⾯的内容就不需要在执⾏⾮常耗时的⽹络连接操作了
- content = fn() # 获取内容
- print(content)
- content2 = fn() # 重新获取内容
- print(content2)
综上, 闭包的作⽤就是让⼀个变量能够常驻内存. 供后⾯的程序使⽤.
三. 迭代器 我们之前⼀直在⽤可迭代对象进⾏迭代操作. 那么到底什么是可迭代对象. 本⼩节主要讨 论可迭代对象. ⾸先我们先回顾⼀下⽬前我们所熟知的可迭代对象有哪些: str, list, tuple, dict, set.
我们发现这⼏个可以进⾏for循环的东⻄都有__iter__函数, 包括range也有. 可以⾃⼰试⼀ 下. 这是查看⼀个对象是否是可迭代对象的第⼀种办法. 我们还可以通过isinstence()函数来查 看⼀个对象是什么类型的
- l = [1,2,3]
- l_iter = l.__iter__()
- from collections import Iterable
- from collections import Iterator
- print(isinstance(l,Iterable)) #True
- print(isinstance(l,Iterator)) #False
- print(isinstance(l_iter,Iterator)) #True
- print(isinstance(l_iter,Iterable)) #True
综上. 我们可以确定. 如果对象中有__iter__函数. 那么我们认为这个对象遵守了可迭代协议. 就可以获取到相应的迭代器. 这⾥的__iter__是帮助我们获取到对象的迭代器. 我们使⽤迭代 器中的__next__()来获取到⼀个迭代器中的元素. 那么我们之前讲的for的⼯作原理到底是什 么? 继续看代码
- s = "我爱北京天安⻔"
- c = s.__iter__() # 获取迭代器
- print(c.__next__()) # 使⽤迭代器进⾏迭代. 获取⼀个元素 我
- print(c.__next__()) # 爱
- print(c.__next__()) # 北
- print(c.__next__()) # 京
- print(c.__next__()) # 天
- print(c.__next__()) # 安
- print(c.__next__()) # ⻔
- print(c.__next__()) # StopIteration
for循环的机制:
- for i in [1,2,3]:
- print(i)
- lst = [1,2,3]
- lst_iter = lst.__iter__()
- while True:
- try:
- i = lst_iter.__next__()
- print(i)
- except StopIteration:
- break
总结:
Iterable: 可迭代对象. 内部包含__iter__()函数
Iterator: 迭代器. 内部包含__iter__() 同时包含__next__().
迭代器的特点:
- 1. 节省内存.
- 2. 惰性机制
- 3. 不能反复, 只能向下执⾏.
我们可以把要迭代的内容当成⼦弹. 然后呢. 获取到迭代器__iter__(), 就把⼦弹都装在弹夹 中. 然后发射就是__next__()把每⼀个⼦弹(元素)打出来. 也就是说, for循环的时候. ⼀开始的 时候是__iter__()来获取迭代器. 后⾯每次获取元素都是通过__next__()来完成的. 当程序遇到 StopIteration将结束循环.
2018-07-17 19:11:38
python全栈开发- 前⽅⾼能-迭代器的更多相关文章
- python 全栈开发,Day13(迭代器,生成器)
一.迭代器 python 一切皆对象 能被for循环的对象就是可迭代对象 可迭代对象: str,list,tuple,dict,set,range 迭代器: f1文件句柄 dir打印该对象的所有操作方 ...
- python全栈开发从入门到放弃之迭代器生成器
1.python中的for循环 l = [1,2,3,4,5,6] for i in l: #根据索引取值 print(i) 输出结果: 1 2 3 4 5 6 2.iterable 可迭代的 可迭 ...
- Python全栈开发【基础四】
Python全栈开发[基础四] 本节内容: 匿名函数(lambda) 函数式编程(map,filter,reduce) 文件处理 迭代器 三元表达式 列表解析与生成器表达式 生成器 匿名函数 lamb ...
- Python全栈开发【面向对象进阶】
Python全栈开发[面向对象进阶] 本节内容: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__geta ...
- Python全栈开发【基础二】
Python全栈开发[基础二] 本节内容: Python 运算符(算术运算.比较运算.赋值运算.逻辑运算.成员运算) 基本数据类型(数字.布尔值.字符串.列表.元组.字典) 其他(编码,range,f ...
- Python全栈开发【基础一】
Python全栈开发[第一篇] 本节内容: Python 的种类 Python 的环境 Python 入门(解释器.编码.变量.input输入.if流程控制与缩进.while循环) if流程控制与wh ...
- python 全栈开发之路 day1
python 全栈开发之路 day1 本节内容 计算机发展介绍 计算机硬件组成 计算机基本原理 计算机 计算机(computer)俗称电脑,是一种用于高速计算的电子计算机器,可以进行数值计算,又可 ...
- Python全栈开发
Python全栈开发 一文让你彻底明白Python装饰器原理,从此面试工作再也不怕了. 一.装饰器 装饰器可以使函数执行前和执行后分别执行其他的附加功能,这种在代码运行期间动态增加功能的方式,称之为“ ...
- 自学Python全栈开发第一次笔记
我已经跟着视频自学好几天Python全栈开发了,今天决定听老师的,开始写blog,听说大神都回来写blog来记录自己的成长. 我特别认真的跟着这个视频来学习,(他们开课前的保证书,我也写 ...
随机推荐
- Dubbo实践(十五)消费者引用服务
Refer取得invoker的过程 <!-- 指定了哪种的注册中心,是基于zookeeper协议的,指定了注册中心的地址以及端口号 --> <dubbo:registry proto ...
- Microsoft Visio / Project professional 2013 官方版本(下载)
Microsoft Visio微软开发的一款软件, 它有助于 IT 和商务专业人员轻松地可视化.分析和交流复杂信息. 它能够将难以理解的复杂文本和表格转换为一目了然的 Visio 图表. 该软件通过创 ...
- node引入bootstrap npm报错
今天node引入bootstrap npm报错 但是页面正常显示 最后发现bootstrap.min.js.map没有放在文件里 虽然不用页面中引入 另外也发现了怎么看这种错误了
- jquery file upload使用
<!-- jquery file upload相关js --> <script src="/js/jquery-file-upload/js/jquery.ui.widge ...
- JanusGraph 图数据库安装小记 ——以 JanusGraph 0.3.0 为例
由于近期项目中有使用图数据的需求,经过对比,我们选择尝试使用 JanusGraph.本篇小记记录了我们安装 JanusGraph 以及需要一起集成的 Cassandra + Elasticsearch ...
- laravel artisan 命令列表
5.4版本新增 命令 说明 备注 php artisan make:resource ? 创建api返回格式化资源 >=5.4版本可用 php artisan make:rule ? 创建val ...
- python教程(八)·文件操作
由于离高考越来越近,博主打算本篇文章过后,暂停本系列教程的更新,等到高考完后再继续本系列教程,请谅解! 这次我们学习用python操作文件,包括文件的读.写等-- 操作文件第一步--打开文件 要想操作 ...
- CTF-安恒19年二月月赛部分writeup
CTF-安恒19年二月月赛部分writeup MISC1-来玩个游戏吧 题目: 第一关,一眼可以看出是盲文,之前做过类似题目 拿到在线网站解一下 ??41402abc4b2a76b9719d91101 ...
- PTA基础编程题目集6-3简单求和 (函数题)
6-3 简单求和 (10 分) 本题要求实现一个函数,求给定的N个整数的和. 函数接口定义: int Sum(int List[],int N) 其中给定整数存放在数组List[]中,正整数N是数组元 ...
- Kettle-6.1安装部署及使用教程
一.Kettle概念 Kettle是一款国外开源的ETL工具,纯java编写,可以在Window.Linux.Unix上运行,绿色无需安装,数据抽取高效稳定. Kettle 中文名称叫水壶,该项目的主 ...