day10.函数进阶
函数的命名空间
从python解释器开始执行之后,就在内存中开辟了一个空间,每当遇到一个变量的时候,就把变量名和值之间的对应关系记录下来。
但是当遇到函数定义的时候解释器只是象征性的将函数名读入内存,表示知道这个函数的存在了,至于函数内部的变量和逻辑解释器根本不关心。
等执行到函数调用的时候,python解释器会再开辟一块内存来存储这个函数里的内容,这个时候,才关注函数里面有哪些变量,而函数中的变量会存储在新开辟出来的内存中。
函数中的变量只能在函数的内部使用,并且会随着函数执行完毕,这块内存中的所有内容也会被清空。
全局命名空间:是在程序从上到下被执行的过程中依次加载进内存的,放置了我们设置的所有变量名
局部命名空间:函数内部定义的名字,调用函数的时候参会产生命名空间,函数执行结束命名空间消失
内置命名空间:python解释器启动即可使用,内置的名字在启动解释器的时候被加载进内存中
- a = 1 #属于全局命名空间
- def func():
- b = 2 # 属于局部命名空间
- print('abc') # 属于内置命名空间
- func()
print(a)
作用域
全局作用域:作用在全局,内置和全局命名空间中的名字属于全局作用域
局部作用域:函数内,作用在局部
local, locals, globals 关键字
local 可在局部调用全局变量,慎用
- a = 1
- def func():
- global a
- a += 1
- func()
- print(a)
- 2
locals 查看局部所有变量,globals可查看全局变量
- a = 1
- def func():
- b = 2
- global a
- a += 1
- print(a)
- print(locals())
- print(globals())
- func()
- 2
- {'b': 2}
- {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000001A02E31A518>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/python学习/day10/复习.py', '__cached__': None, 'a': 2, 'func': <function func at 0x000001A02E3FB0D0>}
函数的嵌套和调用
函数的额嵌套,函数内嵌套函数。
nonlocal函数调用上一层函数变量,若没有则上上一层函数
- a = 1
- def outer():
- a = 2
- def inner():
- # a = 4 * 错误的位置
- nonlocal a # 若本层函数有变量,则用本层变量,本层没有调用上一层
- a = 4 # 相同名字的变量 a 只能定义在nonlocal下面,不能定义在上面
- a += 1
- print(a)
- inner()
- outer()
- 5
- def outer():
- a = 2
- def inner():
- nonlocal a
- a += 1
- print(a)
- inner()
- outer()
- 3
函数名的本质
- 函数名就是内存地址
- def func1():
- print(123)
- func2 = func1 # 1.函数名可以赋值func2()
- l = [func1,func2] # 2.函数名可以作为容器类型的元素
- print(l)
- for i in l:
- i() # 内存地址加括号即可执行函数,
- def func():
- print(123)
- def wahaha(f):
- f()
- return f
- wahaha(func) # 3.函数名可以作为函数的参数
- qqxing = wahaha()
- qqxing() # 4.函数名可以作为返回值
闭包
- # 1.嵌套函数
- # 2.内部函数调用外部函数的变量
最简单闭包:
def outer():- a = 1
- def inner():
- print(a)
- 闭包调用举例:
- def outer():
- a = "内部变量a"
- def inner():
- print(a)
- return inner 返回函数内存地址给outer()
- inn = outer()
- inn()
# 通过闭包可以将函数内部的函数,变量,调用给外部函数。- # 如果反复调用函数。避免 变量 在函数内的反复生存和死亡
学到看到这里我是有点疑惑,闭包中似乎不需要nonlocal就可以调用上一层函数啊,还要nonlocal有啥用啊,
- def outer():
- a = 1
- def inner():
- nonlocal a
- a += 1
- print(a)
- inner()
- outer()
- def outer():
- a = 1
- def inner():
- # nonlocal a 如果对上层变量进行修改,似乎必须地用nonlocal调用上层函数。如果不修改,则可以直接调用。
- # a += 1
- print(a)
- inner()
- outer()
day10.函数进阶的更多相关文章
- python全栈学习--day10(函数进阶)
一,引言 现在我有个问题,函数里面的变量,在函数外面能直接引用么? def func1(): m = 1 print(m) print(m) #这行报的错 报错了:NameError: name 'm ...
- 巨蟒python全栈开发-第10天 函数进阶
一.今日主要内容总览(重点) 1.动态传参(重点) *,** *: 形参:聚合 位置参数*=>元组 关键字**=>字典 实参:打散 列表,字符串,元组=>* 字典=>** 形参 ...
- python函数-函数进阶
python函数-函数进阶 一.命名空间和作用域 1.命名空间 内置命名空间 —— python解释器 就是python解释器一启动就可以使用的名字存储在内置命名空间中 内置的名字在启动解释器的时候被 ...
- 深入理解javascript函数进阶系列第一篇——高阶函数
前面的话 前面的函数系列中介绍了函数的基础用法.从本文开始,将介绍javascript函数进阶系列,本文将详细介绍高阶函数 定义 高阶函数(higher-order function)指操作函数的函数 ...
- 【python 3】 函数 进阶
函数进阶 1.函数命名空间和作用域 命名空间一共分为三种: 全局命名空间 局部命名空间 内置命名空间 *内置命名空间中存放了python解释器为我们提供的名字:input , print , str ...
- day11.1函数进阶 列表集合 字典中的函数变量,函数作为形参
函数进阶 1.函数作为变量 a=123 name="gao" nums=[1,2,3] data=nums#指向同一个内存地址 #查看内存地址篇章 def func(): prin ...
- python基础 (初识函数&函数进阶)
函数基础部分 .什么是函数? 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率. 2.定义函数 定义:def 关键词开头,空格之后接函数名 ...
- day 10 - 1 函数进阶
函数进阶 命名空间和作用域 命名空间 命名空间 有三种内置命名空间 —— python解释器 就是python解释器一启动就可以使用的名字存储在内置命名空间中 内置的名字在启动解释器的时候被加载进内存 ...
- python基础之 初识函数&函数进阶
函数基础部分 1.什么是函数? 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.函数能提高应用的模块性,和代码的重复利用率. 2.定义函数 定义:def 关键词开头,空格之后接函数名 ...
随机推荐
- css3 翻转
参考资料: WEB骇客 : http://www.webhek.com/css-flip/ Demo : Demo(谷歌浏览器观看,没做兼容) Demo截图: 代码: <!DOCTYPE h ...
- 8-Images
HTML Image Tags Tag Description <img> Defines an image <map> Defines an image-map <ar ...
- 常用的ORM框架
现在,很多项目使用ORM的框架构架实现数据持久层,下面列举一些常用的ORM框架有,后续分节介绍. Java:Hibernate和Mybatis(前身iBatis) .Net:EF6与EFCore.Da ...
- js学习——函数
函数声明 function funName(parameter){} 函数表达式,并把函数存储在变量x中 //不用给函数名,后续并不能直接用给定的函数名调用 var x = function(a){r ...
- 根据 label 的 text 的大小和长度 获取 尺寸
NSDictionary *attribute = @{NSFontAttributeName: [UIFont systemFontOfSize:17]};CGSize size = [_cards ...
- ORACLE的数据类型的长度合集
-- ORACLE的数据类型常用的数据库字段类型如下:字段类型 中文说明 限制条件 其它说明CHAR 固定长度字符串 最大长度2000 bytesVARCHAR2 可变长度的字符串 最大长度4000 ...
- SpringIOC框架详解
1.SpringIOC是什么? 就是一个用来管理实体类bean的容器 2.创建cppdy.xml文件(模拟springmvc.xml文件) <?xml version="1.0&quo ...
- algorithm与numeric的一些常用函数
numeric中的accumulated的基本用法: 来自:https://blog.csdn.net/u011499425/article/details/52756242 #include < ...
- JavaScript实现的抛物线运动效果
css88 技术文档地址: http://www.css88.com/archives/5355 张鑫旭 技术文档地址: https://www.zhangxinxu.com 使用示例: 使用时直接引 ...
- 即时通讯协议之XMPP
目前IM即时通信有四种协议 1.即时信息和空间协议(IMPP) 2.空间和即时信息协议(PRIM) 3.针对即时通讯和空间平衡扩充的进程开始协议SIP 4.XMPP协议: 该协议的前身是Jabber, ...