函数 / 命名空间 / 闭包

Posted gracenana

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数 / 命名空间 / 闭包相关的知识,希望对你有一定的参考价值。

三元运算符

def my_max(a,b):
    return a if a>b else b     #当a>b成立返回a,否则返回b

参数:

实参 : 1.位置参数 2. 关键字参数 3. 混合参数

形参 : 1.位置参数 2. 默认值参数  

动态传参:

1. 动态接收位置参数

def func(a, b, *arg):    #动态接受参数是:动态参数必须在位置参数之后
    pass     

2.接收默认值参数

def fruit(a, b, c=apple, *food): 
    pass

三种参数顺序 : 位置参数, 动态参数*, 默认值参数 

3.动态接受关键词参数

def func(**kwargs):
    pass
func(a=1, b=2, c=3) 
func(a=1, b=2) 

最终顺序(*):    位置参数 >  *args > 默认值参数 > **kwargs

命名空间(存储变量)

分类

1.全局命名空间  → 直接在py文件中,函数外声明的变量都属于全局命名空间

2.局部命名空间  → 在函数中声明的变量会放在局部命名空间

3.内置命名空间  → 存放python解释器为我们提供的名字,list,tuple,str,int这些都是内置命名空间

取值顺序:

  1.局部命名空间

  2.全局命名空间

  3.内置命名空间

作用域(作用范围)

分类

1.全局作用域 : 全局命名空间 + 内置命名空间

2.局部作用域 : 局部命名空间 

globals()   # 打印全局作用域中的内容

locals()    #打印局部作用域中的内容

global 和 nonlocal

global表示不再使用局部作用域的内容,而改用全局作用域中的变量

a = 100 
def func():   
    global a    #可以修改全局变量a,仅限当前函数使用
    a = 28    
    print(a) 

func() 
print(a)    # ===>>28   28

nonlocal表示在局部作用域中,调用父级命名空间的变量

函数名的运用

1.函数名的内存地址 print(func)   ==>   <function func at 0x1101e4ea0>

2.函数名可以赋值给其他变量

3.函数名可以当做容器类的元素

4.函数名可以当做函数的参数

5.函数名可以作为函数的返回值

闭包 内层函数,对外层函数(非全局)的变量的引用

def outer():    
    name = "Amy"    
    # 内部函数    
    def inner():        
        print(name)    
    return inner   #外部函调用内部函数
    
fn = outer()   # 访问外部函数, 获取到内部函数的函数地址
fn()    

闭包好处: 在外界可以访问内部函数; 内部函数访问了外层函数的变量.这个变量将会常驻内存,供后面的程序使用

from urllib.request import urlopen
def web_content():
    content = urlopen(https://tieba.baidu.com/).read().decode("utf-8")
    def get_content():
        return content     #储存content的内容,方便后续使用
    return get_content

fn = web_content()
content = fn()
print(content)

 

以上是关于函数 / 命名空间 / 闭包的主要内容,如果未能解决你的问题,请参考以下文章

python入门基础-三元表达式命名空间作用域函数名本质闭包

函数进阶------闭包函数

第四节:命名空间

闭包函数

Python之命名空间闭包装饰器

python函数之进阶 函数嵌套,命名空间,闭包