函数名只表示内存地址,加上括号和参数即可运行
函数可以被当作数据传递,可以被引用,可以当作参数传递,返回值可以是函数,也可以当作容器类型的元素
一、局部变量和全局变量
全局变量:在程序一开始定义的变量。作用域是整个程序
局部变量:定义在子程序当中。作用域是定义该变量的子程序
当全局变量和局部变量同名是,在定义局部变量的子程序内,局部变量起作用,在其他地方全局变量起作用。
【注!作用域关系是在函数定义阶段就已经固定的,与函数的调用位置无关】
x=1
def f1():
def f2():
print(x)
return f2
x=100
def f3(func):
x=2
func()
x=10000
f3(f1())
# 输出
10000
函数f2在局部作用域中没有找到变量
x
的定义,因此继续向上查找,找到了全局作用域中的变量x
,并打印了其值。
可以在子程序中使用global声明使用的是全局变量。global声明要在变量赋值前面
【对于可变类型,可以对内部元素进行操作,如列表.append()】
nonlocal声明上一级变量,只能作用于作用域局部变量,若上一级变量被声明为全局变量时也会报错
name = '11'
def test():
nonlocal name #报错
name = '22'
def test1():
name = '24'
print(name)
test1()
print(name)
test()
print(name)
名称空间:存放名字的地方,如x=1,1存放在内存中,名称空间则存放名字x与1绑定关系的地方
在执行程序过程中,python test.py
1、python解释器先启动,因而首先加载的是:内置名称空间
2、执行test.py文件,然后以文件为基础,加载全局名称空间
3、在执行文件的过程中如果调用函数,则临时产生局部名称空间
名字查找顺序则为:局部名称空间➡全局名称空间➡内置名称空间
全局无法查看局部,但局部可以查看全局
二、递归函数
在函数内部,可以调用其他函数,如果一个函数在内部调用自身本身,这个函数就是递归函数
1.必须要有一个明确的结束条件
2.每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3.递归效率不高,递归层次过多会导致栈溢出
#_*_coding:utf-8_*_
__author__ = 'Linhaifeng'
import time
person_list=['alex','wupeiqi','yuanhao','linhaifeng']
def ask_way(person_list):
print('-'*60)
if len(person_list) == 0:
return '没人知道'
person=person_list.pop(0)
if person == 'linhaifeng':
return '%s说:我知道,老男孩就在沙河汇德商厦,下地铁就是' %person
print('hi 美男[%s],敢问路在何方' %person)
print('%s回答道:我不知道,但念你慧眼识猪,你等着,我帮你问问%s...' %(person,person_list))
time.sleep(1)
res=ask_way(person_list)
print('%s问的结果是: %res' %(person,res))
return res
res=ask_way(person_list)
print("asdoijio")
print(res)
# 输出
------------------------------------------------------------
hi 美男[alex],敢问路在何方
alex回答道:我不知道,但念你慧眼识猪,你等着,我帮你问问['wupeiqi', 'yuanhao', 'linhaifeng']...
------------------------------------------------------------
hi 美男[wupeiqi],敢问路在何方
wupeiqi回答道:我不知道,但念你慧眼识猪,你等着,我帮你问问['yuanhao', 'linhaifeng']...
------------------------------------------------------------
hi 美男[yuanhao],敢问路在何方
yuanhao回答道:我不知道,但念你慧眼识猪,你等着,我帮你问问['linhaifeng']...
------------------------------------------------------------
yuanhao问的结果是: 'linhaifeng说:我知道,老男孩就在沙河汇德商厦,下地铁就是'es
wupeiqi问的结果是: 'linhaifeng说:我知道,老男孩就在沙河汇德商厦,下地铁就是'es
alex问的结果是: 'linhaifeng说:我知道,老男孩就在沙河汇德商厦,下地铁就是'es
asdoijio
linhaifeng说:我知道,老男孩就在沙河汇德商厦,下地铁就是