变量与递归函数
变量与递归函数 |
一、变量
变量分为全局变量和局部变量。
python中全局变量和局部变量的最大区别在于局部变量只能通过函数去访问,而全局变量可以直接访问。
举个例子:
name = 'linxu' #全局变量 def change_name(): name='python' #局部变量 print(name) #打印局部变量,结果为:python change_name() print(name) #打印全局变量,结果为:linux
如果将函数内的局部变量转换为全局变量,需要使用到关键字global引用全局变量。
name = 'linxu' #全局变量 def change_name(): global name #引用全局变量,可将函数内后面出现局部变量name转换为全局变量 name='python' #局部变量 print(name) #结果为:python change_name() print(name) #结果为:python
函数的内部无global关键字,优先读取局部变量,无局部变量然后能读取全局变量,无法对全局变量重新赋值,但是对于可变类型,可以对内部元素进行操作。
函数的内部有global关键字,变量本质上就是全局的那个变量,可读取可赋值。
如果需要引用到上一级变量,则使用关键字nonlocal:
name = "张三" def change_name(): name = "李四" def change_name1(): nonlocal name name = "王五" change_name1() print(name) #结果为:王五 print(name) #结果为:张三 change_name() print(name) #结果为:张三
讲到变量就要提提风湿理论,风湿理论的定义:函数即变量。
风湿理论总的来讲就是代码从上到下执行,遇到定义的函数体,内存便为其开辟空间,但不执行。程序需要调用函数时,才会执行函数体的内容。如果一个函数还未开辟空间就先调用,就会报错。
def foo(): print("this is foo") bar() foo() def bar(): print("this is bar")
这段代码就会报错,因为bar()函数未被开辟空间就先调用了。
二、递归函数
递归调用是函数嵌套调用的一种特殊形式,函数在调用时,直接或间接调用了自身,就是递归调用。
def calc(n): print(n) if int(n/2) == 0: return n res = calc(int(n/2)) #递归调用 return res calc(10)
总结递归的调用:
- 必须有一个明确的结束条件
- 每次进入更深递归时,问题规模相比上次递归都应有所减少
- 递归效率低
递归作业:递归问路,假设lisi知道路
import time person_list = ['alex','zhangsan','lisi','wangwu'] def ask_way(person_list): if len(person_list) == 0: return '没人知道路' person = person_list.pop(0) if person == 'lisi': return '%s说:我知道路,就是。。。' %person print('hi 朋友[%s],请问路怎么走' %person) print('%s回答道:我不知道,不过我可以帮你问%s' %(person,person_list)) time.sleep(2) res = ask_way(person_list) print('%s问的结果是:%res' %(person,res)) return res res = ask_way(person_list) print(res)