前面内容补充

函数名分应用(第一类对象)

函数名的命名规范与变量命名是一样的
函数名其实就是变量名

函数名可以作为列表中的元素进行存储

例如:

 def func1():
pass
def func2():
pass
def func3():
pass lis = [func1,func2,func3]
for el in lis:
el()

可以作为参数传递给函数,

def func():
pass
def proxy(fu):
fu()
proxy(func)

可以作为函数的返回值

 def func():
def inner():
pass
return inner
ret = func()
ret()

func()()

二   闭包

闭包:  在内层函数中访问外层函数的局部函数的局部变量

简易写法:

def func():
a = 10
def inner():
print(a)
return inner

作用 :

    1   保护你的变量不收外界影响

    2   可以让变量常驻内存

例如:    超简易的爬虫

from urllib.request import urlopen

def outer():
s = urlopen("http://www.xiaohua100.cn/index.html").read() #常驻内存
def getContent():
return s #闭包
return getContent
print("爬取内容")
pa = outer()
ret = pa()
print(ret) 主要体现是闭包的常驻内存 方便以后调用

判断是否为闭包

写法格式:

_closure_

里面的函数名._closure_     如果打印的是None 则不是闭包,  如果打印的不是None   则是闭包

 def outer():
a = 10
def func():
print(a)
print(func.__closure__) # 查看该函数是不是闭包
outer() 结果:
(<cell at 0x000002A3B8817588: int object at 0x000000006AAC6D40>,)

三  迭代器

  使用dir来查看该数据包含了那些方法

例如:

print(dir(list))

结果
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

dir 查看XX类型的数据可以执行哪些方法,  _iter_ () iterable

所有带_iter_  都是可以使用for循环的  可以迭代的对象

可迭代的对象:  Iterable , 里面有_iter_()  可以获取迭代器,没有_next_()

迭代器:  是用来遍历列表,字符串,元组,.......... 可迭代的对象

迭代器 :  Iterator , 里面有 _iter_() 可以获取迭代器  里面还有_next_()  将可迭代对象迭代

s = "我听见冬天的离开,你在某时某刻醒过来"
it = s.__iter__() # 获取迭代器
print(dir(it)) # 迭代器里有__iter__ 还有__next__ 结果
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__length_hint__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__']

迭代器的特点:

1    只能向前

2     惰性机制

3    省内存

for 循环内部机制

1 首先获取到迭代器

2 使用while循环获取数据

3 it._next_()来获取数据

4 处理异常  try:xxx      except StopIteratio:

迭代器模拟for循环

# 迭代器模拟for循环
lis = ["王尼玛","狗哥","熊大","小眼","小猪","胡大宇"]
it = lis.__iter__()
while 1 :
try: # 尝试执行
print(it.__next__()) #获取下一个元素
except StopIteration: # 处理错误
break

判断数据是否是可迭代的, 以及数据是否是迭代器

偏方

lit = ["所以说","永远多长","永远短暂","永远很遗憾","没个人有每个人不同的计算"]
it = lit.__iter__()
print("__iter__" in dir(it))
print("__next__" in dir(it)) 结果 True
True

官方方案

from collections import Iterable  # 可迭代对象
from collections import Iterator # 迭代器 print(isinstance(lit,Iterable))
print(isinstance(lit,Iterator)) print(isinstance(it,Iterable))
print(isinstance(it,Iterator))

list()  也能循环迭代

lit = ["所以说","永远多长","永远短暂","永远很遗憾","每个人有每个人不同的计算"]
it = lit.__iter__()
# list(参数)把参数进行循环迭代
s = list(it) # 在list中,一定存在for,一定有__next__()
print(s) 结果
['所以说', '永远多长', '永远短暂', '永远很遗憾', '每个人有每个人不同的计算']

Python中的闭包与迭代器的更多相关文章

  1. 说说Python中的闭包 - Closure

    转载自https://segmentfault.com/a/1190000007321972 Python中的闭包不是一个一说就能明白的概念,但是随着你往学习的深入,无论如何你都需要去了解这么一个东西 ...

  2. 说说Python中的闭包

    Python中的闭包不是一个一说就能明白的概念,但是随着你往学习的深入,无论如何你都需要去了解这么一个东西. 闭包的概念 我们尝试从概念上去理解一下闭包. 在一些语言中,在函数中可以(嵌套)定义另一个 ...

  3. Python中的闭包 - Closure

    Python中的闭包不是一个一说就能明白的概念,但是随着你往学习的深入,无论如何你都需要去了解这么一个东西. 闭包的概念 我们尝试从概念上去理解一下闭包. 在一些语言中,在函数中可以(嵌套)定义另一个 ...

  4. 21.python中的闭包和装饰器

    python中的闭包从表现形式上定义(解释)为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure). 以下说明主要针对 python ...

  5. 【转】python中的闭包

    转自:http://www.cnblogs.com/ma6174/archive/2013/04/15/3022548.html python中的闭包 什么是闭包? 简单说,闭包就是根据不同的配置信息 ...

  6. python中的生成器、迭代器、闭包、装饰器

    迭代器 迭代是访问集合元素的一种方式.迭代器是一个可以记住遍历的位置的对象.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退. 可迭代对象 以直接作用于 for ...

  7. 轻松理解python中的闭包和装饰器 (下)

    在 上篇 我们讲了python将函数做为返回值和闭包的概念,下面我们继续讲解函数做参数和装饰器,这个功能相当方便实用,可以极大地简化代码,就让我们go on吧! 能接受函数做参数的函数我们称之为高阶函 ...

  8. 轻松理解python中的闭包和装饰器(上)

    继面向对象编程之后函数式编程逐渐火起来了,在python中也同样支持函数式编程,我们平时使用的map, reduce, filter等都是函数式编程的例子.在函数式编程中,函数也作为一个变量存在,对应 ...

  9. Python 中的闭包

    通常来说,函数中的局部变量在函数调用结束的时候不能再被引用,所分配的空间也会被回收. 但是通过闭包这种技术,函数调用结束了,它的局部变量的值还可以保存在闭包里. 试举一例: def make_adde ...

随机推荐

  1. Device Drivers Should Not Do Power Management

    有人对现有的电源管理提出了意见,认为驱动程序不应该做电源管理,paper地址在这里: http://www.ruf.rice.edu/~mobile/publications/xu2014apsys. ...

  2. React 源码剖析系列 - 生命周期的管理艺术

    目前,前端领域中 React 势头正盛,很少能够深入剖析内部实现机制和原理. 本系列文章 希望通过剖析 React 源码,理解其内部的实现原理,知其然更要知其所以然. 对于 React,其组件生命周期 ...

  3. 自适应process组件

    很久没有写博客了,自从工作忙了就忘了学习新东西,真是越大越懒. 做项目中,需要一个process流程的UI组件,翻遍公司组件和业界框架,都没有满足自适应要求的现成的process组件,只能自己实现.实 ...

  4. linux还原svn

    仓库中版本的备份及还原形式主要有两种:方式一:直接备份仓库整个文件夹(全部版本),重装svn程序后直接还原过去.方式二:通过svn命令行备份和还原指定版本号的数据全备份:使用svnadmin hotc ...

  5. 利用aop完成功能权限验证遇到的问题

    报错信息如上,找不到此方法原因是services层的有的方法带了parameters! 解决:注解解析器这里的代码不变:  将得到的service层的class遍历所有方法(存在效率问题) 匹配该方法 ...

  6. jQuery学习_具备吸附功能的拖曳框

    在线演示:http://sandbox.runjs.cn/show/2drrwkrx 关键点:保持一个不变,鼠标拖动时与边框的距离 === 鼠标左击时与边框的距离 源码: <!DOCTYPE h ...

  7. Hibernate中 一 二级缓存及查询缓存(1)

    最近趁有空学习了一下Hibernate的缓存,其包括一级缓存,二级缓存和查询缓存(有些是参照网络资源的): 一.一级缓存     一级缓存的生命周期和session的生命周期一致,当前sessioin ...

  8. Kernel,Shell,Bash 的关系

    Kernel (内核) Kernel 操作系统内核 操作系统内核是指大多数操作系统的核心部分.它由操作系统中用于管理存储器.文件.外设和系统资源的那些部分组成.操作系统内核通常运行进程,并提供进程间的 ...

  9. LA2797 Monster Trap

    题意 PDF 分析 可以考虑建图,跑迷宫. 然后以线段端点,原点,和无穷大点建图,有边的条件是两点连线和墙没有交点. 但是对两个线段的交点处理就会有问题,所以把线段延长.另外还需要判断延长后在墙上,舍 ...

  10. 2.1 一个简单的Web工程例子

    一个简单的Web工程例子 开发环境: Eclipse: Neon Release (4.6.0) JDK:1.8.0_92 Tomcat:8.5.9 Maven:3.3.9 1. 在Eclipse中创 ...