一.函数名的运用

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(迭代器)的更多相关文章

  1. 匹夫细说C#:庖丁解牛迭代器,那些藏在幕后的秘密

    0x00 前言 在匹夫的上一篇文章<匹夫细说C#:不是“栈类型”的值类型,从生命周期聊存储位置>的最后,匹夫以总结和后记的方式涉及到一部分迭代器的知识.但是觉得还是不够过瘾,很多需要说清楚 ...

  2. 轻量级“集合”迭代器-Generator

    Generator是PHP 5.5加入的新语言特性.但是,它似乎并没有被很多PHP开发者广泛采用.因此,在我们了解PHP 7对Generator的改进之前,我们先通过一个简单却显而易见的例子来了解下G ...

  3. C#设计模式-迭代器模式

    一. 迭代器(Iterator)模式 迭代器是针对集合对象而生的,对于集合对象而言,必然涉及到集合元素的添加删除操作,同时也肯定支持遍历集合元素的操作,我们此时可以把遍历操作也放在集合对象中,但这样的 ...

  4. 设计模式(十):从电影院中认识"迭代器模式"(Iterator Pattern)

    上篇博客我们从醋溜土豆丝与清炒苦瓜中认识了“模板方法模式”,那么在今天这篇博客中我们要从电影院中来认识"迭代器模式"(Iterator Pattern).“迭代器模式”顾名思义就是 ...

  5. Python(四)装饰器、迭代器&生成器、re正则表达式、字符串格式化

    本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解 ...

  6. 用struts2标签如何从数据库获取数据并在查询页面显示。最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变量。

    最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变 ...

  7. Java迭代器

    迭代器在其实就是指针,读取集合或者数组中的一个值,读完以后又指向下一条数据. iterator() 迭代器只读,不能改效率要比for循环高 迭代器的一些方法: HasNext() 如果仍有元素可以迭代 ...

  8. Python 生成器与迭代器 yield 案例分析

    前几天刚开始看 Python ,后因为项目突然到来,导致Python的学习搁置了几天.然后今天看回Python 发现 Yield 这个忽然想不起是干嘛用的了(所以,好记性不如烂笔头.).然后只能 花点 ...

  9. 设计模式02迭代器(java)

    先贴代码,有空来写内容. 1.定义集合 import java.util.List; import java.util.ArrayList; //coollection是我自己定义的一个集合,因为要写 ...

随机推荐

  1. centos 6.5 升级openssh-7.5

    1.环境 2.安装telnet 服务,防止ssh升级之后登陆不上服务器,使用telnet 连接服务器 yum install telnet-server -y chkconfig telnet on ...

  2. c# 动态加载tlb为程序集

    private enum RegKind { RegKind_Default = , RegKind_Register = , RegKind_None = } [DllImport("ol ...

  3. vts测试流程

    测试前提: 1.发货user版本 2.selinux:Enable 3.连接ADB,stay awake 4.烧录XXX申请的key 5.外网环境(ipv6) ATV9测试准备(正常准备环境+fast ...

  4. Mac019--Ubuntu上安装Rancher

    首先安装:VisualBox虚拟机. 下载:ubuntu镜像 (ubuntu基于linux的免费开源桌面PC操作系统) ======================================== ...

  5. APM全链路监控--日志收集篇

    一.监控的意义: 随着互联网普及的广度和深度,对于项目的监控显得格外重要:无论是web服务器进程.内存.cpu等资源监控,还是爬虫程序请求频率,状态码以及储存结果的监控,都需要一个及时的反馈机制. 二 ...

  6. IETester——用来测试IE5.5~IE11兼容性的工具

    IETester是一款ie浏览器多版本测试工具,能很方便在ie5.5,ie6,ie7,ie8,ie9,ie10,ie11切换,只需安装一个软件,就可以解决N多ie浏览器的问题,满足大部分IE浏览器兼容 ...

  7. BitMap的原理和实现

    相关概念 基础类型 在java中: byte -> 8 bits -->1字节 char -> 16 bit -->2字节 short -> 16 bits --> ...

  8. 让鼠标滚轮在WINDOWS系统中也和MAC一样滚动(WIN系统鼠标滚轮反向)

    用习惯MAC系统偶尔要用用WINDOWS系统,或者由于各种原因总之时不时需要由MAC转向WIN系统或同时需要两个平台机器上倒腾来倒腾去的同学,一般来说最痛苦的就是鼠标滚轮方向不一致. 基本上我们知道苹 ...

  9. Webpack和Gulp对比

    Webpack和Gulp对比 作者 彬_仔 关注 2016.10.19 22:42* 字数 8012 阅读 2471评论 18喜欢 68 在现在的前端开发中,前后端分离.模块化开发.版本控制.文件合并 ...

  10. Git 出现Branch master set up to track remote branch master问题 与忽略文件上传

    错误:在push 到远程仓库是一直提示下列错误,检查了使用status检查了也没有发现错误,最后排查出来是当前分支为((no branch))即右上那个id (┬_┬)..... 原因:出现这个问题的 ...