python基础7(函数 Ⅱ)
1、python代码运行遇到函数时
从python解释器开始执行之后,就在内存中开辟了一个空间
每当遇到一个变量的时候,就把变量名和值之间的对应关系记录下来。
但是当遇到函数定义的时候解释器只是象征性的将函数名读入内存,表示知道这个函数的存在了,至于函数内部的变量和逻辑解释器根本不关心。
等执行到函数调用的时候,python解释器会再开辟一块内存来存储这个函数里的内容,这个时候,才关注函数里面有哪些变量,而函数中的变量会存储在新开辟出来的内存中。函数中的变量只能在函数的内部使用,并且会随着函数执行完毕,这块内存中的所有内容也会被清空。
2、命名空间
- “存放名字与值的关系”的空间
- 内置命名空间
存放的是python解释器提供的名字(input,print,str...),拿过来就可以使用,内置命名空间的名字在解释器启动的时候就被放入内存
- 全局命名空间
当前模块的命名空间
当代码执行的时候,从上到下按执行的过程加载到内存 - 局部命名空间
函数内部定义的名字
随函数调用而创建,随函数结束而删除 - 命名空间的加载顺序
内置命名空间 -> 全局命名空间 -> 局部命名空间
- 命名空间的取值顺序
局部命名空间 -> 全局命名空间 -> 内置命名空间
3、作用域
全局作用域:内置命名空间和全局命名空间中的名字都属于全局作用域
局部作用域:函数(局部命名空间中的名字属于局部作用域) #查看局部作用域中的名字
locals() #查看全局作用域中的名字
globals()
4、global
对于不可变数据类型,局部中可以获得其值,但是不能修改
如果要修改,可以通过global关键字 a = 1
b = 2
def func():
global a
a = 6 #合法
b = 4 #不合法操作
5、函数嵌套
def outer():
def inner():
print('---')
inner() outer()
6、nonlocal
在嵌套的函数中,如果我们要修改上层函数的变量,通过上面global是做不到的,因为global获取的是全局中的那个变量,所以可以通过nonlocal来获取(只能获取最接近的那层,也就是上一层中的变量) a = 1
def outer1():
a = 2
def outer2():
a = 3
def inner():
nonlocal a
a = 5
inner()
outer2() outer1() #outer2中的a = 3将变成a = 5
7、函数名的本质是内存地址,可以作为容器元素,返回值,参数
#函数名可以赋值
def func():
print('I am func') func2 = func
func2() #实际上执行的是func #函数名可以作为容器的元素
l = [func,fun2]
for f in l:
f() #函数名可以作为返回值
def ohyeah(f):
f()
return f
8、闭包
闭包就是内层函数调用外层函数的变量 def outer():
a = 1
def inner():
print(a) #如果是闭包,调用__closure__将返回cell
def outer():
a = 1
def inner():
print(a)
print(inner.__closure__)
outer() #闭包的用法就是在函数外部使用其内部的函数。
#可以使外部函数的变量无需重复创建
def outer():
a = 1
def inner():
print(a)
return inner
out = outer()
out()
out()
9、三目运算符
def max(a,b):
return a if a>b else b
python基础7(函数 Ⅱ)的更多相关文章
- python基础——匿名函数
python基础——匿名函数 当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便. 在Python中,对匿名函数提供了有限支持.还是以map()函数为例,计算f(x)=x2时 ...
- python基础——返回函数
python基础——返回函数 函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回. 我们来实现一个可变参数的求和.通常情况下,求和的函数是这样定义的: def calc_ ...
- python基础——sorted()函数
python基础——sorted()函数 排序算法 排序也是在程序中经常用到的算法.无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小.如果是数字,我们可以直接比较,但如果是字符串或者两个d ...
- python基础——filter函数
python基础——filter函数 Python内建的filter()函数用于过滤序列. 和map()类似,filter()也接收一个函数和一个序列.和map()不同的是,filter()把传入的函 ...
- python基础——匿名函数及递归函数
python基础--匿名函数及递归函数 1 匿名函数语法 匿名函数lambda x: x * x实际上就是: def f(x): return x * x 关键字lambda表示匿名函数,冒号前面的x ...
- 八. Python基础(8)--函数
八. Python基础(8)--函数 1 ● 函数返回布尔值 注意, 自定义的函数也可以是用来作逻辑判断的, 例如内置的startswith()等函数. def check_len(x): ' ...
- python基础之函数详解
Python基础之函数详解 目录 Python基础之函数详解 一.函数的定义 二.函数的调用 三.函数返回值 四.函数的参数 4.1 位置参数 4.2 关键字参数 实参:位置实参和关键字参数的混合使用 ...
- Python学习笔记(一)python基础与函数
1.python基础 1.1输入与输出 输出 用print加上字符串,就可以打印指定的文字或数字 >>> print 'hello, world' hello, world > ...
- Day3 - Python基础3 函数、递归、内置函数
Python之路,Day3 - Python基础3 本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8. ...
- Python基础__函数
本节将进入函数的介绍,函数是Python基础中最精彩的部分之一,接下来将对函数做详细介绍.函数 函数就是对代码进行一个封装.把实现某一功能的代码进行封装到一起.下次需要使用时不需要进行编写代码直接调用 ...
随机推荐
- 使用 Jersey 和 Apache Tomcat 构建 RESTful Web 服务
作者: Yi Ming Huang, 软件工程师, IBM Dong Fei Wu, 软件工程师, IBM Qing Guo, 软件工程师, IBM 出处: http://www.ibm.com/de ...
- HDU 4630 No Pain No Game (线段树+离线)
题目大意:给你一个无序的1~n的排列a,每次询问[l,r]之间任取两个数得到的最大gcd是多少 先对所有询问离线,然后把问题挂在区间的左端点上(右端点也行) 在预处理完质数,再处理一个next数组,表 ...
- 我的Linux系统开始学习的过程
Linux系统,不知大家是否了解.接触计算机不多或对计算机不感冒的人可能对其比较陌生,曾经的我也是.上大学前的我的确对Linux一无所知,那时候接触面窄,都没有听说过此名字,上了大学后,身边的人有学习 ...
- 2019-03-28 Python SQL 的注释
SQL Server 多行注释 : ctrl + k + c SQL Server 单行注释: -- Python 单行注释:# Python多行注释:''' '''
- Java基础学习总结(48)——Java 文档注释
Java只是三种注释方式.前两种分别是// 和/* */,第三种被称作说明注释,它以/** 开始,以 */结束. 说明注释允许你在程序中嵌入关于程序的信息.你可以使用javadoc工具软件来生成信息, ...
- GROUP BY 与聚合函数 使用注意点
表的设计: 表里面的内容: 一:在不使用聚合函数的时候,group by 子句中必须包含所有的列,否则会报错,如下 select name,MON from [测试.] group by name 会 ...
- 使用jmap和MAT分析JVM堆内存
http://blog.csdn.net/alli0968/article/details/52460008
- 【转载】linux下的usb抓包方法
1 linux下的usb抓包方法 1.配置内核使能usb monitor: make menuconfig Device Drivers --> ...
- UIScrollView加入控件,控件距离顶部始终有间距的问题
今天.特别郁闷.自己定义了一个UIScrollView,然后在它里面加入控件,如UIButton *button = [[UIButton alloc] initWithFrame:CGRectMak ...
- POI 导入excel数据自己主动封装成model对象--代码分析
上完代码后,对代码进行基本的分析: 1.主要使用反射api将数数据注入javabean对象 2.代码中的日志信息级别为debug级别 3.获取ExcelImport对象后须要调用init()方法初始化 ...