python的函数学习2
名称空间
用来存放名字的地方,有三种名称空间:内置名称空间,全局名称空间,局部名称空间。
比如执行test.py: python test.py
、python解释器先启动,因而首先加载内置名称空间
、执行test.py文件,然后以文件为基础,加载全局名称空间
、在执行文件的过程中如果调用函数,则临时产生局部名称空间
名称的加载顺序是先加载内置名称空间,再加载全局名称空间,最后是局部名称空间,所以,如果在全局名称空间中使用局部名称空间,是错误的,因为根本就找不到。
而在函数调用时查找名字的顺序是:局部名称空间--->全局名称空间--->内置名称空间。
作用域
首先来谈一下什么是作用域?先看一个例子:
b =
def func1():
a =
print(a)
print(b) def func2():
print(b)
# print(a) func1()
func2()
上面这段代码虽然简单,却可以很好的说明了函数作用域的问题,如上,如果注释掉函数func2的print(a)这一句,程序可以正常运行,但是如果加上这一句就出错,出错的原因是a没有定义,为什么b在两个函数中都可以引用,而a只能在func1中使用呢?这就是因为a的作用域的问题了。
变量作用域:
①L(Local)局部作用域
②E(Enclosing)闭包函数外的函数中
③G(Globa)全局作用域
④B(Built-in)内建作用域
以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,最后去内建中找。
那么这具体是什么意思呢?
如上面的例子中,由名称空间的加载可知调用函数func1时产生func1的局部名称空间,而a就在该空间内,执行函数func1时从该名称空间中查找a,所以func1可以找到a。
但是函数func2的局部名称空间中却没有变量a,所以找不到,那就去全局名称空间找,也没有,所以出错。(Enclosing是对于闭包来说的)
这就说明a的作用域只能作用于函数func1。而b属于全局名称空间,属于全局变量,因此其可被func1和func2调用。
global,nonlocal关键字:
当内部作用域想修改外部作用域的变量时,要用到global,nonlocal关键字。
global 关键字用于局部作用域修改全局作用域时在局部变量前加上global。
nonlocal 关键字用于要修改嵌套作用域(即Enclosing,外层非全局作用域)。
a =
def func():
global a
a +=
print(a) func()
这是一个很简单的使用global关键字,如果注释掉global a 这一句,程序会报错。
def func1():
n = def func2():
nonlocal n
x = n
n +=
return x return func2 c = func1()
print(type(c)) # 可以看到c是一个函数对象
print(c()) # 执行c()其实就是执行func2()
这是一个简单的闭包,可以看到首先是函数func1里嵌套了一个函数func2,func2调用了func1的内部变量。如果注释掉nonlocal n的话会出错。
闭包:
闭包就是能够读取其他函数内部变量的函数,即定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。
python的函数学习2的更多相关文章
- python之函数学习
#!/usr/bin/env python # # =============================================== # 位置参数说明 # 位置参数 通过参数传递的位置来 ...
- python时间函数学习
格式化当前日期: import time print time.strftime('%Y-%m-%d') 获取一天前的日期: import datetime import time onedayago ...
- .Net程序员之Python基础教程学习----函数和异常处理[Fifth Day]
今天主要记录,Python中函数的使用以及异常处理. 一.函数: 1.函数的创建以及调用. def Add(val1,val2): return val1+val2; print Add( ...
- python3.4学习笔记(二十) python strip()函数 去空格\n\r\t函数的用法
python3.4学习笔记(二十) python strip()函数 去空格\n\r\t函数的用法 在Python中字符串处理函数里有三个去空格(包括'\n', '\r', '\t', ' ')的函数 ...
- Python快速入门学习笔记(三)——函数的定义与调用
定义函数 Python中定义函数的格式为: def fun([参数列表]): ... 函数在执行到return语句时结束,并将结果返回.如果没有return语句,函数执行完毕后返回None. 例: d ...
- Python函数学习——作用域与嵌套函数
全局与局部变量 在函数中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量. 全局变量作用域是整个程序,局部变量作用域是定义该变量的函数. 当全局变量与局部变量同名时,在定义局部变量的函数内 ...
- Python函数学习遇到的问题
Python函数的关键字参数 Python函数独立星号(*)分隔的命名关键字参数 Python函数中的位置参数 Python中对输入的可迭代对象元素排序的sorted函数 Python中函数的参数带星 ...
- PyQt(Python+Qt)学习随笔:窗口对象尺寸调整相关的函数resize、showMaximized、showNormal、showMinimized
resize(width,height) resize可以直接调整窗口的尺寸,调整效果类似于鼠标直接拉伸或缩小窗口,但窗口大小的最大值.最小值受窗口的sizePolicy.sizeHint.minim ...
- Python 装饰器学习
Python装饰器学习(九步入门) 这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 1 2 3 4 5 6 7 8 # -*- c ...
随机推荐
- 解决sqlserver还原数据库失败命令
1.使用Master数据库 2.选择数据库 select * from master.sys.sysprocesses where dbid=db_id('database') 3.查出进程使用kil ...
- python爬虫-上期所持仓排名数据爬取
摘要:笔记记录爬取上期所持仓数据的过程,本次爬取使用的工具是python,使用的IDE是pycharm 一.查看网页属性,分析数据结构 在浏览器中打开上期所网页,按F12或者选择表格文字-右键-审查元 ...
- 可拖动div
客户要求,页面有图片并且可以随意拖动 具体实现: css: #div1{ width: 30px; height: 30px; /*一定要绝对定位*/ position: absolute; /*初始 ...
- cannot open shared object file: No such file or directory解决方法
- 【Mybatis】MyBatis之Sql配置文件的使用(四)
上一章[Mybatis]MyBatis对表执行CRUD操作(三),已经讲了基本操作,本章介绍Sql配置文件中常用功能 1.插入返回主键 2.参数值的获取方式 3.resultMap使用 插入返回主键 ...
- 基于TeamCity的asp.net mvc/core,Vue 持续集成与自动部署
一 Web Server(Windows)端的配置 1.配置IIS,重要的是管理服务 1.1 配置FTP(前端NPM项目需要) 该步骤略,如果是在阿里云ESC上,需要开启端口21(用来FTP认证握手) ...
- sessionStorage和localStorage的使用方法
1.sessionStorage sessionStorage生命周期为当前窗口或标签页,一旦窗口或标签页被永久关闭了,那么所有通过sessionStorage存储的数据也就被清空 JSON.pars ...
- gitlab的安装和基本使用
一.gitlab的安装 1)安装依赖包 sudo yum install git vim gcc glibc-statc telnet -y sudo yum install -y curl poli ...
- C++二分图匹配基础:zoj1002 FireNet 火力网
直接给出题目吧... 问题 D(1988): [高级算法]火力网 时间限制: 1 Sec 内存限制: 128 MB 题目描述 给出一个N*N的网格,用'.'表示空地,用'X'表示墙.在网格上放碉堡,可 ...
- Python3.7版本unittest框架添加用例的方法
1.实例demo是用谷歌浏览器在百度首页搜python的动作脚本: BaiDu_test是指脚本中自己定义的类名,test_get是指你的类中定义的testcase方法. 在if name函数 ...