目录:

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 名称空间与作用域的更多相关文章

  1. python基础之函数名称空间与作用域

  2. python函数篇:名称空间、作用域和函数的嵌套

    一.名称空间:(有3类) (1)内置名称空间(全局作用域) (2)全局名称空间(全局作用域) (3)局部名称空间(局部作用域) 关于名称空间的查询: x=1 def func(): print('fr ...

  3. python基础知识13---函数对象、函数嵌套、名称空间与作用域、装饰器

    阅读目录 一 函数对象 二 函数嵌套 三 名称空间与作用域 四 闭包函数 五 装饰器 六 练习题 一 函数对象 1 函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 ...

  4. python基础之函数对象,嵌套,名称空间和作用域

    函数对象: 函数是第一类对象的含义是函数可以被当作数据处理 函数可用于: def func(): print(‘func’) 1.引用  f = func  把内存地址赋值给f 2.当作参数传给一个函 ...

  5. python第十二天, 三元表达式, 函数对象,名称空间与作用域,函数的嵌套定义

    复习 1. 字符串的比较: 2. 函数的参数:形参与实参 3. 实参的分类:位置实参与关键字实参 4. 形参分类: 1.无值位置形参 2.有值位置形参 3.可变长位置形参 4.有无值关键字形参 5.可 ...

  6. python之函数对象、函数嵌套、名称空间与作用域、装饰器

    一 函数对象 一 函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 #3 返回值可以是函数 #3 可以当作容器类型的元素 二 利用该特性,优雅的取代多分支的if de ...

  7. python学习Day12 函数的默认值、三元表达式、函数对象(函数名)的应用场景、名称空间与作用域

    复习 1.字符串的比较: -- 按照从左往右比较每一个字符,通过字符对应的ascii进行比较 2. 函数的参数 : 1)实参与形参:       -- 形参:在函数定义时()中出现的参数       ...

  8. Python 的名称空间和作用域

    最开始对名称空间的了解是在学习函数的时候,那时候知道了作用域的查找顺序,以及全局名称空间和局部名称空间,产生疑惑的时候为学递归的时候,那时候还没有名称空间这个概念,只知道递归有个最大深度,那时候以后递 ...

  9. python之旅:函数对象、函数嵌套、名称空间与作用域、装饰器

    一 函数对象 一 函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 #3 返回值可以是函数 #3 可以当作容器类型的元素 二 利用该特性,优雅的取代多分支的if de ...

随机推荐

  1. AKKA Inbox收件箱

    起因 得到ActorRef就可以给actor发送消息,但无法接收多回复,也不知道actor是否停止 Inbox收件箱出现就是解决这两个问题 示例 package akka.demo.actor imp ...

  2. 如何减少 webpack 构建 vue 项目的编译时间

    背景 我司前端项目框架主要是 vue,多个项目聚集在同一个仓库下,共用公共组件.页面.工具函数等.基于以上前提,我们需要对不同的项目分别进行打包,并解决单页应用强制刷新引起的问题,所以没有使用 vue ...

  3. [原创]K8tools 20191111/K8工具合集

    K8tools 20191111 声明: 工具仅供安全研究或授权渗透,非法用途后果自负. 下载: https://github.com/k8gege/K8tools PS: 不定期更新,文件比较大,可 ...

  4. idea 全局内容搜索和替换

    在做项目时,有时会在整个项目里或指定文件夹下进行全局搜索和替换,这是一个很方便功能.使用方法如下: 一.全局搜索1.使用快捷键Ctrl+Shift+F打开搜索窗口,或者通过点击Edit–>Fin ...

  5. SpringCloud 基础

    目录 SpringCloud 基础 一.概述 二.服务发现组件 Eureka 1. 介绍 2. 搭建 Maven 父工程 3. 创建 Eureka 集群 4. 创建服务提供方集群 5. 创建服务消费方 ...

  6. deepin安装卡在deepin标志界面解决方案

    再次重启前将U盘插上,进系统前按快速选择启动装置F12(不同品牌电脑可能不同),选择从U盘启动: 进入第一个安装界面时一定要注意:在跳转前,按E进入grub设置界面,移动光标到倒数第二行的”quiet ...

  7. NOIP2018 填数游戏 搜索、DP

    LOJ 感觉这个题十分好玩于是诈尸更博.一年之前的做题心得只有这道题还记得清楚-- 设输入为\(n,m\)时的答案为\(f(n,m)\),首先\(f(n,m)=f(m,n)\)所以接下来默认\(n \ ...

  8. 封装:Cmd命令调用和常用命令

    原文:封装:Cmd命令调用和常用命令 一.Cmd命令调用方法 1.静态方法调用 class Program { static void Main(string[] args) { // Todo :打 ...

  9. Net操作RabbitMQ

    原文:Net操作RabbitMQ 文章目录 1 安装 2 管理界面 3 RabbitMQ的基本概念 4 RabbitMQ的六种工作模式 4.1 简单模式 4.2 工作模式 4.3 发布/订阅模式 4. ...

  10. 掌握算法&数据结构的正确方式