函数名即变量
定义函数时,函数名其实就是变量,指向函数。
def foo():
print('from foo')
bar()
def bar():
print('from bar')
foo()
虽然函数foo中包含了未在foo之前未定义的函数bar,但是在调用函数foo()前已定义bar函数,在调用时会指向bar()函数,可以正常运行,结果为
from foo
from bar
但是在bar函数前调用foo(),则程序会报错
def foo():
print('from foo')
bar()
foo()
def bar():
print('from bar')
运行报错
NameError: name 'bar' is not defined
令f=abs则可以让f指向abs函数内部,f具有和abs()一样的作用.函数名即变量
f=abs
print(f(-3))
结果为3
递归函数
函数return回原函数
person_list=['A','B','C',"D"]
def ask_way(person_list):
print('-'*50)
if len(person_list)==0:
return ('Nobody konws the way')
person=person_list.pop(0)
if person=='D':
return 'I(%s) know the way'%person
print('Excuse me,%s Do you know the way'%person)
print('Sorry,I(%s) don\'t know ,I will ask %s '%(person,person_list))
res=ask_way(person_list)
print('The result of %s is %s'%(person,res))
return res
res=ask_way(person_list)
print(res)
结果为
--------------------------------------------------
Excuse me,A Do you know the way
Sorry,I(A) don't know ,I will ask ['B', 'C', 'D']
--------------------------------------------------
Excuse me,B Do you know the way
Sorry,I(B) don't know ,I will ask ['C', 'D']
--------------------------------------------------
Excuse me,C Do you know the way
Sorry,I(C) don't know ,I will ask ['D']
--------------------------------------------------
The result of C is I(D) know the way
The result of B is I(D) know the way
The result of A is I(D) know the way
I(D) know the way
解析:
当问A时,A不知道,然后A继续问下一个进行递归,因为没有return返回值,故res下的print不会执行.直到问到D,出现返回值
I(D) know the way
D将返回值抛给C,故C得到返回值,执行print,然后C再将返回值抛给B,B再执行print,直到A,执行print后,return得到的返回值.
过程为
A --> B --> C --> D(得到return)返回 --> C --> B -->A --> return
再例如求阶乘函数
def f(n):
if n==1:
return 1
return n*f(n-1)
print(f(5))
结果为120
过程为