变量与嵌套、递归

变量

一、全局变量与局部变量

1、含义与用法:

全局范围:(内置名称空间与全局名称空间属于该范围):全局存活,全局有效

局部范围:(局部名称空间属于该范围):临时存活,局部有效

查看作用域:globals(),locals()

name = '不变应万变'
def change_name():
    name = '你变了'
    print('我的名字',name)
change_name()
print(name)

输出结果:

我的名字 你变了
不变应万变

 

2、修改全局函数

如果函数的内容无global关键字:

① 有局部变量

name = '不变应万变'
def change_name():
    name = '你变了'
    print('我的名字',name)
change_name()

 

② 无局部变量,可直接加入元素

name = ['我没变',456]
def change_name():
    name.append('ok')
    print('我的名字',name)
change_name()

 

如果函数的内容有global关键字:

① 有局部变量

name = ['我没变',456]
def change_name():
    global name
    name = '你变了'
    print('我的名字',name)
change_name()

 

② 无局部变量

name = ['我没变',456]
def change_name():
    global name
    name = ['阿爸']
    name.append('dd')
    print('我的名字',name)
change_name()

 

① 全局变量用大写命名

② 局部变量用小写命名

优先读取局部变量,可读取全局变量,无法对全局变量重新赋值

但是对于可变类型,可以对内部元素进行操作。

则变量本质上就是全局的那个变量,可读取可赋值

 

二、嵌套

① 按照同级别,从上往下执行。遇到函数,先编译,不执行

② 内部包含global name,同一层出现name和global name的话 就会报错。如果name在global在里面一级,则不会报错

name = '1'
def weihou():
    name = '2'
    def weiweihou():
        global name
        name = '3'
    weiweihou()
    print(name)
print(name)
weihou()
print(name)

 

③ global代指全局变量,nonlocal 代指上一层变量

name = '刚娘'
def weihou():
    name='陈卓'
    def weiweihou():
        nonlocal name
        name='冷静'
    weiweihou()
    print(name)
print(name)
weihou()
print(name)

 

3、函数即变量

 

二、递归

① 递归定义:在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。

简单演示:

def test(n):
    print(n)
    if n == 16:
        return n #当n=16的时候,返回n,此处相当于结束当前函数
    return test(2*n) #当n不等于16时,继续调用test函数
test(1)

输出结果:

1
2
4
8
16

 

② 递归特性:

1. 必须有一个明确的结束条件

2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少

3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)

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[0]))
    time.sleep(1)
    res=ask_way(person_list)
    print('%s问的结果是: %s' %(person,res))
    return res
res=ask_way(person_list)
print(res)

输出结果:

------------------------------------------------------------
hi 美男[alex],敢问路在何方
alex回答道:我不知道,但念你慧眼识猪,你等着,我帮你问问wupeiqi...
------------------------------------------------------------
hi 美男[wupeiqi],敢问路在何方
wupeiqi回答道:我不知道,但念你慧眼识猪,你等着,我帮你问问yuanhao...
------------------------------------------------------------
hi 美男[yuanhao],敢问路在何方
yuanhao回答道:我不知道,但念你慧眼识猪,你等着,我帮你问问linhaifeng...
------------------------------------------------------------
yuanhao问的结果是: linhaifeng说:我知道,老男孩就在沙河汇德商厦,下地铁就是
wupeiqi问的结果是: linhaifeng说:我知道,老男孩就在沙河汇德商厦,下地铁就是
alex问的结果是: linhaifeng说:我知道,老男孩就在沙河汇德商厦,下地铁就是
linhaifeng说:我知道,老男孩就在沙河汇德商厦,下地铁就是

posted @ 2018-04-24 16:19  实验体一号  阅读(208)  评论(0编辑  收藏  举报