函数

本章内容

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

名称空间

# 名称空间
	用大白话来说就是存放变量名与变量值绑定关系的地方
# 名称空间的分类
    1.内置名称空间
    	python解释器提前定义好的
        len() print() open()之类的
    2.全局名称空间
    	在py文件中编写的代码运行产生的名字都会存到全局名称空间
         eg:
            name = 'jason'   #  变量名name 存到全局名称空间
            def index():     #  函数名index 存到全局名称空间
                pass
            if True:         
                a = 111      # 变量名 a 存到去全局名称空间
            for i in range(10): # 变量名i存到全局名称空间
			   pass
        	while True:      
                b = 'jason'   # 变量名b存入全局名称空间
    3.局部名称空间
    	函数体代码运行产生的都是局部名称空间
        def index():
            name = 'jason'  # name 存入局部名称空间
            
# 存活周期
    1.内置名称空间
    	python解释器运行  产生
        python解释器关闭  销毁
    2.全局名称空间
    	py文件开始运行 产生
        py文件运行结束  销毁
    3.局部名称空间
    	函数体代码开始运行  产生
        函数体代码运行结束  销毁

名字的查找顺序

"""
名称空间是用来存放名字与值绑定关系的地方
如果要查找一个名字 则会遵循先后顺序去查找
"""
# 在查找名字的时候,一定要先搞清楚自己在哪个空间
1.如果在局部名称空间
	局部名称空间 >>>> 全局名称空间 >>>>> 内置名称空间
2.如果在全局名称空间
	全局名称空间 >>>> 内置名称空间
# 想办法让三个名称空间中都有相同的名字
len = '我是全局名称空间中的len'
def index():
    len = '我是局部名称空间中的len'
    print(len)
index()        # 调用函数 函数体就会执行 就会产生局部名称空间
print(len)               
image-20220317161236298

作用域

# 作用域就是名称空间能够作用的范围
内置名称空间
	程序任意阶段任意位置均可使用(全局有效)
全局名称空间
	程序任意阶段任意位置均可使用(全局有效)
局部名称空间	
	一般情况下只在各自局部名称空间中有效(局部有效)
  '''也可以通过一些手段打破规则'''

global与nonlocal关键字

'''gloabl关键字:局部修改全局不可变类型'''
x = 1111
def s():
    global x           #   申明 修改的是全局x而不是产生新的x
    x = 6666
s()
print(x)

l1 = [111, 222, 333]
def index():
    l1.append(444)
index()
print(l1)            #    [111, 222, 333, 444]
"""
如果想要在局部修改全局的不可变类型
    需要提前加关键字global申明
如果想要在局部修改全局的可变类型
    不需要加关键字global申明
"""


image-20220317161436902 image-20220317161514010
def index():
    x = 111  # 在index的局部产生一个x=111
    l1 = [11, 22, 33]
    def f1():
        # x = 222  # 在f1的局部产生一个x=222
        # print(x)
        # 局部名称空间嵌套 内层修改外层
        # nonlocal x
        # x = 333
        l1.append(44)
    f1()
    print(x)
    print(l1)
index()
"""
局部名称空间嵌套的情况下 内层如果想要修改外层
    情况1数据是不可变类型
        需要使用关键字nonlocal
    情况2数据是可变类型
        不需要使用关键字nonlocal
"""
image-20220317161652079 image-20220317161740622

函数名的多种用法

# def index():
#     print('from function index')
# 用法1:函数名可以当做变量名赋值
# print(index)
# res = index  # 让res也指向函数体代码
# print(res)
# res()  # index()
image-20220317162007554
# 用法2:函数名还可以当成函数的实参
# def index():
#     print('from index')
# def func(a):
#     print('from func')
#     print(a)
#     a()
# func(index)
image-20220317162503656
# 用法3:函数名还可以当做函数的返回值
# def func():
#     print('from func')
#     return index  # 将函数名当做返回值
# def index():
#     print('from index')
# res = func()  # res接收函数名
# print(res)  # 指向的是index函数的内存地址
# res()  # index()
image-20220317163704844
# 用法4:函数名可以作为容器类型的元素
'''容器类型:内部可以存档多个元素的数据类型>>>:列表、元组、字典'''
# def index():
#     print('from index')
# l1 = [11, 22, 33, 44, index]
# print(l1)
# l1[-1]()  #  index()
image-20220317163843028

函数的嵌套

# 函数的嵌套调用
# def index():
#     func()
#     print('from index')
# def func():
#     index()
#     print('from func')
# func()
"""在学习函数的时候 前期一定要细心 死咬概念  定义调用"""
def my_max(a,b):
    '''返回两个数中的较大值'''
    if a > b:
        return a
    return b
# print(my_max(100,999))

def many_max(a,b,c,d):
    '''返回四个数中的最大值'''
    res = my_max(a,b)  # 两两先比
    res1 = my_max(res,c)  # ...
    res2 = my_max(res1,d)  # ...
    ...
posted @   DDYT  阅读(59)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示