一:函数对象

函数是第一类对象,即表示函数可以当做数据传递

可以被引用:把函数内存地址赋值给一个变量名,仍然遵循函数的调用规则。

可以被当做参数传递:传递的是函数的运行的结果#可以当做返回值 把函数作为返回值返回的话,返回的结果是函数的内存地址。

可以当做容器类型的元素:意思就是可以作为列表和字典的元素利用函数的特性,可以取代多分枝的if。

示例:

def auth():
print("登陆......") def register():
print("注册.......") def seach():
print("查看........") dic = {
"": auth,
"": register,
"": seach,
} def interactive():
while True:
msg = """
1 登陆
2 注册
3 查看
"""
print(msg)
choice = input("请输入选择:").strip()
if choice not in dic:
print("没有该功能编号")
continue
else:
dic[choice]() interactive()

二:函数的嵌套

函数的嵌套调用:在函数中调用了其他函数

def max2(x, y):
if x > y:
return x
else:
return y def max3(x, y, z):
res1 = max2(x, y)
res2 = max2(res1, z)
return res2 print(max3(11, 199, 2))

函数的嵌套定义:

  在函数中定义其他函数。

  函数的嵌套定义只能在定义的同一级别调用。

def func1():
print("weqwewq") def func2(): # 在函数func1中定义func2
print("dsadas")
print(func2) # 打印函数地址
print(func2()) # 运行函数,打印函数的返回值
func2() # 运行函数,print("dsadas") func1()

嵌套函数调用

def f1():
print("f1") def f2():
print("f2") def f3():
print("f3") def f4():
print("f4") f4()
f3()
f2()
f1()

三:名称空间与作用域

什么是名称空间

名称空间有内置名称空间、全局名称空间、局部名称空间,名称空间存放着名字与值的绑定关系:
  内置名称空间存放python字自带的名字,内置的名字在解释器启动时生效,在解释器关闭后失效;
  全局名称空间存放文件级别的名字,要求是顶头写的:如全局变量、函数名等,全局的名字在文件执行的时候生效,在文件结束或文件执行期间被删除的时候失效;
  局部名称空间存放在函数内定义的名字(函数内的参数和函数内的名字),在函数调用时生效,在函数调用结束时候失效;

名称空间的加载顺序

  内置名称空间》》全局名称空间》》局部名称空间

  在全局无法查看到局部的名称,但是在局部却可以查看全局的名称

四:作用域

作用域即范围

  全局范围(内置名称空间与全局名称空间属于该范围):全局存活全局有效

  局部范围:函数调用时存活,调用结束时失效,局部有效

作用域关系在函数定义阶段就已经固定,与函数的调用位置没有关系

def f1():           # 定义函数f1
def f2(): # 嵌套定义函数f2
print(x) # 打印变量x的值
return f2 # 返回函数f2的内存地址 x = 100 # 定义全局变量 x = 100 def f3(func): # 定义函数f3
x = 2 # 定义局部变量x=2,其作用域仅在函数f3内有效
func() # 执行传给的函数 x= 10000 # 再次定义一个全局变量x=10000,该全局变量覆盖了上一个,x=100全局变量已经失效 f3(f1())

函数f3(f1()) 执行,首先调用函数f1,定义函数f2,在定义阶段函数f2中x的作用域是全局范围,所以获取的是全局变量x的值,得到返回的函数f2的内存地址,把其内存地址当做实参传递给函数f3,调用函数f3,局部变量x=2无效,于是输出x的值10000。

五:闭包函数

闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域
应用领域:延迟计算
利用闭包函数封装一个request请求

from urllib.request import urlopen
def index(url):
def get():
return urlopen(url).read()
return get baidu = index('http://www.baidu.com')
print(baidu().decode('utf-8'))

内部函数包含对外部作用域而非全局作用域的引用;

提示:之前我们都是通过参数将外部的值传给函数,闭包提供了另外一种思路。

def counter():
n = 0
def incr():
nonlocal n
x = n
n += 1
return x
return incr c = counter()
print(c())
print(c())
print(c())
print(c.__closure__[0].cell_contents)

函数嵌套>作用域>闭包函数的更多相关文章

  1. 10 - 函数嵌套-作用域-闭包-LEGB-函数销毁

    目录 1 函数嵌套 2 作用域 2.1 global关键字 3 闭包 3.1 nonlocal关键字 4 默认值的作用域 5 变量名解析原则LEGB 6 函数的销毁 1 函数嵌套         一个 ...

  2. python 嵌套作用域 闭包函数

    #闭包函数 def multiplier(factor): def multiplyByFactory(number): return number*factor return multiplyByF ...

  3. python基础—函数嵌套与闭包

    python基础-函数嵌套与闭包 1.名称空间与作用域 1 名称空间分为: 1 内置名称空间   内置在解释器中的名称 2 全局名称空间   顶头写的名称 3 局部名称空间 2 找一个名称的查找顺序: ...

  4. day12 函数的嵌套调用 闭包函数,函数对象

    函数嵌套: 函数嵌套: 嵌套指的是,一个物体包含另一个物体,函数嵌套就是一个函数包含另一个函数 按照函数的两个阶段 嵌套调用 指的是在函数的执行过程中调用了另一个函数,其好处可以简化外层大函数的代码, ...

  5. Python开发——函数【装饰器、高阶函数、函数嵌套、闭包】

    装饰器 装饰器本质就是函数,为其他函数添加附加功能. 原则: 不修改被修饰函数的源代码 不修改被修饰函数的调用方法 装饰器知识储备:装饰器 = 高阶函数 + 函数嵌套 + 闭包 案例:求函数运行时间! ...

  6. 《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 ...

  7. Day11名称空间,作用域,闭包函数

    Day11 1.函数对象: ①可以被引用 ​ ②可以作为另一个函数的参数 ​ ③可以作为另一个函数的返回值0 ​ ④可以被存储到容器类型中 2.函数嵌套: ①嵌套调用:在一个函数中调用了另一个函数 ​ ...

  8. Python作用域-->闭包函数-->装饰器

    1.作用域: 在python中,作用域分为两种:全局作用域和局部作用域. 全局作用域是定义在文件级别的变量,函数名.而局部作用域,则是定义函数内部. 关于作用域,我要理解两点:a.在全局不能访问到局部 ...

  9. 孤荷凌寒自学python第十九天python函数嵌套与将函数作为返回对象及闭包与递归

    孤荷凌寒自学python第十九天python函数嵌套与将函数作为返回对象及闭包与递归 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) Python函数非常的灵活,今天学习了python函数的以 ...

随机推荐

  1. sublime Text 插件收录

    插件 1.SublimeText3常用快捷键和优秀插件 2.常用的sublime text 3插件-1 主题 1.https://www.jianshu.com/p/1a1113213faf 2.ht ...

  2. IDEA 开发工具的快捷键

    IDEA 开发工具的快捷键 原文链接:http://blog.csdn.net/wfp458113181wfp/article/details/24579781 1.文本编辑 删除    ctr + ...

  3. javascript易混淆的split()、splice()、slice()方法详解

    很多时候,一门语言总有那么些相似的方法,容易让人傻傻分不清楚,尤其在不经常用的时候.而本文主要简单总结了JavaScript中的关于字符串和数组中三个容易混淆的方法.旨在方便查阅,在容易混淆的时候有据 ...

  4. 多线程同步与并发访问共享资源工具—Lock、Monitor、Mutex、Semaphore

    “线程同步”的含义   当一个进程启动了多个线程时,如果需要控制这些线程的推进顺序(比如A线程必须等待B和C线程执行完毕之后才能继续执行),则称这些线程需要进行“线程同步(thread synchro ...

  5. Wow! Such Doge! HDU - 4847(虽然是道水题 但很有必要记一下)

    就是求出现了多少次doge 不区分大小写  巧用字符串函数 isalpha 判断是否是字母 tolower 转换为小写字母 toupper 转换为大写字母 strncmp字符串比较函数  能限制比较的 ...

  6. 【刷题】BZOJ 1565 [NOI2009]植物大战僵尸

    Description Plants vs. Zombies(PVZ)是最近十分风靡的一款小游戏.Plants(植物)和Zombies(僵尸)是游戏的主角,其中Plants防守,而Zombies进攻. ...

  7. [UVALive 3683] A Scheduling Problem

    图片加载可能有点慢,请跳过题面先看题解,谢谢 题目给出了一个信息:答案是有向边最长路 \(k\) 的值或者是 \(k+1\) 的值 那么题目就变成了:求是否有一种给无向边定向的方案,使得在以有向边最长 ...

  8. bzoj1026windy数

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1026 Description windy定义了一种windy数.不含前导零且相邻两个数字之 ...

  9. ZABBIX 3.4 监控Nginx 状态(七)

    一.环境准备 1.在nginx的配置文件中,添加status配置        location /nginx_status {               stub_status on;       ...

  10. 【bzoj2301】 HAOI2011—Problem b

    http://www.lydsy.com/JudgeOnline/problem.php?id=2301 (题目链接) 题意 给出${a,b,c,d,k}$,${n}$组询问,求$${\sum_{i= ...