python函数作用域与闭包_python函数名称空间与作用域、闭包

一、命名空间概念

1、命名空间(name space)

名称空间是存放名字的地方。

若变量x=1,1存放在内存中,命名空间是存放名字x、x与1绑定关系的地方。

2、名称空间加载顺序

python test.py

#1、python解释器先启动,因而首先加载的是:内置名称空间

#2、执行test.py文件,然后以文件为基础,加载全局名称空间

#3、在执行文件的过程中如果调用函数,则临时产生局部名称空间

3、名字的查找顺序

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

需要注意的是:在全局无法查看局部的,在局部可以查看全局的,如下例:

# max=1

def f1():

# max=2

def f2():

max=3

print(max)

f2()

f1()

print(max)

"""

3

"""

max=1

def f1():

# max=2

def f2():

# max=3

print(max)

f2()

f1()

print(max)

"""

1

1

"""

二、作用域

python中一个函数就是一个作用域,局部变量放置在其作用域中;代码定义完成后,作用域已经完成,作用域链向上查找。类似C#、Java中作用域{}。

不同变量的作用域不同就是由这个变量所在的命名空间决定的。

1、作用域即范围

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

局部范围(局部名称空间属于该范围):临时存活,局部有效

2、作用域关系是在函数定义阶段就已经固定的,与函数的调用位置无关,如下:

x=1

def f1():

def f2():

print(x)

return f2

x=100

def f3(func):

x=2

func()

x=10000

f3(f1())

"""

10000

"""

3、查看作用域

LEGB 代表名字查找顺序:locals ——>enclosing(相邻的上一级) ——>globals ——> __builtins__

locals 是函数内的名字空间,包括局部变量和形参

enclosing 外部嵌套函数的名字空间

globals 全局变量,函数定义所在模块的名字空间

builtins 内置模块的名字空间

n = 10

def fun1():

n = 20

print('func1',n)

def fun2():

n = 30

print('func2',n)

def func3():

print("func3",n) # locals没有,先找相邻上一级作用域

func3() # 30

fun2() # 30

fun1() # 20

依次输出:func1 20  ;func2 30  ; func3 30

def func():

level = 'L1'

n = 33

print(locals())

def outer():

n = 44

level = 'L2'

print(locals(), n)

def inner():

level = 'L3'

print(locals(), n)

inner() # {'n': 44, 'level': 'L3'} 44

outer() # {'n': 44, 'level': 'L2'} 44

func() # {'n': 33, 'level': 'L1'}

输出如下结果:

{'n': 33, 'level': 'L1'}

{'level': 'L2', 'n': 44} 44

{'level': 'L3', 'n': 44} 44

三、闭包函数

内部函数包含对外部作用域而非全局作用域的引用。之前都是通过参数将外部的值传给函数,闭包提供的思路是将参数包起来。

1、什么是闭包?

闭包,即函数定义和函数表达式位于另一个函数的函数体内(嵌套函数)。而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数。当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。

也就是说,内部函数会在外部函数返回后被执行。而当这个内部函数执行时,它仍然必需访问其外部函数的局部变量、参数以及其他内部函数。这些局部变量、参数和函数声明(最初时)的值是外部函数返回时的值,但也会受到内部函数的影响。

def func():

n = 10

def func2():

print("func2:",n) # 对外部作用域的引用

return func2

f = func() # 拿到func2内存地址

print(f) # func2内存地址:.func2 at 0x101fb4620>

f() # 执行func2: 10

在外部可以执行内部的函数,并且可以使用内部函数作用域里的值,这种现象就是闭包。

在函数里面套了一层子函数,在外层函数被执行的时候,子函数被返回了,返回的是内存地址,在外面执行子函数的时候用引用了外层函数的变量,相当于两者有一种扯不掉理还乱的关系。

2、闭包的意义和应用

闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域。

应用领域:延迟计算(原来我们是传参,现在是抱起来)、装饰器

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'))

四、函数嵌套返回值

age = 18

def func1():

age = 73

def func2():

age = 84

print(age)

return 666

val = func1()

print(val)

'''

输出:666

'''

函数可以当做返回值:

# 函数名可以当作返回值

age = 18

def func1():

age = 73

def func2():...

return func2 # 返回一个函数名# val = func1()

print(val)

'''

输出:.func2 at 0x101462598>

'''

# 代码写完之后作用域已经生成,不管函数名传到哪里,只要执行都回回定义的地方往上找

age = 18

def func1():

age = 73

def func2():

print(age)

return func2 # 返回一个函数名不带括号

val = func1()

val()

'''

输出结果:73

'''

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/506185.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql改了排序规则不生效_Mysql数据库表排序规则不一致导致联表查询,索引不起作用问题...

Mysql数据库表排序规则不一致导致联表查询,索引不起作用问题表更描述: 将mysql数据库中的worktask表添加ishaspic字段。具体操作:(1)数据库worktask表新添是否有图片字段ishaspic;新添字段时,报错[SQL] alter table WorkTask add …

preparedstatement打印sql语句_Mybatis是这样防止sql注入的

链接:https://juejin.im/post/5e131203e51d4541082c7db3Mybatis这个框架在日常开发中用的很多,比如面试中经常有一个问题:$和#的区别,它们的区别是使用#可以防止SQL注入,今天就来看一下它是如何实现SQL注入的。什么是S…

mysql 虚拟列索引_使用MySQL 5.7虚拟列提高查询效率

原标题:使用MySQL 5.7虚拟列提高查询效率导读翻译团队:星耀队知数堂团队成员:星耀队-芬达,星耀队-顺子,星耀队-M哥原文出处:https://www.percona.com/blog/2018/01/29/using-generated-columns-in-mysql-5-…

python selenium span内容读取_【程仁智推荐】Selenium自动化测试入门

LupuX 2017-06-18 14:24:28 11853 收藏 41分类专栏: Auto Test 文章标签: 自动化测试 selenium web测试 UI自动化版权一、什么是SeleniumSelenium 是一个浏览器自动化测试框架,它主要用于web应用程序的自动化测试,其主要特点如下…

c++ 操作mysql_C++操作mysql方法总结(1)

C通过mysql的c api和通过mysql的Connector C 1.1.3操作mysql的两种方式使用vs2013和64位的msql 5.6.16进行操作项目中使用的数据库名为booktik表为book……….(共有30条记录,只列出了部分记录,14-30未列出)一、通过mysql的C api进行操作1、新建一个空项目…

mysql 8函数索引_新特性解读 | MySQL 8.0 索引特性1-函数索引

原创作者:杨涛涛函数索引顾名思义就是加给字段加了函数的索引,这里的函数也可以是表达式。所以也叫表达式索引。MySQL 5.7 推出了虚拟列的功能,MySQL8.0的函数索引内部其实也是依据虚拟列来实现的。我们考虑以下几种场景:1.对比日…

python上下键不能用_python退格、方向键无法正常使用解决方法

标签:CentOS 6.5 自带的Python 2.6.6 箭头以及退格键(Backspace)可正常使用:自定义所安装的Python 2.7.6却发现箭头以及退格键(Backspace)在使用的时候出现异常:这是由于新升级的Python2.7.6缺少readline开发包的原因:后重新编译、…

python周志_Python几周学习内容小结

环境配置学习python首先是要配置环境,我们选择了Anaconda.什么是Anaconda:专注于数据分析的python发行版本。为什么选择Anaconda:省事省心,分析利器至于下载和安装只要百度一下,你就知道。Python基本语法Python标识符在 Python 里&#xff0c…

python文本分词_【Python】使用jieba对文本进行分词

【参考】#-*- coding:utf-8 -*-importjiebaimportsysreload(sys)sys.setdefaultencoding(utf8)char_x2"考勤机分两大类:第一类是简单打印类,打卡时,原始记录数据通过考勤机直接打印在卡片上,卡片上的记录时间即为原始的考勤信…

mysql进阶知识_Mysql面试知识点总结(进阶篇)

上一篇主要介绍一些基础的mysql知识点,这一篇我们介绍一下mysql比较重要但在开发中我们程序员很少知道的几个大点(自以为是的观点)。数据库设计三范式:第一范式:数据库表的每一列都是不可分割的原子数据项,即列不可拆分。第二范式…

python计算样本方差_Python计算库numpy进行方差/标准方差/样本标准方差/协方差的计算...

使用numpy可以做很多事情,在这篇文章中简单介绍一下如何使用numpy进行方差/标准方差/样本标准方差/协方差的计算。variance: 方差方差(Variance)是概率论中最基础的概念之一,它是由统计学天才罗纳德费雪1918年最早所提出。用于衡量数据离散程度&#xff…

java实现报表_修改带 JAVA 自定义类的报表还要重启应用,咋解决?

这是 JAVA 编译型语言特性决定的,修改 JAVA 程序重启应用也正常。只不过改报表就要重启整个应用就有点夸张了,报表变动比较频繁,每次都重启应用会影响业务的。这个问题的根本原因是耦合性问题,报表里一旦涉及到 JAVA 代码就要跟主…

python中newfile是干嘛用的_Python基础介绍 | File I\O 读写文件

如何用Python读写文件呢?我们有许多种办法,包括使用Pandas或者使用os相关的工具,我们来看一下:首先,得明白文件路径的事情:import oscurrent_file os.path.realpath(file_io.ipynb)print(current file: {}…

mysql share mode_mysql锁:mysql lock in share mode 和 select for update

select ... lock in share modeselect ... for update注意点:1.都在事务内起作用;2.所涉及的是行锁(即innodb引擎);3.保证当前session事务所锁定的行不会被其他session所修改(这里的修改指更新或者删除);4.select ... lock in share mode是共享锁&#x…

python是谁维护的_Python是维护拆分的更可靠的方法

cde直接结果一位十进制类最近遇到了一个魔术问题。\\ gt; \\ gt; \\ gt;圆(0.215.2)0.21:00 u t26 t:我想要的结果是0.22,这应该是双重存储的原因。那么如何避免呢?搜索很长一段时间后,将其张贴在此处进行记录。导入小…

idea 用iterm 终端_iTerm2 都不会用,还敢自称老司机?(上)

对于需要长期与终端打交道的工程师来说,拥有一款称手的终端管理器是很有必要的,对于 Windows 用户来说,最好的选择是 Xshell,这个大家都没有异议。但对于 MacOS 用户来说,仍然毋庸置疑,iTerm2 就是你要的利…

bootstrap 日历中文_bootstrap日期选择器本地化-中文

最近用bootstrap做项目,所以就顺便搜了下用bootstrap写的日期选择器。搜到的第一和第二条结果虽然是官网,但上面挂的还是基于bootstrap2的日期选择器(此时为北京时间2017-12-26 17:18),不能与bootstrap3兼容使用。所以又去找bootstrap3的日期…

td之间的间距怎么改_论文的一级标题、二级标题格式怎么弄?

其实论文写好了以后,论文格式的调整也是非常重要的,具体的格式一般有以下几点:标题格式,一级标题、二级标题、三级标题页码格式,一般是正文之前为罗马数字,正文以后为阿拉伯数字,一般是页脚中间…

winform教_电脑绝技教你22天学精Csharp之第十五天winform应用程序补充5

{{1}}$using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;using System.IO;namespace _10打开对话框{publi…

python鼠标事件 详解_Python selenium键盘鼠标事件实现过程详解

引言----在实际的web测试工作中,需要配合键盘按键来操作,webdriver的 keys()类提供键盘上所有按键的操作,还可以模拟组合键Ctrla,Ctrlv等。举例:#cordinggbkimport osimport timefrom selenium import webdriverfrom s…