码农学技术————六个月学习python全栈【Day12】

本文深入讲解了Python中的名称空间概念,包括内置、全局和局部名称空间,以及它们的加载顺序和销毁过程。此外,还介绍了global和nonlocal关键字的作用,以及函数名对象的用法和函数嵌套的特性和注意事项。
摘要由CSDN通过智能技术生成

今日学习目标:

  • 了解什么是名称空间,学会查找和理解其作用域
  • 理解运用global与nonlocal关键字
  • 对函数名和函数的嵌套有所理解

今日学习内容:

内容简要:

  • 名称空间
  • 作用域
  • global与nonlocal关键字
  • 函数名对象
  • 函数的嵌套

内容详细:

名称空间

是存放变量名与变量值绑定关系的地方

Python 的名称空间包括:

  • 内置名称空间
    存放python解释器内置的名字(例如:print、input、len)

    print(print)
    print(input)
    print(len)
    

    在这里插入图片描述
    存活周期:
    python解释器启动则产生,python解释器关闭则销毁


  • 全局名称空间
    在py文件中编写的代码运行产生的名字都会存到全局名称空间(也可以说是只要不是函数内定义、也不是内置的,剩下的都是全局名称空间的名字)

    name = 'jason'  # 变量名name存入全局名称空间
    
    
    def index():  # 函数名index存入全局名称空间
    	pass
    
    
    if True:
    	a = 111  # 变量名a存入全局名称空间
    for i in range(10):  # 变量名i存入全局名称空间
    	pass
    while True:
    	b = 222  # 变量名b存入全局名称空间
    

    存活周期:
    python文件执行则产生,python文件运行完毕后销毁


  • 局部名称空间
    在调用函数时,运行函数体代码过程中产生的函数内的名字

    a=1    #全局名称
    b=2    #全局名称
    def func(a,b):       #括号中的a,b就是局部名称
    	print(a,b)
    
    func(10,1)  #==>10 1
    

    存活周期:
    在调用函数时存活,函数调用完毕后则销毁。


名字的加载、销毁、查找顺序

名称解释
名称空间的加载内置名称空间==>全局名称空间==>局部名称空间
名称空间的销毁局部名称空间==>全局名称空间==>内置名称空间
名称查找优先级当前位置向上一层一层查找(当前位置在局部名称空间:局部名称空间==>全局名称空间==>内置名称空间)

在这里插入图片描述

举例:

示范1:

len = '我是全局名称空间中的len'
def index():
len = '我是局部名称空间中的len'
print(len)
index()  # 调用函数 函数体就会执行 就会产生局部名称空间
print(len)

示范2:函数嵌套定义

input=111
def f1():
	def f2():
    	input=333
    	print(input)
 	input=222

	f2()

f1()   #==>333

示范3:名称空间的"嵌套"关系是以函数定义阶段为准,与调用位置无关:

def index1():
	name = 'jason'
def index2():
	age = 18
	print(name)  # 报错
index1()
index2()

作用域

  • 1.什么是作用域 ?

    Python 的作用域决定了我们在程序中能否直接使用名称空间中的名称,直接访问的意思是指不需要在名称前添加名称空间的前缀。

  • 2.作用域分类:

    类别详情
    全局作用域内置名称空间、全局名称空间。特点:1.全局存活,2.全局有效:被所有函数共享
    局部作用域局部名称空间的名字。特点:1.临时存活,2.局部有效:函数内有效

    举例:

    x=111
    
    def foo():
    	print(x,id(x))
    
    def bar():
    	print(x,id(x))
    
    foo()
    bar()
    
    print(x,id(x))
    
    #执行结果:
    111 140723555909904
    111 140723555909904
    111 140723555909904
    
    

global与nonlocal关键字

名称解释
gloabl关键字局部修改全局不可变类型
nonlocal关键字修改函数外层函数包含的名字对应的值

举例

global声明时全局名称

示范1:如果在局部想要修改全局的名字对应的值(不可变类型),需要用global

x=111

def func():
    global x # 声明x这个名字是全局的名字,不要再造新的名字了
    x=222

func()

print(x,id(x))

#执行结果
222 140723555913456

示范2:如果在局部想要改全局的可变类型的名字里的值,不需要global

l=[111,222]
def func():
    l.append(333)

func()
print(l)

#执行结果
[111, 222, 333]

nonlocal(了解)

示范3:不可变类型:

x=0
def f1():
    x=11
    def f2():
        nonlocal x
        x=22
    f2()
    print('f1内的x:',x)

f1()#执行结果f1内的x: 22

示范4:可变类型:

def f1():
    x=[]
    def f2():
        x.append(1111)
    f2()
    print('f1内的x:',x)

f1()

#执行结果
f1内的x: [1111]

函数名对象

类型用法
用法1函数名可以当做变量名赋值
用法2函数名还可以当成函数的实参
用法3函数名还可以当做函数的返回值
用法4函数名可以作为容器类型的元素

举例

示范1:

def index():
    print('from function index')
print(index)
res = index  # 让res也指向函数体代码
print(res)
res()  # index()

#执行结果
<function index at 0x000002278D38F5E0>
<function index at 0x000002278D38F5E0>
from function index

示范2:

def index():
    print('from index')
def func(a):
    print('from func')
    print(a)
    a()
func(index)

#执行结果
from func
<function index at 0x0000018498DDF820>
from index

示范3:

def func():
    print('from func')
    return index  # 将函数名当做返回值
def index():
    print('from index')
res = func()  # res接收函数名
print(res)  # 指向的是index函数的内存地址
res()  # index()


#执行结果
from func
<function index at 0x0000024EC4C7F700>
from index

示范4:

def index():
    print('from index')
l1 = [11, 22, 33, 44, index]
print(l1)
l1[-1]()  #  index()

#执行结果
[11, 22, 33, 44, <function index at 0x000001430EC4F700>]
from index

函数的嵌套

函数的嵌套:在函数里面还有函数。分为外函数和内函数。
嵌套函数是为函数内部服务的,比如减少代码的重复,想要调用函数,要使用函数名,内函数也一样。如果不用函数名调用内函数,内函数就永远不会执行。

举例

def f1():  #print('in f3')
    def f2():  #print('in f1')
        def f3():  #print('in f2')
            print('in f3')
        print('in f2')
        f3()
    print('in f1')
    f2()
f1()

执行结果:
in f1
in f2
in f3

注意
1.函数嵌套时一定要记住函数是先定义再调用
2.当函数只有定义时就可以直接跳过该函数代码段,因为没有调用的函数就相当于该函数没写的效果一样
3.如果不是嵌套关系 那么函数之间就是互不干涉!!!


今日学习时间:

这里统计计划学习的时间

1、 上午8:30~12:30
2、 下午2:30~5:30
3、 晚上6:30~9:30


今日学习产出:

这里统计学习计划的总量

  • 1、 技术笔记 1遍
  • 2、CSDN 技术博客 1篇
  • 3、每日录音,预习明日内容
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值