《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() ...
随机推荐
- shell编程学习笔记之特殊变量($0、$1、$2、 $?、 $# 、$@、 $*)
特殊变量($0.$1.$2. $?. $# .$@. $*) shell编程中有一些特殊的变量可以使用.这些变量在脚本中可以作为全局变量来使用. 名称 说明 $0 脚本名称 $1-9 脚本执行时的参数 ...
- linux下使用docker-thunder-xware进行离线下载
1.环境: lsb_release -a hello@jhello:~$ lsb_release -aNo LSB modules are available.Distributor ID: Ubun ...
- Mato的文件管理 (莫队)题解
思路: 莫队模板题,转换几次就是找逆序数,用树状数组来储存数就行了 注意要离散化 代码: #include<queue> #include<cstring> #include& ...
- 关于Spring的配置文件的注解使用
从Spring3.0,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法, 这些方法将会AnnotationConfigApplic ...
- SxsTrace
https://troubleshooter.xyz/wiki/fix-the-application-has-failed-to-start-because-the-side-by-side-con ...
- 解决Ubuntu14.04 下 E: Encountered a section with no Package: header 问题
参考: ubuntu-E:Encountered a section with no Package: header的解决办法 解决Ubuntu14.04 下 E: Encountered a sec ...
- vue-echarts的使用及编译报错解决方法
一. 使用 vue-cli 快速构建vue项目, 引入vue-echarts组件 安装: > npm i vue-echarts --save 修改 webpack.config.js 配置: ...
- ssh 连接不同无线网且IP以及用户名都相同
问题现场及解析 用OpenSSH的人都知ssh会把你每个你访问过计算机的公钥(public key)都记录在~/.ssh/known_hosts. 当下次访问相同计算机时,OpenSSH会核对公钥. ...
- Codeforces 525A - Vitaliy and Pie
525A - Vitaliy and Pie 思路:贪心+hashing. 代码: #include<bits/stdc++.h> using namespace std; string ...
- Python - Cookie绕过验证码登录
前言 有些登录的接口会有验证码:短信验证码,图形验证码等,这种登录的话验证码参数可以从后台获取的(或者查数据库最直接). 获取不到也没关系,可以通过添加cookie的方式绕过验证码. 另一篇博文 P ...