Python_010(迭代器)
一.函数名的运用
1.函数名的内存地址
def func():
print("英雄联盟")
print(func)
#输出结果:
<function func at 0x00000299E4C62E18>
#证明这个函数名func就是一块内存地址
若func直接赋值给a,则a也指向这块内存地址,所以a()进行了函数调用,执行a()结果为"英雄联盟"
2.函数名当做容器类的元素
def func1():
print("吃")
def func2():
print("喝")
def func3():
print("拉")
lst = [func1,func2,func3]
for i in lst:
i()
#输出结果:
吃 喝 拉
a:当列表中的元素func1改为func1()时,会牵扯到返回值的问题
def func1():
print("吃")
def func2():
print("喝")
def func3():
print("拉")
lst = [func1(),func2(),func3()]
print(lst)
#输出结果
吃 喝 拉
[None, None, None] #看这里
每一个函数都会被执行,但是返回值都为空;
b:函数可以作为参数,传递给另一个函数:
def func(fn):
fn()
def gn():
print("穿靴子的猫")
func(gn)
#输出结果
穿靴子的猫
c:函数也可以作为返回值被执行;所以综上函数就是一个变量;
3.闭包
a:闭包的概念:内层函数,对外层函数(非全局)的变量的引用,叫闭包;
代码展示:
def func():
name = "alex"
print(1111)
def gn():
print(name)
return gn
ret = func()
ret() #这里是直接调用了gn函数,因为输出结果表示没有执行print(111)
ret() #所以直接调用gn的时候,如果外部函数的变量name被清除,那将会报错
ret() #所有外层函数name会常驻内存;
#输出结果
1111
alex
alex
alex
#爬虫的一个小程序
from urllib.request import urlopen
def but():
content = urlopen("http://www.xiaohua100.cn/index.html").read()
def get_contend():
return content
print(get_contend.__closure__) #这句话是判断该函数是不是闭包
return get_contend
fn = but()
content = fn()
print(content) content2 = fn()
print(content2)
#如果输出None,则表示它不是闭包,
若是,则输出一串地址:(<cell at 0x0000025ED7A88678: bytes object at 0x0000025ED7E95330>,)
二.迭代器
1.可迭代对象:list,str,tuple,set,f,dict,这几个对象当中,都有一个函数__iter__()
a:可以用dir方法查看数据类型包含了哪些东西;格式:print(dir(数据类型))
print("__iter__" in dir(list))
print("__iter__" in dir(tuple))
print("__iter__" in dir(str))
print("__iter__" in dir(dict))
print("__iter__" in dir(set))
print("__iter__" in dir(int)) #不可迭代对象
#输出结果:
True
True
True
True
True
False
b:迭代器和可迭代对象的区别
l = [1,2,3]
it = l.__iter__() #it为迭代器
from collections import Iterable #导入模块
from collections import Iterator
print(isinstance(l,Iterator)) #判断是否是迭代器
print(isinstance(l,Iterable)) #判断是否是可迭代对象
print(isinstance(it,Iterator))
print(isinstance(it,Iterable))
#输出结果
False
True
True
True
迭代器,内部包含了一个函数__next__(),相当于一个班的班长,负责让学生一个一个的出来;
它有个惰性机制,就是你开始让学生出去了,班长才开始一个一个的喊,你没喊开始,学生就一直在
班级里面,虽然程序已经写出来了,但是就是放在那,等你喊开始;
b:for循环的一个模拟:内部是如何执行的
ls = [1,2,3]
it = ls.__iter__()
while 1:
try:
count = it.__next__() #如果你没有下面的输出语句,这一句话是不会被执行的,惰性机制
print(count)
except StopIteration:
break
#输出结果;1,2,3
1)先利用可迭代对象得到迭代器, 2)然后再利用.__next__()执行可迭代对象,把值赋给变量;
c:迭代器的特点;节省内存,惰性机制,不能反复,只能向下执行;
#迭代器和while循环的最大区别就是惰性机制;
Python_010(迭代器)的更多相关文章
- 匹夫细说C#:庖丁解牛迭代器,那些藏在幕后的秘密
0x00 前言 在匹夫的上一篇文章<匹夫细说C#:不是“栈类型”的值类型,从生命周期聊存储位置>的最后,匹夫以总结和后记的方式涉及到一部分迭代器的知识.但是觉得还是不够过瘾,很多需要说清楚 ...
- 轻量级“集合”迭代器-Generator
Generator是PHP 5.5加入的新语言特性.但是,它似乎并没有被很多PHP开发者广泛采用.因此,在我们了解PHP 7对Generator的改进之前,我们先通过一个简单却显而易见的例子来了解下G ...
- C#设计模式-迭代器模式
一. 迭代器(Iterator)模式 迭代器是针对集合对象而生的,对于集合对象而言,必然涉及到集合元素的添加删除操作,同时也肯定支持遍历集合元素的操作,我们此时可以把遍历操作也放在集合对象中,但这样的 ...
- 设计模式(十):从电影院中认识"迭代器模式"(Iterator Pattern)
上篇博客我们从醋溜土豆丝与清炒苦瓜中认识了“模板方法模式”,那么在今天这篇博客中我们要从电影院中来认识"迭代器模式"(Iterator Pattern).“迭代器模式”顾名思义就是 ...
- Python(四)装饰器、迭代器&生成器、re正则表达式、字符串格式化
本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解 ...
- 用struts2标签如何从数据库获取数据并在查询页面显示。最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变量。
最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变 ...
- Java迭代器
迭代器在其实就是指针,读取集合或者数组中的一个值,读完以后又指向下一条数据. iterator() 迭代器只读,不能改效率要比for循环高 迭代器的一些方法: HasNext() 如果仍有元素可以迭代 ...
- Python 生成器与迭代器 yield 案例分析
前几天刚开始看 Python ,后因为项目突然到来,导致Python的学习搁置了几天.然后今天看回Python 发现 Yield 这个忽然想不起是干嘛用的了(所以,好记性不如烂笔头.).然后只能 花点 ...
- 设计模式02迭代器(java)
先贴代码,有空来写内容. 1.定义集合 import java.util.List; import java.util.ArrayList; //coollection是我自己定义的一个集合,因为要写 ...
随机推荐
- centos 6.5 升级openssh-7.5
1.环境 2.安装telnet 服务,防止ssh升级之后登陆不上服务器,使用telnet 连接服务器 yum install telnet-server -y chkconfig telnet on ...
- c# 动态加载tlb为程序集
private enum RegKind { RegKind_Default = , RegKind_Register = , RegKind_None = } [DllImport("ol ...
- vts测试流程
测试前提: 1.发货user版本 2.selinux:Enable 3.连接ADB,stay awake 4.烧录XXX申请的key 5.外网环境(ipv6) ATV9测试准备(正常准备环境+fast ...
- Mac019--Ubuntu上安装Rancher
首先安装:VisualBox虚拟机. 下载:ubuntu镜像 (ubuntu基于linux的免费开源桌面PC操作系统) ======================================== ...
- APM全链路监控--日志收集篇
一.监控的意义: 随着互联网普及的广度和深度,对于项目的监控显得格外重要:无论是web服务器进程.内存.cpu等资源监控,还是爬虫程序请求频率,状态码以及储存结果的监控,都需要一个及时的反馈机制. 二 ...
- IETester——用来测试IE5.5~IE11兼容性的工具
IETester是一款ie浏览器多版本测试工具,能很方便在ie5.5,ie6,ie7,ie8,ie9,ie10,ie11切换,只需安装一个软件,就可以解决N多ie浏览器的问题,满足大部分IE浏览器兼容 ...
- BitMap的原理和实现
相关概念 基础类型 在java中: byte -> 8 bits -->1字节 char -> 16 bit -->2字节 short -> 16 bits --> ...
- 让鼠标滚轮在WINDOWS系统中也和MAC一样滚动(WIN系统鼠标滚轮反向)
用习惯MAC系统偶尔要用用WINDOWS系统,或者由于各种原因总之时不时需要由MAC转向WIN系统或同时需要两个平台机器上倒腾来倒腾去的同学,一般来说最痛苦的就是鼠标滚轮方向不一致. 基本上我们知道苹 ...
- Webpack和Gulp对比
Webpack和Gulp对比 作者 彬_仔 关注 2016.10.19 22:42* 字数 8012 阅读 2471评论 18喜欢 68 在现在的前端开发中,前后端分离.模块化开发.版本控制.文件合并 ...
- Git 出现Branch master set up to track remote branch master问题 与忽略文件上传
错误:在push 到远程仓库是一直提示下列错误,检查了使用status检查了也没有发现错误,最后排查出来是当前分支为((no branch))即右上那个id (┬_┬)..... 原因:出现这个问题的 ...