day 10

"""
一、函数是第一类对象:指的是函数名指的值(函数)可以被当做数据去使用。

1、可以被引用
2、可以当做参数传给另一个函数
3、可以当做函数的返回值 (闭包函数)
4、可以当作容器里面的元素 (用字典的形式,将购物车的所有功能储存起来,用的时候可直接调用)

二、函数的嵌套:

1、函数逇嵌套调用:在调用了一个函数的过程中,其内部代码又调用另一个函数(求四个数中做大值)
2、函数的嵌套定义:一个函数的内部又定义了另一个函数。(求圆的面积和圆的周长)

三、名称空间与作用域

1、名称空间:就是用来存放名字和值内存地址绑定关系的地方(内存空间)》》但凡查找值一定要通过名字,访问名字必需去查找名称空间
名称空间分三大类:
1、内置名称空间:存放的是python解释器自带的名字(关键字)
2、 全局名称空间:存放的是文件级别的名字(全局变量)
3、局部名称空间:在函数内定义的名字(局部变量)

生命周期: 1、内置名称空间:在解释器启动时则生效,解释器关闭则失效
2、 全局名称空间:在解释器解释执行python文件时则生效,文件执行完毕后则失效
3、局部名称空间:只在调用函数时临时产生该函数的局部名称空间,改函数调用完毕则失效

加载顺序:内置名称空间 > 全局名称空间 > 局部名称空间

查找名字的顺序:基于当前位置往上查找
假设当前站在局部,查找顺序:局部->全局->内置
假设当前站在全局,查找顺序:全局->内置
*******
名字的查找顺序,在函数定义阶段就已经固定死了(即在检测语法时就已经确定了名字的查找顺序),
与函数的调用位置无关,也就是说无论在任何地方调用函数,都必须回到
当初定义函数的位置去确定名字的查找关系
*******
2、作用域:
1、全局作用域:包含的是内置名称空间和全局名字空间的名字(全局有效,全局存活)
2、局部作用域:包含的是局部名称空间的名字

global:在局部来声明一个名字是来自于全局作用域(全局变量),可以用来在局部修改全局的不可变类型
nonlocal:声明一个名字是来自当前层外一层作用域(局部变量),可以用来在局部修改外层函数的不可变类型


四:闭包函数:为一函数体传参数的一种方案

闭:指的是闭包函数是定义在一个函数内部的函数
包:该内部函数包含对外层函数作用域名字的引用

需要结合函数对象(函数可以当做函数的返回值去使用)的概念将闭包函数返回到全局作用域去使用,从而打破函数的层级限制

为函数参数体的两种方法:
1、参数传值
2.闭包函数传值

# def outter(x,y):
# # x=1
# # y=2
# def func():
# print(x+y)
# return func
#
# f=outter(1,2)
# f()


"""
原文地址:https://www.cnblogs.com/jxl123/p/9398209.html