博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

函数 / 命名空间 / 闭包

Posted on 2018-12-29 20:25  GraceNana  阅读(136)  评论(0编辑  收藏  举报

三元运算符

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)