一.函数名的运用

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. git总览

    git客户端官网:https://git-scm.com/ 下载对应版本安装 服务器安装git 安装依赖:yum install -y curl-devel expat-devel gettext-d ...

  2. GIt 添加到远程

    转载:https://www.liaoxuefeng.com/wiki/896043488029600/898732864121440 添加到远程 1.注册/登录 GitHub(https://git ...

  3. [Git] 004 初识 Git 与 GitHub 之查看历史记录

    在 GitHub 的 UI 界面使用 Git 查看历史纪录 1. 右侧有个 history 2. 点击后跳转页面 3. 点击相应标题(commit 时写的),进入相应版本(历史) 4. 我选择了 I ...

  4. Samba服务问答

    1. samba服务用在什么地方?samba服务用于把Linux服务器上的文件或者打印接共享给windows或者Linux. 2. 在samba服务的配置文件中,[global]配置部分的securi ...

  5. HDFS-HA高可用工作机制

    1.HDFS-HA概述 1)所谓HA(high available),即高可用(7*24小时不中断服务). 2)实现高可用最关键的策略是消除单点故障.HA严格来说应该分成各个组件的HA机制:HDFS的 ...

  6. java_第一年_JDBC(7)

    Commons-dbutils是一个开源的JDBC工具类库,对JDBC进行封装,简化编码的工作量,包含的API: org.apache.commons.dbutils.QueryRunner org. ...

  7. 一个完整的http请求响应过程

    一. HTTP请求和响应步骤   图片来自:理解Http请求与响应 以上完整表示了HTTP请求和响应的7个步骤,下面从TCP/IP协议模型的角度来理解HTTP请求和响应如何传递的. 二.TCP/IP协 ...

  8. 13 个设计 REST API 的最佳实践

    原文 RESTful API Design: 13 Best Practices to Make Your Users Happy 写在前面 之所以翻译这篇文章,是因为自从成为一名前端码农之后,调接口 ...

  9. latex算法步骤如何去掉序号

    想去掉latex算法步骤前面的序号,如下 我想去掉每个算法步骤前面的数字序号,1,2,3,因为我已经写了step.我们只需要引用a lgorithmic这个包就可以了,代码如下: \usepackag ...

  10. vue项目中使用高德地图(根据坐标定位点)

    前言 项目中需要根据坐标定位,将自己的实现过程写下来,废话不多说,上代码 正文 <script> var map,marker; export default { data(){ retu ...