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()调用执行函数. 请看下 ...
随机推荐
- TCAM CAM 说明 原理 结构 Verilog 硬件实现
TCAM 三态内容地址查找存储器,CAM内容地址查找存储器.区别在于TCAM多了一级掩码功能,也就是说可以指定某几位是dont care.匹配的时候0,1都行的意思. 广泛应用于数据流处理领域,本文简 ...
- springmvc 数据验证 hibernate-validator --->对象验证
数据验证步骤: 1.测试环境的搭建: 2.验证器的注册 在springmvc.xml配置文件中加以下代码: 3.验证注解添加到对应实体类上 4.修改处理器 5.将验证失败信息写入到表单 index.j ...
- 高分辨率下firefox字体和界面自动放大的问题
电脑是高分屏的情况下,如果我们将DPI调成100%,屏幕字体太小,所以我们经常将DPI设置成125%或者其它,这样屏幕看起来会舒服些.但随之而来的是火狐浏览器的字体界面也会放大, 这也会直接导致我们在 ...
- 克拉 & 24K
[克拉] 克拉(Ct)是宝石的质量(重量)单位,现定1克拉等于0.2克或200毫克.一克拉又分为100分,如50分即0.5克拉,以用作计算较为细小的宝石.因为宝石的密度基本上相同,因此越重的宝石体积越 ...
- mybatis与hibernate不同(重要)
Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句,不过mybatis可以通过XML或注解方式灵活配置要运行的sql语句,并将java对象 ...
- TLB与内存寻址,内存读取,虚拟内存的相关原理
TLB(Translation Lookaside Buffer)转换检测缓冲区是一个内存管理单元,用于改进虚拟地址到物理地址转换速度的缓存. TLB是一个小的,虚拟寻址的缓存,其中每一行都保存着一个 ...
- [SoapUI] 如何让gzip和chunked的response显示出来 [设置Accept-Encoding为deflate]
如果response的Content-Encoding是gzip或者Transfer-Encoding是chunked,在SoapUI里面是无法显示出来的. 解决办法:在Request的Header里 ...
- Java Thread系列(一)线程创建
Java Thread系列(一)线程创建 Java 中创建线程主要有三种方式:继承 Thread.实现 Runnable 接口.使用 ExecutorService.Callable.Future 实 ...
- ADO.NET DataTable的复制(clone)
using (SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=test;Integrated Se ...
- 转:css实现强制不换行/自动换行/强制换行
css实现强制不换行/自动换行/强制换行 [日期:2007-08-22] 来源: 作者: [字体:大 中 小] 强制不换行 div{ white-space:nowrap;} 自动换行 div{ ...