码迷,mamicode.com
首页 > 编程语言 > 详细

python 函数进阶

时间:2018-08-23 02:08:50      阅读:202      评论:0      收藏:0      [点我收藏+]

标签:报错   内部函数   直接   内存   code   命名   上层   修改   消失   

函数进阶

# a = 1
# def func():
#     print(a)
# func()
# 函数外面定义的变量在函数里面能用,
# 在函数里面定义的变量在函数外面不能用
# def func():
#     a = 1
# func()
# print(a)   # 报错

命名空间和作用域

内置命名空间 -- Python解释器

  Python解释器一启动就将可以使用的名字储存在内置命名空间中

  内置的名字在启动解释器的时候被加载进内存里

全局命名空间-- 我们写的函数之外的代码

  是在程序从上至下执行的过程中依次加载进内存的
  放置了我们设置的所有变量和函数名
局部命名空间 -- 函数
  就是函数内部定义的名字
  当调用函数的时候才会产生这个命名空间,随着函数执行的结束,这个命名空间就又消失了
在局部:可以使用内置,全局命名空间中的名字
在全局:可以使用内置命名空间中的名字,但不能使用局部命名空间中的名字
在内置:是不能使用局部和全局命名空间的名字的

 

# def max():
#     print(in max func)
# max()

# def max(l):
#     print(in max func)
# print(max([1,2,3]))
# 在正常情况下,直接使用内置的名字,
# 当我们在全局定义了和在内置空间一样的名字时,会使用全局的名字
# 当自己有的时候,就不找自己的上级要了
# 如果自己没有就找上级要,上级没有再找上一级,内置的命名空间都没有的话直接报错
# 多个函数用该有多个独立的局部名字空间,不互相共享
#
# def input():
#     print(in input now!)
#
# def func():
#     input()  # 调用input()
# func()

# def func():
#     # input = 1
#     print(func)
# func()  #---><function func at 0x000001B08D6FC1E0>

# def func1():
#     a = 1
# def func2():
#     print(a)
# 两个局部命名空间相互独立不能共享

# func --> 函数的内存地址
# 函数名()--> 函数的调用
# 函数的内存地址() --> 函数的调用

作用域

  全局作用域 --> 作用在全局-->内置和全局名字空间中的名字都属于全局作用域 --> globals()
   局部作用域 --> 作用在局部 -->函数(局部名字空间中的名字属于局部作用域) --> locals()

# a = 1
# def func():
#     global a
#     a += 1
# func()
# print(a)
#  对于不可变数据类型,在局部可以查看全局作用域中的变量
# 但是不能直接修改,
# 如果想要修改,需要在程序一开始添加 global 声明
# 如果在一个局部(函数)内声明了一个global 变量,那么这个变量在局部的所有操作将对全局有效
# a = 1
# b = 2
# def func():
#     x = aaa
#     y = bbb
#     print(locals())
# func()
# print(globals())

# def func():
#      x = aaa
#      y = bbb
#      print(locals())
#      print(globals())
# func()
# print(locals()) # 本地的 在局部本地就是局部在全局本地就是全局
# print(globals())
# globals 永远打印全局的名字
# locals 输出什么 根据locals所在的位置

函数的嵌套和作用域链

  函数的嵌套调用

# def max(a, b):
#     return a if a > b else b
# def the_max(x, y, z): # 函数的嵌套调用
#     c = max(x, y)
#     return max(c, z)
# print(the_max(1, 2, 3))

  函数的嵌套定义

# a = 1
# def outer():
#     a = 1
#     def inner():
#         a = 2
#         print(a)
#         print(inner)
#         def inner2():
#             nonlocal a # 声明了一个上面第一层局部变量
#             a += 1 # 不可变数据类型的修改
#             print(inner2)
#         inner2()
#         print(##a##, a)
#     inner()
#     print(**a**, a)
# outer()
# print(全局, a)
# nonlocal 只能用于局部变量,找上层中离当前函数最近一层的局部变量
# 声明了nonlocal 的内部函数的变量修改会影响到上层中离当前函数最近一层的局部变量
# 对全局无效 对局部也只是对最近的一层有影响

  函数名的本质:函数的内存地址

# a = 1
# def outer():
#     a = 1
#     def inner():
#         a = 2
#         print(a)
#         print(inner)
#         def inner2():
#             nonlocal a # 声明了一个上面第一层局部变量
#             a += 1 # 不可变数据类型的修改
#             print(inner2)
#         inner2()
#         print(##a##, a)
#     inner()
#     print(**a**, a)
# outer()
# print(全局, a)
# nonlocal 只能用于局部变量,找上层中离当前函数最近一层的局部变量
# 声明了nonlocal 的内部函数的变量修改会影响到上层中离当前函数最近一层的局部变量
# 对全局无效 对局部也只是对最近的一层有影响

 

python 函数进阶

标签:报错   内部函数   直接   内存   code   命名   上层   修改   消失   

原文地址:https://www.cnblogs.com/-1206-/p/9521249.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!