###############    函数的命名空间和作用域    ##############

"""

# 函数进阶

命名空间和作用域

命名空间
全局命名空间——我们自己写的非函数中的代码
是在程序从上到下被执行的过程中依次加载进内存的,
放置了我们设置的所有的变量名和函数名, 局部命名空间,——函数
就是函数内部定义的名字
在函数调用的时候才会产生这个命名空间,随着函数调用的结束,这个命名空间就消失了, 内置命名空间,——Python解释器,
就是Python解释器一启动就可以使用的名字,存储在内置的命名空间中,比如print,input,list等,
内置的名字,在启动解释器的时候就会加载进去内存中, 在全局我们可以使用内置的明明靠空间,但是不能使用局部的,
在局部我们可以使用全局的,内置的命名空间,
在内置的里面不能使用全局的和局部的, 所以就像是一个套娃一样,最外层是内置的,然后是全局的,然后是局部的, 如果我们定义在全局定义了和内置的函数同名的名字,会使用全局的, """ def input():
print(123) def func():
# input=1
print(input) func() """
作用域 作用域和命名空间是分不开的, 作用域有两种,
1,全局作用域,内置和全局的命名空间,都是全局作用域,
2,局部作用域,我们现在就知道一个局部,就是函数, 对于不可变类型,你可以在局部查看全局的变量,但是不能修改,如果要修改,你就需要使用global进行声明,
自己的代码中应该尽量少使用global,这样会导致代码非常不安全,混乱,
""" a =1 # def func():
# global a
# a += 1
# func()
# print(a) def func(a):
a += 1
return a
# 不使用global,可以使用另一种方法
a = func(a)
print(a) # 2 """
globals
locals """
a =1
b = 2
def func():
x = "aaa"
y = "bbb"
print(locals()) # 会打印出所有的局部变量的名字和值, {'y': 'bbb', 'x': 'aaa'}
print(globals()) # 这个还是全局的, func()
print(globals()) # 会打印出所有全局的名字,和内置的变量的名字,然后是函数名,
print(locals()) # print(globals()),这个打印出的本地和全局是一样的,

###############    函数的嵌套调用,函数的嵌套定义    ##############

# 函数的嵌套调用

# 两个数判断最大值
def max(a,b):
return a if a>b else b # 三元运算,a大于b,就是a,否则就是b, # 三个数判断最大值,先判断两个,然后再判断和第三个,
def the_max(x,y,z):
c = max(x,y) # 这就是函数的嵌套调用,
return max(c,z) # 函数的嵌套定义,
# nonlocal 找离当前函数最近的一个局部变量,只会影响最近的一层,不能是全局变量,
def outer():
a = 1
def innner():
print(123,)
def innner2():
nonlocal a
a += 1
print(a)
innner2()
innner() # 一定要有这一句,否则内部定义的函数,不会生效, outer() # 函数名就是一个内存地址,
# 1,函数名可以赋值
# 2,函数名可以作为容器类型的元素,
# 3,函数可以作为参数调用,# 函数可以作为参数调用,
def func1():
print(123)
func2=func1 # 函数名可以赋值 func2() list1=[func1,func2] # 函数名可以作为容器类型的元素, def func3(func1): # 函数可以作为参数调用,
func1()
return func1 # 函数名可以作为函数的返回值,

###############    函数的闭包    ##############

# 闭包
def outer():
a = 1
def inner():
print(a)
print(inner.__closure__) # 这个inner函数就是一个闭包函数
inner()
outer()
outer()
outer()
"""
(<cell at 0x0000000009C7BF78: int object at 0x000000005AA560A0>,)
1
(<cell at 0x0000000009C7BF78: int object at 0x000000005AA560A0>,)
1
(<cell at 0x0000000009C7BF78: int object at 0x000000005AA560A0>,)
1
"""
# 这种是闭包,但是这种写法比较浪费资源,每次都要生成a变量,
# 闭包的定义,就是一个嵌套函数,并且内部函数调用外部函数的变量,如果你没有调用外部函数的变量,就不是一个闭包,
# 所以闭包至少是两个条件,1是嵌套函数,2是内部的函数要使用到外部函数的变量, # 优化这种写法:
def outer():
a = 1
def inner():
print(a)
print(inner.__closure__) # (<cell at 0x0000000009C68FA8: int object at 0x000000005EA960A0>,),有cell就是一个闭包,
return inner # 在外部函数中返回内部函数的名字,这就是一个闭包最常用的方式,
# 闭包最常用的形式是在外部函数中返回内部函数,
inn = outer() # (<cell at 0x0000000009C7BF78: int object at 0x000000005A6B60A0>,)
inn() #
inn() #
inn() #
inn() # 1 # 这种写法我调用这个函数100次,但是里面的a变量就只会生成一次了,不会反复生成了,节省资源,
"""
(<cell at 0x000000000B90BF78: int object at 0x000000005AA560A0>,)
1
1
1
1
"""

#############################################

############################################

python语法基础-函数-进阶-长期维护的更多相关文章

  1. python语法基础-面向对象-进阶-长期维护

    ###############    @property定义属性    ############## # 所以对于定义属性你有好几种方式了和种类了,# 静态属性,动态属性, # property # ...

  2. python语法基础-函数-递归函数-长期维护

    ###############    递归   ############## # 递归的定义——在一个函数里再调用这个函数本身 # 递归的最大深度——998 # 二分查找算法 # 你观察这个列表,这是 ...

  3. python语法基础-异常操作-长期维护

    ###############    python-异常的操作  ############### # 异常:python解释器遇到一个错误,会停止程序的执行,并且提示错误信息,这就是异常, # 抛出异 ...

  4. python语法基础-文件操作-长期维护

    ###############    python-简单的文件操作  ############### # python中文件的操作 # 文件操作的基本套路 # 1,打开文件,默认是是只读方式打开文件 ...

  5. python语法基础-常用模块-长期维护

    ###############      常用模块   ################ # 常用模块: # 1,collections模块 # 2,时间模块,time模块,datatime模块 # ...

  6. python语法基础-函数-迭代器和生成器-长期维护

    ###############    迭代器    ############## """ 迭代器 这是一个新的知识点 我们学习过的可以迭代的对象有哪些? list str ...

  7. python语法基础-函数-内置函数和匿名函数-长期维护

    ##################     内置函数        #######################  """ 一共是 68个内置函数: 反射相关的内置函 ...

  8. python语法基础-函数-装饰器-长期维护

    ######################################################### # 装饰器 # 装饰器非常重要,面试Python的公司必问, # 原则:开放封闭原则 ...

  9. python语法基础-函数-基础-长期维护

    ###############    函数的定义调用,返回值和返回值接收    ############## def mylen(): s = "myname" i = 0 for ...

随机推荐

  1. gulp 学习入门

    const gulp = require('gulp'); const less = require('gulp-less') // 定义任务 gulp.task('helloGulp',functi ...

  2. A - Period(kmp的next数组的应用)

    For each prefix of a given string S with N characters (each character has an ASCII code between 97 a ...

  3. Python笔记_第一篇_面向过程_第一部分_0.开场白

    *什么是Python? Python是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido(吉多) van Rossum于1989年发明,第一个公开版本发行于1991年.在国外应用非常的广泛,国 ...

  4. format 可以用 * 星号

    procedure TForm1.FormCreate(Sender: TObject); var s:string; a:integer; b:Single; begin a:=; b:=108.4 ...

  5. 为什么在SSM中的dao层不用写@Repository注解

    1.  Mybatis 接口编程中dao 层接口没有注解和 为什么能被实例化为bean? 在Spring配置Mybatis的文件中我们可以看到如下代码: <bean class="or ...

  6. Gym102361E Escape

    Link 首先我们可以推出一些有用的结论: 1.任意两个机器人之间的路线不能重合,但是可以垂直交叉. 2.如果一个格子没有转向器,那么最多允许两个机器人以相互垂直的方向通过. 3.如果一个格子有转向器 ...

  7. PAT Advanced 1037 Magic Coupon (25) [贪⼼算法]

    题目 The magic shop in Mars is ofering some magic coupons. Each coupon has an integer N printed on it, ...

  8. tif图片压缩

    tif图片在ImageIo.read获取时,返回为空,导致无法使用,百度了很久,很多人说jai可以,便去看了下,总结如下: public static void CompressPic(String ...

  9. 天融信(NAT)地址转换端口映射配置

    目的地址为公司的公网地址 服务:选择或者自己定义一个端口号,就是要映射到服务器上的那个端口号 目的地址转换为:服务器ip 目的端口转换为:选择定义的服务(端口号) 规则描述:随便写

  10. linux epoll ET边沿触发

    /***EPOLL ET 触发必须使用非阻塞,LT触发可以阻塞/非阻塞.*read 函数 非阻塞读需 忙轮寻 soket关闭返回0,循环读完数据*如果已经读完再读read返回 -1,errno=11( ...