变量
一、全局变量与局部变量
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说:我知道,老男孩就在沙河汇德商厦,下地铁就是