《Python》 函数嵌套、闭包和迭代器
一、函数的嵌套:
1、函数的嵌套调用
def max2(x,y):
m = x if x>y else y
return m def max4(a,b,c,d):
res1 = max2(a,b)
res2 = max2(res1,c)
res3 = max2(res2,d)
return res3 # max4(23,-7,31,11) 函数的嵌套调用
函数的嵌套调用
2、函数的嵌套定义
3、函数的作用域链:小范围作用域可以使用大范围的变量,但是反之不行,他是单向的。
def f1():
a = 1
def f2():
def f3():
print(a)
f3()
f2() f1()
################
def f1():
a = 1
def f2():
a = 2
f2()
print('a in f1 : ',a) f1() 作用域链应用举例
作用域链应用举例
二、 函数名的本质
1、函数名就是函数的地址
print(func)
2、函数名可以作为变量
def func1():
print(666)
f1 = func1
f2 = f1
f2()
3、函数名可以作为函数的参数
def func():
print(666)
def func1():
func()
def func2(x):
x()
func2(func1)
4、函数名可以当做函数的返回值
def wraaper():
def inner():
print('inner ')
return inner
ret = wraaper() # inner
ret() # inner()
5、函数名可以作为容器类类型的元素
def func1():
print('in func1') def func2():
print('in func2') def func3():
print('in func3') def func4():
print('in func4')
l1 = [func1,func2,func3,func4]
for i in l1:
i()
向上面的函数名这种,第一类对象
第一类对象(first-class object)指
1.可在运行期创建
2.可用作函数参数或返回值
3.可存入变量的实体。
globals() 和 locals()
globals():返回全局变量的一个字典
locals():返回当前位置的局部变量的字典
三、闭包
内层函数对外层函数的变量(非全局变量)的引用,并返回,就这样形成了闭包。
def wrapper():
name='alex'
def inner():
print(name)
inner()
return inner
wrapper()
闭包的作用:
当程序执行时,遇到了函数执行,他会在内存中开辟一个局部名称空间,如果这个函数内部形成了闭包,那么他就不会随着函数的结束而消失。
#输出的__closure__有cell元素 :是闭包函数
def func():
name = 'eva'
def inner():
print(name)
print(inner.__closure__)
return inner f = func()
f() #输出的__closure__为None :不是闭包函数
name = 'egon'
def func2():
def inner():
print(name)
print(inner.__closure__)
return inner f2 = func2()
f2()
判断闭包函数的方法__closure__
def wrapper():
money = 1000
def func():
name = 'eva'
def inner():
print(name,money)
return inner
return func f = wrapper()
i = f()
i() 闭包嵌套
闭包嵌套
from urllib.request import urlopen def index():
url = "http://www.xiaohua100.cn/index.html"
def get():
return urlopen(url).read()
return get xiaohua = index()
content = xiaohua()
print(content) 闭包函数获取网络应用
闭包函数获取网络应用
四、迭代器
1、可迭代对象:str,list,dict,tuple,set,range()
2、对象内部含有__iter__方法就是可迭代对象
3、可迭代对象满足可迭代协议
判断一个对象是否是可迭代对象:
第一种方法:print ('__iter__' in dir (s1))
第二种方法:from collcetions import iterable可迭代对象/Iterator迭代器
print(isinstanse)('alex',Iterable)
print(isinstanse)('alex',Iterator)
迭代器:对象内部含有__iter__方法且含有__next__方法就是迭代器
可迭代对象vs迭代器
可迭代对象不能取值,迭代器是可以取值的,但是可迭代对象可以转化成迭代器
lis=[1,2,3]
itrl=lis.__iter__()
print(itrl.__next__())
迭代器如何取值:__next__一次取一个值
可迭代对象和迭代器的区别:
(1)可迭代对象不能取值,迭代器可以
(2)迭代器非常节省内存
(3)迭代器每次只会取一个值
(4)迭代器是单向的,不回头
for 循环:
将可迭代对象转化成迭代器
调用__next__方法取值
利用异常处理停止报错
s1 = 'kfdsjl'
iter1 = s1.__iter__()
while 1:
try:
print(iter1.__next__())
except StopIteration:
break
《Python》 函数嵌套、闭包和迭代器的更多相关文章
- 孤荷凌寒自学python第十九天python函数嵌套与将函数作为返回对象及闭包与递归
孤荷凌寒自学python第十九天python函数嵌套与将函数作为返回对象及闭包与递归 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) Python函数非常的灵活,今天学习了python函数的以 ...
- 第十七篇 Python函数之闭包与装饰器
一. 装饰器 装饰器:可以拆解来看,器本质就是函数,装饰就是修饰的意思,所以装饰器的功能就是为其他函数添加附加功能. 装饰器的两个原则: 1. 不修改被修饰函数的源代码 2. 不修改被修饰函数的调用方 ...
- Python基础之 函数名,闭包,和迭代器
1.函数名作用 函数名本质上就是函数的内存地址或对象. 1.可以被引用 2.可以被当作容器类型的元素 3.可以当作函数的参数和返回值 4.如果记不住的话,那就记住一句话,就当普通变量用 2.闭包 什么 ...
- python基础 (函数名,闭包,和迭代器)
1.函数名作用 函数名本质上就是函数的内存地址或对象. 1.可以被引用 2.可以被当作容器类型的元素 3.可以当作函数的参数和返回值 4.如果记不住的话,那就记住一句话,就当普通变量用 2.闭包 什么 ...
- python之函数名,闭包、迭代器
一.函数名的运用(第一类对象) 函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数的变量. 1,函数名的内存地址: def func(): print("呵呵") pr ...
- Py修行路 python基础 (九)作用域 函数嵌套 闭包
名称空间与作用域 变量,函数 分成三种 #内置名称空间 内置函数, 系统函数内部自定义的. python查看内置函数,命令: import builtins dir(builtins) #全局名称空 ...
- python全栈 函数名 闭包及迭代器
1,函数名的运用 2.闭包 3.迭代器 一.函数名的运用 1.函数名的命名规范和变量是一样的 函数名其实就是变量名 (1)函数名的内存地址 例: def func(): print("ale ...
- python函数之闭包函数与无参装饰器
一.global与nonlocal #global x = 1 def f1(): global x # 声明此处是全部变量x x = 2 print(x) f1() # 调用f1后,修改了全局变量x ...
- python函数中闭包的概念说明
函数中闭包的概念说明 闭包: 内层函数对外层函数非全局变量的引用,就叫做闭包 判断闭包方法 ._closure_ : 执行后返回有效信息就是闭包,返回none就不是闭包 举例1: 是闭包 def wr ...
- Python中的闭包与迭代器
前面内容补充 函数名分应用(第一类对象) 函数名的命名规范与变量命名是一样的函数名其实就是变量名 函数名可以作为列表中的元素进行存储 例如: def func1(): pass def func2() ...
随机推荐
- 【分词器及自定义】Elasticsearch中文分词器及自定义分词器
中文分词器 在lunix下执行下列命令,可以看到本来应该按照中文”北京大学”来查询结果es将其分拆为”北”,”京”,”大”,”学”四个汉字,这显然不符合我的预期.这是因为Es默认的是英文分词器我需要为 ...
- BZOJ2819: Nim 树链剖分
Description 著名游戏设计师vfleaking,最近迷上了Nim.普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任意多个,可以取完,但不可以不取.谁不能取谁输.这个游 ...
- 到底二级域名和一级域名哪个更利于SEO
到底二级域名和一级域名哪个更利于SEO呢?本文是从百度官方转载详细的介绍:二级域名和一级域名的区别,请各位认真阅读. 二级域名和子域名的区别可以通过以下3点来解读: 一,二级域名的特点 搜索引擎往往将 ...
- Codeforces Round #305 (Div. 2) D. Mike and Feet 单调栈
D. Mike and Feet time limit per test 1 second memory limit per test 256 megabytes input standard inp ...
- NIO 之 ByteBuffer
前言 对于刚接触ByteBuffer人来说,想要完全理解会稍微有点困难,正巧前几天有人问我,想到好久没写文章,就整理一下. 概念理解 对于ByteBuffer的一些概念不理解的情况下,如果直接打开源码 ...
- git/ssh备查文档
配置多个ssh key: 待更新 git速查表: git remote set-url origin(远程仓库名称) https://xxxxx/ProjectName.git 从ssh切换至htt ...
- Yii 语言设置 中文提示信息
1. 在main.php配置文件中加入 'language'=>'zh_cn', 注: 在URL中追加参数lang=zh_cn即可实现中文 2. 在Controller方法中添加 publi ...
- LeetCode--176--第二高的薪水
问题描述: 编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) . +----+--------+ | Id | Salary | +----+--------+ | 1 ...
- Java基础-this关键字和构造方法(10)
this关键字 方法被哪个对象调用,this就代表那个对象当局部变量隐藏成员变量时,使用this关键字(例如构造方法和访问器). 构造方法 构造方法作用概述 给对象的数据进行初始化 构造方法格式 方法 ...
- Mr. Kitayuta vs. Bamboos CodeForces - 505E (堆,二分答案)
大意: 给定$n$棵竹子, 每棵竹子初始$h_i$, 每天结束时长$a_i$, 共$m$天, 每天可以任选$k$棵竹子砍掉$p$, 若不足$p$则变为0, 求$m$天中竹子最大值的最小值 先二分答案转 ...