Day15 变量与递归函数

函数名只表示内存地址,加上括号和参数即可运行

函数可以被当作数据传递,可以被引用,可以当作参数传递,返回值可以是函数,也可以当作容器类型的元素

一、局部变量和全局变量

全局变量:在程序一开始定义的变量。作用域是整个程序

局部变量:定义在子程序当中。作用域是定义该变量的子程序

当全局变量和局部变量同名是,在定义局部变量的子程序内,局部变量起作用,在其他地方全局变量起作用。

【注!作用域关系是在函数定义阶段就已经固定的,与函数的调用位置无关】

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说:我知道,老男孩就在沙河汇德商厦,下地铁就是

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值