一、函数对象
引用、赋值
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