day 10 函数名的运用,闭包,迭代器
函数名的本质
函数名本质上就是函数的内存地址
函数名的五种运用:
1、函数名是一个变量
def func():
print(666)
print(func) # 函数的内存地址 <function func at 0x000002B6D2559AE8>
2、函数名可以当做变量赋值
def func():
print(666)
f1 = func
f2 = f1
f2()
3、函数名可以当做容器类数据类型的元素
def func1():
print(111)
def func2():
print(222)
def func3():
print(333)
l1 = [func1, func2 ,func3]
for i in l1:
i()
4、函数名可以当做函数的参数
def func(x): # x == func1
x()
print('in func')
def func1():
print('in func1')
func(func1)
5、函数名可以当做函数的返回值
def func(x): # x ---> func1
return x # func1 def func1():
print('in func1') ret = func(func1) # ret = func1
ret() # func1()
func(func1)() # x() == func1()
满足3,4,5 函数名也称为第一类对象
闭包:
什么是闭包:
def func():
name = 666
print(111)
def func1():
print(name) # 这就是闭包, 内层函数对外层函数(非全局)变量的引用
func1()
func()
1,内层函数对外层函数(非全局)变量的引用。
2,闭包只存在于内层函数中。
3,函数都要逐层返回,最终返回给最外层函数。
def func():
name = 'alex'
def inner():
print(name)
return inner
f = func() # f = inner
f()
闭包的判断
f.__closure__[0].cell_contents 闭包引用的外部变量
def func():
name = 'alex'
age = 19
def inner():
print(name)
print(age)
return inner
f = func() # 定义f,因为f是闭包
# 获取闭包引用的外层变量,如果不是闭包则报错
print(f.__closure__[0].cell_contents) #固定用法 19
print(f.__closure__[1].cell_contents) # alex
闭包有什么用?
闭包:解释器执行程序时,如果遇到函数,随着函数的结束而关闭临时名称空间,但是!!!如果遇到闭包,有一个机制:那么闭包的空间不会随着函数的结束而关闭。
def wrapper(step):
num =1
def inner():
nonlocal num
num += step
print(num) # 输出 4 7 10 13 16
return inner
f = wrapper(3)
j = 0
while j < 5:
f()
j += 1

闭包就是在内存中开一个空间,常贮存一些内容,以便后续程序调用
闭包的应用:
1、装饰器
2、爬虫 迭代对象:
iterable: 可迭代对象
内部含有__iter__方法的就是可迭代对象,遵循可迭代协议
s1 = 'barry'
l1 = [1, 2, 3]
print('__iter__' in dir(s1)) # True 是可迭代对象
可迭代对象不能直接取值(含索引的迭代对象除外) ,需要转换成迭代器才能取值
迭代器
迭代器:内部含有'__iter__'并且含有'__next__'方法的就是迭代器,遵循迭代器协议。
可迭代对象转换成迭代器:
可迭代对象.__iter__()
obj = iter(可迭代对象)
判断一个一个对象是否是迭代器(含iter,next)或迭代对象
方法一: 看__iter__ , __next__ 在不在dir() 里面
s1 = 'abcdefg'
obj = iter(s1) # 将s1转换成迭代器
print('__iter__' in dir(s1)) # True
print('__iter__' in dir(obj)) # True
print('__iter__' in dir(s1) and '__next__' in dir(s1)) # False
print('__iter__' in dir(obj) and '__next__' in dir(obj)) # True
方法二: isinstance(obj, Iterable/Iterator)
s1 = 'abcdefg'
obj = iter(s1) # 将s1转换成迭代器
from collections import Iterable # 迭代对象
from collections import Iterator # 迭代器
print(isinstance(obj,Iterator)) # 判断obj是否为迭代器 True
print(isinstance(obj,Iterable)) # 判断obj是否为可迭代对象 True
print(isinstance(s1,Iterator)) # 判断obj是否为迭代器 False
print(isinstance(s1,Iterable)) # 判断obj是否为可迭代对象 True
迭代器取值
s2 = [1, 2, 3]
obj = iter(s2)
print(obj.__next__()) # 方法一
print(next(obj)) # 方法二
type() isinstance()区别?
# type()只是判断该对象的数据类型
# isinstance()不仅可以判断该对象的数据类型,而且可以判断其他很多 迭代器的作用:
1、节省内存
2、惰性机制 (netx())一下,出一个值
3、一条路走到黑,不走回头路 While循环模拟for循环机制
l1 = [i for i in range(10)]
obj = iter(l1)
while 1:
try: # 试一试,如果报错就执行下面的命令
print(next(obj))
except StopIteration:
break
day 10 函数名的运用,闭包,迭代器的更多相关文章
- 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.函数名的使用和第一类对象 函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数 函数对象可以像变量一样进行赋值,还可以作为列表的元素进行使用,可以作为返回值返回,可以作为参数进行传递 1 ...
- python学习之生函数名的理解
4.4.10 函数名的应用 函数名就是一个特殊的变量,后边跟上()之后可以执行函数: 1.作为一个变量使用 def func(): print('123') f1 = func f2 = f1 f1( ...
- Python函数二(函数名,闭包,迭代器)之杵臼之交
函数名的使用: 函数名可以作为值,赋值给变量. 函数名可以作为参数传参给函数. 函数名可以作为返回值. 函数名可以作为元素存储在容器里. 闭包:在嵌套函数内,使用外层局部变量(非全局变量)就是一个闭包 ...
- Python基础之 函数名,闭包,和迭代器
1.函数名作用 函数名本质上就是函数的内存地址或对象. 1.可以被引用 2.可以被当作容器类型的元素 3.可以当作函数的参数和返回值 4.如果记不住的话,那就记住一句话,就当普通变量用 2.闭包 什么 ...
随机推荐
- Socket buffer 调优相关
http://www.man7.org/linux/man-pages/man7/tcp.7.html The maximum sizes for socket buffers declared vi ...
- 尚硅谷springboot学习20-web开发简介
使用SpringBoot 1).创建SpringBoot应用,添加我们需要的模块: 2).SpringBoot已经默认将这些场景配置好了,只需要在配置文件中指定少量配置就可以运行起来 3).自己编写业 ...
- NGUI 背景图自适应
背景图UISprite组件调整如下: UIRoot设置: 不保持比例自适应: 保持宽与屏幕宽一致,高度随宽的缩放比例进行缩放:
- [Linux]Ubuntu下安装Sublime-text 且 支持中文输入
------------------------------------------------------------------------------------------ 首先进行如下操作: ...
- 一个神奇的BUG :Failed to finalize session : INSTALL_FAILED_INVALID_APK: /data/app/vmdl99393454.tmp/10_slice__ signatures are inconsistent
Android Studio 在Gradle编译完成后安装APK时总是失败,EventLog提示如下信息: Failed to finalize session : INSTALL_FAILED_IN ...
- angularjs中安卓原生APP调用H5页面js函数,js写法应注意
安卓原生app调用js方法,js方法应写在html下的script标签内,不能有任何function包裹,例如angular的controller层,这样APP也是获取不到的: 所以只有放在html中 ...
- 在服务器上同时启动多个tomcat
我所用Tomcat服务器都为zip版,非安装版.以两个为例:安装第二个Tomcat完成后,到安装目录下的conf子目录中打开server.xml文件,查找以下三处:(1) 修改http访问端口(默认为 ...
- C++学习二继承
转载自https://www.cnblogs.com/33debug/p/6666939.html 1.继承与派生 继承是使代码可以复用的重要手段,也是面向对象程序设计的核心思想之一.简单的说,继承 ...
- 学JS的心路历程-Promise(二)
昨天有说到Promise的创建以及then的用法,今天我们来看错误处理. then onRejected 我们昨天有提到说,then两个函式参数,onFulfilled和onRejected,而onR ...
- hdu3826-Squarefree number-(欧拉筛+唯一分解定理)
Squarefree number Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...