python--函数名的使用,闭包,迭代器
1.函数名的使用和第一类对象
函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数
函数对象可以像变量一样进行赋值,还可以作为列表的元素进行使用,可以作为返回值返回,可以作为参数进行传递
1.函数名的内存地址
def func():
print("呵呵")
print(func)
结果:
<function func at 0x1101e4ea0>
2.函数名可以赋值给其他变量
def func():
print("呵呵")
print(func) a = func # 把函数当成⼀一个变量量赋值给另⼀一个变量量
a() # 函数调⽤用 func()
3.函数名可以当作容器类的元素
def func1():
print("呵呵")
def func2():
print("呵呵")
def func3():
print("呵呵")
def func4():
print("呵呵") lst = [func1, func2, func3]
for i in lst:
i()
4.函数名可以当作函数的参数
def func():
print("吃了么") def func2(fn):
print("我是func2")
fn() # 执行传递过来的fn
print("我是func2") func2(func) # 把函数func当成参数传递给func2的参数fn.
5.函数名可以作为函数的返回值
def func_1():
print("这里是函数1")
def func_2():
print("这里是函数2")
print("这里是函数1")
return func_2 fn = func_1() # 执行函数1. 函数1返回的是函数2, 这时fn指向的就是上面函数2
fn() # 执行上面返回的函数
2.闭包
闭包就是内层函数,对外层函数(非全局)变量的引用
通过代码查看一个闭包:
__closure__来检测是否闭包,返回cell就是闭包,返回none就不是闭包
检测闭包:
def func1():
a = 10
def func2():
return a
func2()
print(func2.__closure__) func1()
#(<cell at 0x00000215A5977498: int object at 0x0000000076EC6D30>,) 这个就是闭包
在函数外部调用内部函数:
def outer():
def inner():
print('我是内部函数')
return inner
a = outer() # 访问外部函数, 获取到内部函数的函数地址
a() # 访问内部函数 # 我是内部函数
闭包的好处:
1.保护变量不被侵害
2.让一个变量常驻内存
下面的这个爬虫的代码就用到了闭包的好处
from urllib.request import urlopen def but():
content = urlopen("www.dytt.com").read()
def get_content():
return content
return get_content fn = but() # 这时就在加载内容了
#后面需要用到这里面的内容就不需要在执行非常耗时的网络连接操作了
c1 = fn() # 获取内容
print(c1) c2 = fn() # 重新获取内容
print(c2)
由它我们可以引出闭包的好处. 由于我们在外界可以访问内部函数. 那这个时候内部函数访问的时间和时机就不一定了, 因为在外部, 我可以选择在任意的时间去访问内部函数. 这个时候.如果⼀个函数执行完毕. 则这个函数中的变量以及局部命名空间中的内容都将会被销毁. 在闭包中. 如果变量被销毁了. 那内部函数将不能正常执行. 所以. python规定. 如果你在内部函数中访问了外层函数中的变量. 那么这个变量将不会消亡.将会常驻在内存中. 也就是说. 使用闭包, 可以保证外层函数中的变量在内存中常驻.
3.迭代器
Iterable: 可迭代对象.内部包含__iter__()函数
Iterator: 迭代器. 内部包含__iter__() 同时包含 __next__()
迭代器的特点:
1. 省内存
2. 惰性机制
3. 只能向前, 不能后退
判断迭代器和可迭代对象的方案
1. _iter_函数判断可迭代的, dir(数据):返回这个数据可以执行的所有操作
s = 'abc'
print(dir(s)) # 打印对象中的方法和函数
print(dir(str)) # 打印类中声明的方法和函数
在打印结果中,寻找__iter__如果能找到. 那么这个类的对象就是一个可迭代对象
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__',
'__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__',
'__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__',
2. __iter__ , __next__ 迭代器
官方的判断迭代器的方法:
from collections immport Iterable ,Iterator isinstance(对象,Iterable)是否是可迭代的
isinstance(对象,iterator)是否是迭代器
l = [1,2,3]
l_iter = l.__iter__()
from collections import Iterable,Iterator print(isinstance(l,Iterable)) # True
print(isinstance(l,Iterator)) # False print(isinstance(l_iter,Iterable)) # True
print(isinstance(l_iter,Iterator)) # True
使用isinstance判断示例
使用while模拟for循环:
迭代器每次通过__next__() 来完成的,当程序遇到StopIteration将结束循环
模拟for循环
lst= []
it = lst.__iter__()
while 1:
try:
it.__next__()
except StopIteration:
break
python--函数名的使用,闭包,迭代器的更多相关文章
- day12 python函数名的应用 闭包 迭代器
day12 python 一.函数名的应用(是第一类对象) 函数名的命名规范和变量是一样的 函数名其实就是变量名 def func(): print('i am funct ...
- 【学习笔记】--- 老男孩学Python,day12 函数名的应用,闭包,迭代器
1, 函数名的应用,第一类对象 函数名可以像变量一样进行使用 1.赋值 def func(): print("你吃了么?") # print(func) # a = func # ...
- day 12 函数名的应用 闭包 迭代器
今日主要内容 1, 函数名的应用,第一类对象 函数名可以像变量一样进行使用 #再函数名后面添加() 才是对函数的调用, 否则打印的是函数的内存地址 1.赋值 2.作为list元素 3.作为参数 d ...
- 11.Python初窥门径(函数名,可迭代对象,迭代器)
Python(函数名,可迭代对象,迭代器) 一.默认参数的坑 # 比较特殊,正常来说临时空间执行结束后应该删除,但在这里不是. def func(a,l=[]): l.append(a) return ...
- python基础之函数名的使用,闭包以及迭代器
内容梗概: 1. 函数名的使⽤用以及第⼀一类对象 2. 闭包 3. 迭代器 1.函数名一. 函数名的运⽤.函数名是一个变量, 但它是⼀个特殊的变量, 与括号配合可以执行函数的变量.1.1 函数名的内存 ...
- python 函数名的应用(第一类对象),闭包,迭代器
1.函数名的应用(第一类对象) 函数名的命名规范和变量是一样的 函数名其实就是变量名 可以作为列表中的元素进行储存. def func1(): pass def func2(): pass lst = ...
- python函数名的应用、闭包和迭代器
一.函数名的应用(第一类对象) 函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数变量. 1.函数名的内存地址 def func(): print("哈哈") prin ...
- python 函数名 、闭包 装饰器 day13
1,函数名的使用. 函数名是函数的名字,本质就是变量,特殊的变量.函数名()加括号就是执行此函数. 1,单独打印函数名就是此函数的内存地址. def func1(): print(555) print ...
- python 函数名,闭包
1.函数名字的应用 函数名是什么? 函数名是函数的名字,本质:变量,特殊变量 函数名+() ———>执行此函数: 2.函数名的赋值: def func2(): print(44) f = fun ...
- Python函数名做参数,闭包,装饰器
简单讲解闭包的写法和应用,在这之前,先声明,你定义的任意一个函数都可以作为其他函数的参数.就像下面这段代码的参数func,接收的参数就是一个函数名,在函数体内部使用了func()调用执行函数. 请看下 ...
随机推荐
- 25.OGNL与ValueStack(VS)-集合对象进阶
转自:https://wenku.baidu.com/view/84fa86ae360cba1aa911da02.html 首先在LoginAction中增加如下字段并提供相应的get/set方法: ...
- 迷你MVVM框架 avalonjs 0.98发布
在本版本中,avalon侧重于对组件开发的支持,可用控件达到12个,末来将大力投入对GRID,TREE等重型UI的开发中. 添加ms-widget绑定,废弃ms-ui绑定 为ms-include添加跨 ...
- blocking network call
[blocking network call] 阻塞的网络调用: 1.gethostbyname(): does not return until it has succeeded or failed ...
- 10-SSH综合案例:前台用户模块:邮箱服务器配置
之前发邮件是自己发到服务器还是?是自己搭建一个还是注册一个163啊?自己可以搭建一个邮箱的服务器然后去发送邮件.就是你必须得在这上面有了账户才能发,你也可以往网络上发.你的主机就是一台邮箱服务器了.你 ...
- 🔸RU大神手册上要再“做”的题🔸
- html符号转换
通常情况下,HTML会自动截去多余的空格.不管你加多少空格,都被看做一个空格.比如你在两个字之间加了10个空格,HTML会截去9个空格,只保留一个.为了在网页中增加空格,你可以使用 表示空格.最常用的 ...
- 解决Error running 'index.jsp : Address localhost:1099 is already in use的方法
晚上在idea中 启动服务器一次后 正常运行,但是改了注解配置后 报错,报错为Error running 'index.jsp : Address localhost:1099 is alread ...
- Web图片编辑控件升级日志-Xproer.ImageEditor
版权所有 2009-2014 荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com 产品首页:http://www.ncmem.com/webplug/image-e ...
- RocketMQ服务器监控误区
请不要监控10912端口 case: result: 监控10912端口会导致HAService异常,新起线程,吃掉内存,无限次监控虚拟机将宕机! 时间上是直接因果关系. 监控10911 和 9876 ...
- SpringMVC源码解读 - HandlerMapping
SpringMVC在请求到handler处理器的分发这步是通过HandlerMapping模块解决的.handlerMapping 还处理拦截器. 先看看HandlerMapping的继承树吧 可以大 ...