python基础语法6 名称空间与作用域
目录:
1、函数对象
2、函数嵌套
3、名称空间
4、作用域
函数是第一类对象
1、函数名是可以被引用:
def index():
print('from index') a = index
a()
2、函数名可以当做参数传递
def foo(x,y,func):
print(x,y)
func()
def bar():
print('from bar') foo(1,2,bar) 结果:
1 2
from bar
3、函数名可以当做返回值使用
传参的时候没有特殊需求,一定不要加括号,加括号当场执行了
def index():
print('from index') def func(a):
return a a=func(index)
print(a) # <function index at 0x0000000000451E18>
a() # from index
4、函数名可以被当做容器类型的元素
def func():
print('from func') l1 = [1, '', func, func()] # 参数里有函数名和括号,直接运行, 输出from func f = l1[2]
print(f) # <function func at 0x0000000001D01E18>
def register():
print('register')
def login():
print('login')
def shopping():
print('shopping')
def pay():
print('pay') func_dic={'':register,'':login,
'':shopping,'':pay
} def main():
while True:
print("""
1.注册
2.登陆
3.购物
4.付款
5.退出
""")
choice = input("请输入对应的编号:").strip()
if choice=='':
break
if choice not in func_dic:
continue
else:
func_dic[choice]()
main()
函数的嵌套调用:在函数内调用函数
def index():
print('from index')
def func():
index()
print('from func')
func()
def func1(x,y):
if x>y:
return x
else:
return y def func2(x,y,z,a):
result=func1(x,y)
result=func1(result,z)
result=func1(result,a)
return result print(func2(1,2,454,7)) #454
函数的嵌套定义:
def index():
def home():
print('from home')
home() index() #from home
名词空间
什么是名称空间?
存放名字的空间
如果你想访问一个变量值,必须先方向对应的名称空间,拿到名字和对应的内存地址的绑定关系
名称空间的分类:
1、内置名称空间:
python提前给你的定义完的名字,就是存在内置名称空间
2、全局名称空间
存放于文件级别的名字,就是全局名称空间
if while for 内部定义的名字执行之后都存放于全局名称空间
3、局部名称空间
函数内部定义的所有名字都是存放于当前函数的内置名称空间
生命周期:
1、内置名称空间
在python解释器启动的时候生效,关闭解释器的时候失效
2、全局名称空间
当你启动当前这个py文件的时候生效,当前页面代码执行结束之后失效
3、局部名称空间
当你调用当前函数时生效,函数体最后一行代码执行结束就失效
def index():
x = 1 #
return x
print("index1",index) #全局空间打印全局空间函数 index1 <function index at 0x0000000002061E18>
def foo():
print("index2",index) #局部空间调用全局变量 index1 <function index at 0x0000000002061E18>
foo() print(print) #全局空间打印内置空间函数 <built-in function print> def index():
print(print) #局部空间打印内置空间函数 index() # <built-in function print>
if 1 == 1:
x = 1 #全局空间 print(x) while True:
a = 2
break print(a) #全局空间
for i in range(2):
print(i) print(i) # 1 打印最后一个i值
名称空间的查找顺序:
局部:局部 > 全局 > 内置
全局:全局 > 内置 # 内置再找不到就报错
函数内部使用的名字,在定义阶段已经规定死了,与你的调用位置无关(变量在局部内,函数嵌套关系会寻找上层;如果是函数互相调用,变量与其他函数变量无关)
x = 111
def func1():
x = 222
def func2():
x = 333
def func3():
# x = 444
def func4():
# x = 555
print(x) #调用嵌套最近的x,也就是x=333
print('from func4')
func4()
func3()
func2()
func1() #
x = 1 def wrapper():
x = 2
index() def index():
# x = 3
print(x) #找不到x,去全局变量找 wrapper() # 1
x = 1
def inner():
x = 2
def wrapper():
print(x)
wrapper() inner() #
x = 1 def index(arg = x): # 定义的时候,arg就被赋值了1
print(x)
print(arg) x = 2
index()
'''
2
1
'''
x = 111
def index():
def wrapper():
print(x) return wrapper
# return wrapper index()
x = 222
f = index()
f() #
作用域的分类:
1、全局作用域
全局可以调用的名字就存在于全局作用域
内置名称空间+全局名称空间
2、局部作用域
局部可以调用的名字就存放与局部作用域
局部名称空间
global:声明全局变量(***)
nonlocal:在局部名称空间声明局部变量,在局部修改上层函数的变量(*)
只有可变类型可以在局部修改外部变量的值 (*****)
错误案例:
b=2
def bar():
b+=3 # 报错,此处无法修改全局变量,但可以查询,如a=b return b
print(bar())
x=1 def index():
global x # 不可以写 global x =2
x=2
index() print(x) #
x=111
def index():
x=1
def func2():
x = 2
def func():
nonlocal x #局部变量关联上层,修改上层局部变量x
x = 3
func()
print(x) #
func2()
print(x) #
index()
print(x) # 111
# 局部变量的修改无法影响上层,上上层
def index():
x=1
def index2():
nonlocal x
x=2
index2()
print(x) index()
**可变类型可以在局部修改外部变量的值
l1=[]
def index(a):
l1.append(a)
print(l1) #[[...]]
index(l1) print(l1) #[[...]]
def func1():
l1=[1,2,3,4,5]
def func2():
l1.append(6)
return
func2()
print(l1) # [1, 2, 3, 4, 5, 6] func1()
print(l1) # [8, 8, 8]
python基础语法6 名称空间与作用域的更多相关文章
- python基础之函数名称空间与作用域
- python函数篇:名称空间、作用域和函数的嵌套
一.名称空间:(有3类) (1)内置名称空间(全局作用域) (2)全局名称空间(全局作用域) (3)局部名称空间(局部作用域) 关于名称空间的查询: x=1 def func(): print('fr ...
- python基础知识13---函数对象、函数嵌套、名称空间与作用域、装饰器
阅读目录 一 函数对象 二 函数嵌套 三 名称空间与作用域 四 闭包函数 五 装饰器 六 练习题 一 函数对象 1 函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 ...
- python基础之函数对象,嵌套,名称空间和作用域
函数对象: 函数是第一类对象的含义是函数可以被当作数据处理 函数可用于: def func(): print(‘func’) 1.引用 f = func 把内存地址赋值给f 2.当作参数传给一个函 ...
- python第十二天, 三元表达式, 函数对象,名称空间与作用域,函数的嵌套定义
复习 1. 字符串的比较: 2. 函数的参数:形参与实参 3. 实参的分类:位置实参与关键字实参 4. 形参分类: 1.无值位置形参 2.有值位置形参 3.可变长位置形参 4.有无值关键字形参 5.可 ...
- python之函数对象、函数嵌套、名称空间与作用域、装饰器
一 函数对象 一 函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 #3 返回值可以是函数 #3 可以当作容器类型的元素 二 利用该特性,优雅的取代多分支的if de ...
- python学习Day12 函数的默认值、三元表达式、函数对象(函数名)的应用场景、名称空间与作用域
复习 1.字符串的比较: -- 按照从左往右比较每一个字符,通过字符对应的ascii进行比较 2. 函数的参数 : 1)实参与形参: -- 形参:在函数定义时()中出现的参数 ...
- Python 的名称空间和作用域
最开始对名称空间的了解是在学习函数的时候,那时候知道了作用域的查找顺序,以及全局名称空间和局部名称空间,产生疑惑的时候为学递归的时候,那时候还没有名称空间这个概念,只知道递归有个最大深度,那时候以后递 ...
- python之旅:函数对象、函数嵌套、名称空间与作用域、装饰器
一 函数对象 一 函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 #3 返回值可以是函数 #3 可以当作容器类型的元素 二 利用该特性,优雅的取代多分支的if de ...
随机推荐
- AKKA Inbox收件箱
起因 得到ActorRef就可以给actor发送消息,但无法接收多回复,也不知道actor是否停止 Inbox收件箱出现就是解决这两个问题 示例 package akka.demo.actor imp ...
- 如何减少 webpack 构建 vue 项目的编译时间
背景 我司前端项目框架主要是 vue,多个项目聚集在同一个仓库下,共用公共组件.页面.工具函数等.基于以上前提,我们需要对不同的项目分别进行打包,并解决单页应用强制刷新引起的问题,所以没有使用 vue ...
- [原创]K8tools 20191111/K8工具合集
K8tools 20191111 声明: 工具仅供安全研究或授权渗透,非法用途后果自负. 下载: https://github.com/k8gege/K8tools PS: 不定期更新,文件比较大,可 ...
- idea 全局内容搜索和替换
在做项目时,有时会在整个项目里或指定文件夹下进行全局搜索和替换,这是一个很方便功能.使用方法如下: 一.全局搜索1.使用快捷键Ctrl+Shift+F打开搜索窗口,或者通过点击Edit–>Fin ...
- SpringCloud 基础
目录 SpringCloud 基础 一.概述 二.服务发现组件 Eureka 1. 介绍 2. 搭建 Maven 父工程 3. 创建 Eureka 集群 4. 创建服务提供方集群 5. 创建服务消费方 ...
- deepin安装卡在deepin标志界面解决方案
再次重启前将U盘插上,进系统前按快速选择启动装置F12(不同品牌电脑可能不同),选择从U盘启动: 进入第一个安装界面时一定要注意:在跳转前,按E进入grub设置界面,移动光标到倒数第二行的”quiet ...
- NOIP2018 填数游戏 搜索、DP
LOJ 感觉这个题十分好玩于是诈尸更博.一年之前的做题心得只有这道题还记得清楚-- 设输入为\(n,m\)时的答案为\(f(n,m)\),首先\(f(n,m)=f(m,n)\)所以接下来默认\(n \ ...
- 封装:Cmd命令调用和常用命令
原文:封装:Cmd命令调用和常用命令 一.Cmd命令调用方法 1.静态方法调用 class Program { static void Main(string[] args) { // Todo :打 ...
- Net操作RabbitMQ
原文:Net操作RabbitMQ 文章目录 1 安装 2 管理界面 3 RabbitMQ的基本概念 4 RabbitMQ的六种工作模式 4.1 简单模式 4.2 工作模式 4.3 发布/订阅模式 4. ...
- 掌握算法&数据结构的正确方式