目录:

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. spark中的多目录输出及压缩

    最近接到一个需求,需要对spark的结果分目录输出,百度之后找到了解决方案,大多都是spark 按照key分目录输出, 但是在文件当中,会把key也输出出来,在这里以key作为目录是想建hive表时把 ...

  2. IO流——字节流

    文件输出流 FileOutputStream:文件输出流是用于将数据写入 File,每次运行,都会覆盖之前文件中的数据 FileOutputStream(File file):创建一个向指定 File ...

  3. Sitecore客户体验成熟度模型之旅

    “成熟”这个词带来了很多想法:你在青年时不愿意找到工作?你四岁的孩子偶尔发脾气?可能还有你的公司能否在数字化时代提供个性化的客户体验? 你如何定义CX成熟度?如果您的CX战略仍处于开发阶段,您需要达到 ...

  4. 大一0基础小白用最基础C写哥德巴赫猜想

    #include <stdio.h>int main (){ int a,b,c,k,count1,count2; for(a=4;a<=1200;a=a+2){ for(b=2;b ...

  5. 1083 是否存在相等的差 PAT (Basic Level)

    题目链接: https://pintia.cn/problem-sets/994805260223102976/problems/994805260780945408 分析: 将某个差值的次数存在数组 ...

  6. R语言dataframe的常用操作总结

    前言:近段时间学习R语言用到最多的数据格式就是data.frame,现对data.frame常用操作进行总结,其中函数大部分来自dplyr包,该包由Hadley Wickham所作,主要用于数据的清洗 ...

  7. EF Core 批处理语句

    在Entity Framework Core (EF Core)有许多新的功能,最令人期待的功能之一就是批处理语句.那么批处理语句是什么呢?批处理语句意味着它不会为每个插入/更新/删除语句发送单独的请 ...

  8. RabbitMQ学习之Publish/Subscribe(3)

    上一个教程中,我们创建了一个work queue. 其中的每个task都会被精确的传送到一个worker. 这节,我们将会讲把一个message传送到多个consumers. 这种模式叫做publis ...

  9. docker学习之路-centos下安装docker

    前言 我要在云服务器上做一个asp.net core的webapi应用,使用docker来部署应用,中间用到的任何组件包括nginx和sqlserver 2017都是用docker来装载运行,所以,这 ...

  10. 模块化规范:AMD规范和CommonJs规范

    为什么模块很重要? 因为有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块. 但是,这样做有一个前提,那就是大家必须以同样的方式编写模块,否则你有你的写法,我有我的写法,岂不是乱 ...