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是我自己定义的一个集合,因为要写 ...
随机推荐
- 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_08 Map集合_10_练习_计算一个字符串中每个字符出现的次数
- Spring学习02——控制反转、依赖注入
有两个人,张三和李四 package com.su.service; public class ZhangSan implements Tester{ public void test(){ Syst ...
- android window(四)WindowToken
在WindowManagerService中有两种常见的Token,WindowToken,和AppWindowToken. WindowToken http://androidxref.com/6. ...
- 【MM系列】SAP MM中物料帐下修改物料的价格
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP 物料帐下修改物料的价格 ...
- 【ABAP系列】SAP VA02修改销售订单的BAPI举例
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP VA02修改销售订单的B ...
- mysql中【update/Delete】update中无法用基于被更新表的子查询,You can't specify target table 'test1' for update in FROM clause.
关键词:mysql update,mysql delete update中无法用基于被更新表的子查询,You can't specify target table 'test1' for update ...
- ubuntu系统下navicat 试用到期解决方案
作者:python技术人 博客:https://www.cnblogs.com/lpdeboke 1.直接删除 /home目录下的 .navicat文件夹(此文件夹隐藏),如果你是64位,文件夹名称可 ...
- Django - Xadmin (五) POP
Django - Xadmin (五) POP 功能及逻辑描述 pop 功能:在添加数据时,对于需要选择的多对多字段,在其 input 框边加上一个按钮,点击该按钮可以实现跳转到添加该字段数据的页面: ...
- 搜索---DFS
DFS 广度优先一层一层遍历,每一层得到的所有新节点,要用队列存储起来以备下一层遍历的时候再遍历. 而深度优先遍历搜索在得到一个新节点时立即对新节点进行遍历:从节点0出发开始遍历,得到新节点6 ...
- 搭建Eclipse+pydev+python2.7.5+django1.5.1+mysql5.0.45平台
mysqldb 下载地址 http://sourceforge.net/projects/mysql-python/ or https://pypi.python.org/pypi/MySQL-pyt ...