博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
函数进阶
阅读量:5946 次
发布时间:2019-06-19

本文共 3031 字,大约阅读时间需要 10 分钟。

 

一、名称空间和作用域

存放名字与值的关系’的空间起了一个名字-------命名空间。

代码在运行伊始,创建的存储“变量名与值的关系”的空间叫做全局命名空间;

在函数的运行中开辟的临时的空间叫做局部命名空间

在python之禅中提到过:命名空间是一种绝妙的理念,让我们尽情的使用发挥吧!

二、名称空间的分类以及加载和调用顺序

命名空间一共分为三种:

  全局命名空间

  局部命名空间

  内置命名空间

*内置命名空间中存放了python解释器为我们提供的名字:input,print,str,list,tuple...它们都是我们熟悉的,拿过来就可以用的方法。

三种命名空间之间的加载与取值顺序:

加载顺序:内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程序运行中:调用时才加载)

取值顺序:

  在局部调用:局部命名空间->全局命名空间->内置命名空间

  在全局调用:全局命名空间->内置命名空间

综上所述,在找寻变量时,从小范围,一层一层到大范围去找寻。

作用域

作用域就是作用范围,按照生效范围可以分为全局作用域和局部作用域。

全局作用域:包含内置名称空间、全局名称空间,在整个文件的任意位置都能被引用、全局有效

globals和locals方法

 

print(globals())print(locals())def func():    a = 12    b = 20    print(locals())    print(globals())func(

 

三、global关键字,nonlocal关键字。

3.1global:

  1,声明一个全局变量。

  2,在局部作用域想要对全局作用域的全局变量进行修改时,需要用到 global(限于字符串,数字)。

 

def func():    global a    a = 3func()print(a)count = 1def search():    global count    count = 2search()print(count)

 ps:对可变数据类型(list,dict,set)可以直接引用不用通过global。

 

li = [1,2,3]dic = {
'a':'b'}def change(): li.append('a') dic['q'] = 'g' print(dic) print(li)change()print(li)print(dic)

3.2nonlocal:

  1,不能修改全局变量。

  2,在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变。

 

def add_b():    b = 42    def do_global():        b = 10        print(b)        def dd_nonlocal():            nonlocal b            b = b + 20            print(b)        dd_nonlocal()        print(b)    do_global()    print(b)add_b()

 

  

四、函数的嵌套

4.1函数嵌套调用

def max2(x,y):    m  = x if x>y else y    return mdef max4(a,b,c,d):    res1 = max2(a,b)    res2 = max2(res1,c)    res3 = max2(res2,d)    return res3# max4(23,-7,31,11)

4.2  函数的嵌套定义

def f1():    print("in f1")    def f2():        print("in f2")    f2()f1()###########def f1():    def f2():        def f3():            print("in f3")        print("in f2")        f3()    print("in f1")    f2()    f1()

五、函数的对象

5.1函数名本质上就是函数的内存地址

5.2 函数可以被引用

def func(x,y):    print(x,y)f=funcf(-1,2)

5.3 函数可以当做函数的参数传入

def foo():    print("from foo")def bar(func):    print(func())bar(foo)

 

5.4 函数可当做函数的返回值

def f1():    print('f1')def func1(argv):    argv()    return argvf = func1(f1)f()

 

5,5函数可以可以被当作容器类型的元素

def f1():    print('f1')def f2():    print('f2')def f3():    print('f3')l = [f1,f2,f3]d = {
'f1':f1,'f2':f2,'f3':f3}#调用l[0]()d['f2']()

六、闭包函数

61. 闭包函数定义

内部函数包含对外部作用域而非全剧作用域变量的引用,该内部函数称为闭包函数

函数内部定义的函数称为内部函数

def wrapper():    global name1    def inner():        name1 = 'alex'        # name1 = 'alex'        print(name1)wrapper()

6.2 判断闭包函数的方法__closure__

#输出的__closure__有cell元素 :是闭包函数def func():    name = 'eva'    def inner():        print(name)    print(inner.__closure__)    return innerf = func()f()#输出的__closure__为None :不是闭包函数name = 'egon'def func2():    def inner():        print(name)    print(inner.__closure__)    return innerf2 = func2()f2()

 

6.3闭包函数的应用

import requestsdef outter(url):    def get():        response=requests.get(url)        if response.status_code==200:            print(len(response.text))    return getbaidu=outter("https://www.baidu.com")baidu()
View Code

 

转载于:https://www.cnblogs.com/Robi-9662/p/8884147.html

你可能感兴趣的文章
什么是序列化,为什么要序列化
查看>>
Java保留小数点后有效数字
查看>>
C++中一些类和数据结构的大小的总结
查看>>
mysql开启binlog
查看>>
ctrl + z fg bg
查看>>
工作流引擎Oozie(一):workflow
查看>>
struct框架
查看>>
Deep Learning(深度学习)相关网站
查看>>
设置Eclipse编码方式
查看>>
分布式系统唯一ID生成方案汇总【转】
查看>>
并查集hdu1232
查看>>
oracle进行字符串拆分并组成数组
查看>>
100多个基础常用JS函数和语法集合大全
查看>>
Java8 lambda表达式10个示例
查看>>
innerHTML outerHTML innerText
查看>>
kafka安装教程
查看>>
go语言基础
查看>>
【Windows】字符串处理
查看>>
Spring(十八):Spring AOP(二):通知(前置、后置、返回、异常、环绕)
查看>>
CentOS使用chkconfig增加开机服务提示service xxx does not support chkconfig的问题解决
查看>>