Python---函数2---王伟

#### 作用域
```python
#1.作用域:变量生效的区域
#2.作用域的分类
a.全局作用域(全局变量)
- 全局作用域在程序执行时创建,在程序执行结束时销毁
- 所有函数以外的区域都是全局作用域
- 在全局作用域中定义的变量,都属于全局变量,全局变量可以在程序的任意位置被访问
-globals()返回当前的全局变量
-在模块层级上,locals()和globals()是同一个字典
b.函数作用域(局部变量)
- 函数作用域在函数调用时创建,在调用结束时销毁
- 函数每调用一次就会产生一个新的函数作用域
- 在函数作用域中定义的变量,都是局部变量,它只能在函数内部被访问
#3.变量查找范围
a.首先会在当前作用域中寻找变量,如果有则使用
b.如果没有继续去上一级作用域中寻找,如果有则使用
c.如果依然没有则继续去上一级作用域寻找,以此类推
d.直到找到全局作用域,依然没有找到,则会抛出异常
#4.函数内部使用全局变量
***引用全局变量时,不需要global声明,使用或者修改这个全局变量的时候,需要global声明
#5.global:表明特定变量生存于全局作用域并且应当在其中被重新绑定
-global:修饰变量后,标识该变量是全局变量,对该变量进行修改就是修改全局变量
#6.nonlocal:表明特定变量生存于外层作用域中并且应当在其中被重新绑定
-nonlocal:修饰变量后标识该变量是上一级函数中的局部变量,如果上一级函数中不存在该局部变量,nonlocal位置会发生错误(最上层的函数使用nonlocal修饰变量必定会报错)
#7.global和nonlocale区别
1.global可以用在任何地方,包括最上层函数中和嵌套函数中,即使之前未定义该变量,global修饰后也可以直接使用,2.nonlocal只能用于嵌套函数中,并且外层函数中定义了相应的局部变量,否则会发生错误
```
#### 命名空间
```python
#1.命名空间:一个从名称到对象的映射关系
a.命名空间的本质是字典
b.存储变量
#2.命名空间分类
a.内置函数的集合(包含print()等内置函数和内置异常等)
b.模块中的全局名称(对象的属性集合也是一种命名空间的形式)
c.函数调用中的局部名称
#3.不同命名空间中的名称之间绝对没有关系
#4.在不同时刻创建的命名空间拥有不同的生存期
a.内置名称的命名空间是在 Python 解释器启动时创建的
b.模块的全局命名空间在模块定义被读入时创建;通常,模块命名空间也会持续到解释器退出
c.一个函数的本地命名空间在这个函数被调用时创建,并在函数返回或抛出一个不在函数内部处理的错误时被删除。当然,每次递归调用都会有它自己的本地命名空间
#5.locals获取当前命名空间
```
#### 函数返回值return
```python
#1.返回值:函数执行后返回的结果,通过return来指定函数的返回值
#2.return后面跟什么值,函数就返回什么值,return可以跟任意对象
#3.如果仅仅写了个return或者不写return,则相当于return None
#4.在函数中,return后的代码都不会执行,return一旦执行函数自动结束
def function(*args):
    result=0
    for i in args:
        result += i
    return result
function(10,20,30)
#输出结果
60
def function1():
    print("python")
    def function2():
        print("hello world")
    return function2
print(function())
#输出结果
python
<function function1.<locals>.function2 at 0x000001F787477318>
```
#### 递归函数
```python
#1.递归函数:在函数中自己调用了自己
#2.递归函数的两个要件
#a.基线条件
问题可以被分解为的最小问题,当满足基线条件时,递归就不在执行了
#b.递归条件
将问题继续分解的条件
#3.计算10的阶乘
def function(a):
    if a == 1:
        return 1
    return n * function(n-1)
 print(function(10))  
#输出结果
3628800
```
 

猜你喜欢

转载自www.cnblogs.com/niaocaizhou/p/12054485.html