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()调用执行函数. 请看下 ...
随机推荐
- 【CentOS 6.5】安装gcc-4.8.2和Qt5.2
因为CentOS6.5中gcc版本比较低.安装Qt5.2前先升级gcc. 首先下载gcc,附上百度盘地址:http://pan.baidu.com/s/1jGibvqY 解压安装包,并进入到解压文件夹 ...
- AngularJS学习笔记(2)——与用户交互的动态清单列表
与用户交互的动态清单列表 以我之前写的一个清单列表页面作为例子(MVC模式的清单列表效果),优化前代码如下: <!DOCTYPE html> <html ng-app="t ...
- StrConv 内码转换
StrConv(string,conversion,LCID) string,预转换的字符串了(也可以使用byte数组). Conversion: 是一个整数,只决定转换方式,VB里定义了一些常量,如 ...
- forbidden Derby database starting with weblogic instance
Now doing a new project which choose the newest weblogic 12.1.2.0.0 as web container.But found the ...
- 5月23日Google就宣布了Chrome 36 beta
对于开发人员来说,本次更新的重点还有element.animate().HTML Imports.Object.observe()的引入,以及一个改进后的throttled async touchmo ...
- vim调整粘贴时的文本缩进
解决办法: 1. 在拷贝前输入:set paste (这样的话,vim就不会启动自动缩进,而只是纯拷贝粘贴)2. 拷贝完成之后,输入:set nopaste (关闭paste) 在 Vim 中粘贴文本 ...
- 二叉搜索树的后序遍历序列 (java)
import java.util.*; public class Solution { public boolean VerifySquenceOfBST(int [] sequence) { if( ...
- 记录GOPATH在GOLAND中的坑
首先我的环境已配置好: GO的目录结构是: add.go package calc//函数名必须大写首字母,不然外部包找不到 func Add(a int,b int)(int){ return a+ ...
- JavaScript Math.floor() 方法
定义和用法: floor() 方法可对一个数进行下舍入. 语法: Math.floor(x); x:必须参数,可以是任意数值或表达式: 返回值: 小于等于 x,且与 x 最接近的整数. 说明: flo ...
- 字符编码codecs模块(读写文件)
python对多国语言的处理是支持的很好的,它可以处理现在任意编码的字符,这里深入的研究一下python对多种不同语言的处理.有一点需要清楚的是,当python要做编码转换的时候,会借助于内部的编码, ...