一、函数对象

引用、赋值

def maxx(i,j):
    if i>=j:
        return i
    else:
        return j
print(type(maxx))
a = maxx
print(a)
print(a(15,20))
<class 'function'>
<function maxx at 0x0000021AFB544360>
20

当作返回值

def f1():
    return f2
def f2():
    return 36115
print(f1())
print(f1()())
<function f2 at 0x0000021AFB7F5EE0>
36115

当作参数

def f1():
    return 0
def f2(m):
    return m
print(f2(f1))
print(f2(f1()))
print(f2(f1)())
<function f1 at 0x0000021AFB73D9E0>
0
0

当作容器类型的元素

def f1():
    return 0
a = [f1,1,'2']
print(a[0])
print(a[0]())
<function f1 at 0x0000021AFB92C360>
0
def af():
    print('15631')
def bf():
    print('16612')
def cf():
    print('26+++')
def df():
    print('69+8+')
dic = {}
j=0
for i in [af,bf,cf,df]:
    j += 1
    dic[j]=i
choice = int(input(f'选择一个你想用的函数{dic}').strip())
dic[choice]()
选择一个你想用的函数{1: <function af at 0x0000021AFCA3ED40>, 2: <function bf at 0x0000021AFCA3E2A0>, 3: <function cf at 0x0000021AFCA3CEA0>, 4: <function df at 0x0000021AFCA3CF40>} 3


26+++

二、函数嵌套

不能直接使用函数内函数

def f1():
    def f2():
        print('22222')
    def f3():
        print('33333')
f1()
f2()
---------------------------------------------------------------------------

NameError                                 Traceback (most recent call last)

Cell In[10], line 7
      5         print('33333')
      6 f1()
----> 7 f2()


NameError: name 'f2' is not defined
def max2(x, y):
    if x > y:
        return x
    else:
        return y


def max4(a, b, c, d):
    res1 = max2(a, b)
    res2 = max2(res1, c)
    res3 = max2(res2, d)
    return res3


print(max4(1, 2, 3, 4))
4

通过给一个函数传参即可求得某个圆的面积或者圆的周长

from math import pi

def cir(r:int, ch:str):
    def C(r):
        return 2*pi*r
    def S(r):
        return pi*r**2
    if ch == 'c':
        return C(r)
    elif ch == 's':
        return S(r)
    else:
        return 'error'

r = int(input('请输入圆的半径').strip())
ch = input('你想求{c:周长,s:面积}')
print(cir(r,ch))
请输入圆的半径 1
你想求{c:周长,s:面积} s


3.141592653589793

三、名称空间与作用域

内置名称空间

如int、float、len,在解释器启动时生效,在解释器关闭时失效

print(len)
<built-in function len>

全局名称空间

全局变量、被调用的外层函数名,在文件执行时生效,在文件执行结束后失效

x = 1
def f1():
    pass
f1()

局部名称空间

函数调用期间函数体产生的名字,在文件执行时函数调用期间时生效,在函数执行结束后失效

加载顺序 \ 内置--》全局--》局部

查找顺序 \ 局部--》全局--》内置

作用域#域指的是区域,作用域即作用的区域。

全局作用域:包含内置名称空间和全局名称空间。

局部作用域:只包含局部名称空间。

作用域关系在函数定义阶段就固定死了,与函数的调用无关。

def f1():
    x = 2
    print([x,'a'])
    def f2():
        x = 3
        print([x,'b'])
    f2()
f=f1
def f3():
    print([x,'c'])
    f()
x = 1
f3()
print([x,'d'])

[1, 'c']
[2, 'a']
[3, 'b']
[1, 'd']

全局变量 x(在函数外部定义)和局部变量 x(在函数内部定义)是完全独立的。修改局部变量 x 不会影响全局变量 x。

global #声明该变量为全局变量

x = 100
def f1():
    global x
    x = 10
def f2():
    x = 1000
f1()
f2()
print(x)
10

nonlocal #声明该变量为外部变量(嵌套函数内的外部)

x = 1


def f1():
    x = 2

    def f2():
        nonlocal x
        x = 3

    f2()
    print(x)


f1()
3

在局部想要修改全局的可变(列表、字典)类型,不需要任何声明,可以直接修改。如果是重新绑定变量(赋值操作),则需要 global 声明。

posted on 2025-07-14 20:20  新月绘影  阅读(8)  评论(0)    收藏  举报