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

"""

# 函数进阶

命名空间和作用域

命名空间
全局命名空间——我们自己写的非函数中的代码
是在程序从上到下被执行的过程中依次加载进内存的,
放置了我们设置的所有的变量名和函数名, 局部命名空间,——函数
就是函数内部定义的名字
在函数调用的时候才会产生这个命名空间,随着函数调用的结束,这个命名空间就消失了, 内置命名空间,——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. UVA-101 The Blocks Problem 栈模拟

    终于AC了,这道题目去年寒假卡得我要死,最后一气之下就不做了...想想居然一年之久了,我本来都快忘了这道题了,最近发现白书的奥秘,觉得刘汝佳的题目真的相当练思维以及对代码的操作,决定又刷起题目来,这时 ...

  2. ZOJ 2301/HDU 1199 线段树+离散化

    给这个题目跪了两天了,想吐简直 发现自己离散化没学好 包括前一个离散化的题目,实际上是错了,我看了sha崽的博客后才知道,POJ那题简直数据弱爆了,本来随便一组就能让我WA掉的,原因在于离散化的时候, ...

  3. MSE(均方误差)、RMSE (均方根误差)、MAE (平均绝对误差)

    1.MSE(均方误差)(Mean Square Error) MSE是真实值与预测值的差值的平方然后求和平均. 范围[0,+∞),当预测值与真实值完全相同时为0,误差越大,该值越大. import n ...

  4. 吴裕雄--天生自然 JAVASCRIPT开发学习:Math(算数) 对象

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  5. java反射修改静态方法的值setAccessible

    这几天闲来无事.在网上看了一个题目,相信大家都知道这个题目  static void change(String str){         str="welcome";     ...

  6. bugs开发异常解决方法

    1.      前提 第一层:遇到异常首先必须告诉自己,冷静,不要慌.(一看到Bug就心慌,那么就不能释放必杀技) 2.      入门级 第二层:遇到Bug,第一潜意识看输出异常的信息的(控制台输出 ...

  7. IOC 本质是为了实现 AOP|火影鸣人

    @JFinal 波总在 JFinal 4.8 发布新闻的评论 中给出了下面的表述: IOC 本质是为了实现 AOP 我有点吃惊, 没想到 Java 界的大佬对这两个概念有和我完全不一致的认识. 所以写 ...

  8. cin cout

    编写一个程序,要求用户输入一串整数和任意数目的空格,这些整数必须位于同一行中,但允许出现在该行的任何位置.当用户按下enter键,数据输入停止.程序自动对所有的整数进行求和并打印出结果. 需要解决两个 ...

  9. 题解-------CF235B Let's Play Osu!

    传送门 题目大意 求出总得分的期望值. 思路 还没有学习数学期望的小朋友赶紧去学一下数学期望,这里只提供公式: $E\left ( x \right )=\sum_{k=1}^{\infty }x_{ ...

  10. 有关iOS热更新

    iOS热更新的几篇文章,看完这几篇,自己集成一下.下面说一下我集成时遇到的问题. 这是原作者的JSPatch的讲解的文章:<JSPatch – 动态更新iOS APP>.<JSPat ...