python语法基础-函数-进阶-长期维护
############### 函数的命名空间和作用域 ##############
""" # 函数进阶 命名空间和作用域 命名空间
全局命名空间——我们自己写的非函数中的代码
是在程序从上到下被执行的过程中依次加载进内存的,
放置了我们设置的所有的变量名和函数名, 局部命名空间,——函数
就是函数内部定义的名字
在函数调用的时候才会产生这个命名空间,随着函数调用的结束,这个命名空间就消失了, 内置命名空间,——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语法基础-函数-进阶-长期维护的更多相关文章
- python语法基础-面向对象-进阶-长期维护
############### @property定义属性 ############## # 所以对于定义属性你有好几种方式了和种类了,# 静态属性,动态属性, # property # ...
- python语法基础-函数-递归函数-长期维护
############### 递归 ############## # 递归的定义——在一个函数里再调用这个函数本身 # 递归的最大深度——998 # 二分查找算法 # 你观察这个列表,这是 ...
- python语法基础-异常操作-长期维护
############### python-异常的操作 ############### # 异常:python解释器遇到一个错误,会停止程序的执行,并且提示错误信息,这就是异常, # 抛出异 ...
- python语法基础-文件操作-长期维护
############### python-简单的文件操作 ############### # python中文件的操作 # 文件操作的基本套路 # 1,打开文件,默认是是只读方式打开文件 ...
- python语法基础-常用模块-长期维护
############### 常用模块 ################ # 常用模块: # 1,collections模块 # 2,时间模块,time模块,datatime模块 # ...
- python语法基础-函数-迭代器和生成器-长期维护
############### 迭代器 ############## """ 迭代器 这是一个新的知识点 我们学习过的可以迭代的对象有哪些? list str ...
- python语法基础-函数-内置函数和匿名函数-长期维护
################## 内置函数 ####################### """ 一共是 68个内置函数: 反射相关的内置函 ...
- python语法基础-函数-装饰器-长期维护
######################################################### # 装饰器 # 装饰器非常重要,面试Python的公司必问, # 原则:开放封闭原则 ...
- python语法基础-函数-基础-长期维护
############### 函数的定义调用,返回值和返回值接收 ############## def mylen(): s = "myname" i = 0 for ...
随机推荐
- 74)搭建TCP服务器
补充: 1-->listen是监听,就是监听你建立的那个socket那个窗口,要是有客户端来了,那么就把他加到 队列里面,然后accept是从队列中取客户端(就是把对应的客人的信息拿过来,交给w ...
- Thread.sleep 与Thread.currentThread.sleep 相同
package com.citi.tm.api.trade.mongo; public class ThreadTest { public static void main(String[] args ...
- SQL基础教程(第2版)第3章 聚合与排序:3-3 为聚合结果指定条件
第3章 聚合与排序:3-3 为聚合结果指定条件 ● 使用COUNT函数等聚合函数对表中数据进行汇总操作时,为其指定条件的不是WHERE子句,而是HAVING子句.● 聚合函数可以在SELECT子句. ...
- UML-重构
1.重构是什么? 重构是重写或重新构建已有代码的结构化和规律性方法,但不会改变已有代码的外在行为,而是采用一系列少量转换的步骤,并且每一步都结合了重新执行的测试.重构并不是全部推翻原有代码结构. 2. ...
- 数字证书原理(ssl,https)
https://blog.csdn.net/qq_34115899/article/details/81298284 关于私钥公钥数字签名数字证书.https.RSA的一些讲解 http://www. ...
- Java学习十六
学习内容: 1.做毕设 2.Java异常类 3.Java包装类 1.System.exit(1):终止程序运行,终止final执行方法 2.throws抛出异常类型,throw抛出异常对象 用法:th ...
- 系统 win 10 专业版 下载地址
thunder://QUFodHRwOi8veHoyLjgxMDg0MC5jb20vY25fd2luZG93c18xMF9jb25zdW1lcl9lZGl0aW9uc192ZXJzaW9uXzE4MD ...
- ccs-基础-阴影
1.html代码 <div class="demo demo1">假如生活欺骗了你</div> <div class="demo demo2 ...
- html5中如何去掉input type date默认样式
html5中如何去掉input type date默认样式 1.时间选择的种类: HTML代码: 选择日期:<input type="date" value="20 ...
- 遇到屏蔽selenium的站点如何突破
访问某团外卖,查看下一页商家信息,正常浏览器可以打开, selenium打开就404, 分析请求参数,生成方法最后定位到 rohr*.js 而且有判断selenium特征 抓耳挠腮搞了半天没把这个j ...