Python中的闭包与迭代器
前面内容补充
函数名分应用(第一类对象)
函数名的命名规范与变量命名是一样的
函数名其实就是变量名
函数名可以作为列表中的元素进行存储
例如:
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中的闭包与迭代器的更多相关文章
- 说说Python中的闭包 - Closure
转载自https://segmentfault.com/a/1190000007321972 Python中的闭包不是一个一说就能明白的概念,但是随着你往学习的深入,无论如何你都需要去了解这么一个东西 ...
- 说说Python中的闭包
Python中的闭包不是一个一说就能明白的概念,但是随着你往学习的深入,无论如何你都需要去了解这么一个东西. 闭包的概念 我们尝试从概念上去理解一下闭包. 在一些语言中,在函数中可以(嵌套)定义另一个 ...
- Python中的闭包 - Closure
Python中的闭包不是一个一说就能明白的概念,但是随着你往学习的深入,无论如何你都需要去了解这么一个东西. 闭包的概念 我们尝试从概念上去理解一下闭包. 在一些语言中,在函数中可以(嵌套)定义另一个 ...
- 21.python中的闭包和装饰器
python中的闭包从表现形式上定义(解释)为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure). 以下说明主要针对 python ...
- 【转】python中的闭包
转自:http://www.cnblogs.com/ma6174/archive/2013/04/15/3022548.html python中的闭包 什么是闭包? 简单说,闭包就是根据不同的配置信息 ...
- python中的生成器、迭代器、闭包、装饰器
迭代器 迭代是访问集合元素的一种方式.迭代器是一个可以记住遍历的位置的对象.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退. 可迭代对象 以直接作用于 for ...
- 轻松理解python中的闭包和装饰器 (下)
在 上篇 我们讲了python将函数做为返回值和闭包的概念,下面我们继续讲解函数做参数和装饰器,这个功能相当方便实用,可以极大地简化代码,就让我们go on吧! 能接受函数做参数的函数我们称之为高阶函 ...
- 轻松理解python中的闭包和装饰器(上)
继面向对象编程之后函数式编程逐渐火起来了,在python中也同样支持函数式编程,我们平时使用的map, reduce, filter等都是函数式编程的例子.在函数式编程中,函数也作为一个变量存在,对应 ...
- Python 中的闭包
通常来说,函数中的局部变量在函数调用结束的时候不能再被引用,所分配的空间也会被回收. 但是通过闭包这种技术,函数调用结束了,它的局部变量的值还可以保存在闭包里. 试举一例: def make_adde ...
随机推荐
- LeetCode OJ:Three Sum(三数之和)
Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all un ...
- OC-文件操作
一.归档NSKeyedArchiver========================== 1.第一种方式:存储一种数据.===================== //归档 //第一种写法 //对象 ...
- Python基础学习(第7天)
第6课 1.循环对象:包括一个next方法,这个方法的目的是进行到下一个结果,结束后抛出StopInteration异常: 当循环结构如for循环调用一个循环对象时,每次循环的时候都会调用next方法 ...
- 【数据库】mysql数据库缓存
配置文件在 /etc/mysql/my.cnf ################### 第一部分:查询数据库缓存相关变量 ################### show variables like ...
- Slice header里面有哪些重要的参数?
first_mb_in_slice:第一个宏块在slice的位置 slice_type:slice的类型 pic_parameter_set_id:slice对应的pps的id frame_num:表 ...
- [置顶]
Android 关于ToolBar分分钟玩死自己?
场景一: 今天早上十点高高兴兴的跟平时早上一样买一杯粥然后一边喝着一边去上班,步行了15分钟到了公司,然后打指纹开门,然后就愉快的写代码了,我擦,好想电脑没开机,我晕好像没带眼镜,发现最近记性不是很好 ...
- Mongodb 的劣势
MongoDB中的数据存放具有相当的随意性,不具有MySQL在开始就定义好了.对运维人员来说,他们可能不清楚数据库内部数据的数据格式,这也会数据库的运维带来了麻烦. 1. 事务关系支持薄弱.这也是所有 ...
- 【英语】Bingo口语笔记(87) - 不要做某事的常见表达
- C#的基类都有哪些方法
之前面试有被问到这个问题,平时没去注意,回答的不好,在此整理一下. 在C#中,个方法,重载的方法没有算进来: 构造函数 ToString()函数 GetHashCode函数 Equals函数 Refe ...
- java多线程:synchronized和lock比较浅析
转载:http://www.toutiao.com/a6392135944652587266/?tt_from=weixin&utm_campaign=client_share&app ...