21:Python函数全局变量和局部变量、递归
#全局变量与局部变量,全局变量大写,局部变量小写
NAME='ladfs' #定义全局变量,全局作用域顶格
def change_name():
print('change_name',NAME) #调用全局变量
change_name()
#全局变量与局部变量
NAME='ladfs' #定义全局变量
def change_name():
name="高高兴兴地"
print('change_name',name) #局部作用域缩进,调用局部变量,只在函数里面生效,不改变全局变量的值
change_name()
print(NAME)
#全局变量与局部变量
NAME='ladfs' #定义全局变量
def change_name():
global NAME #改变全局变量 ,和下面的name这行不能对调位置
NAME="高高兴兴地"
print('change_name',NAME) #调用局部变量,只在函数里面生效,不改变全局变量的值
change_name()
print(NAME)
#全局变量与局部变量
NAME='开开心心' #定义全局变量
def change_name1():
name='嘻嘻哈哈' #优先读取局部变量,没有则读取全局变量
print('你调皮',name) #
change_name1()
def change_name2():
global NAME #声明即将修改全局变量
NAME='兴高采烈' #修改全局变量值
print('你调皮',NAME)
change_name2()
def change_name3():
name='开心唱歌' #
print('你调皮',name)
change_name3()
NAME=['飞龙在天','见龙在田','潜龙勿用']
def longge():
NAME.append('亢龙有悔') #对全局变量进行增加
print(NAME)
longge()
def longge2():
print(NAME) #全局变量已经用增加之后的
longge2()
#函数嵌套
NAME='天下' #1
def zhuhou():
name ='诸侯' #3
print(name) #4
def gelao():
name="阁老" #6
print(name) #7
def dacheng():
name="大臣" #10
print(name) #11
print(name) #8
dacheng() #9
gelao() #5
print(name) #12
zhuhou() #2
name = '互联网'
def wangzhan():
name = "网站"
def shoujiwangzhan():
global name
name = '自适应'
shoujiwangzhan()
print(name)
print(name)
wangzhan()
print(name)
NAME = '互联网' # 定义全局变量
def wangzhan():
name = "网站" # 定义局部变量
def shoujiwangzhan():
global NAME # 声明NAME为全局变量
NAME = '自适应' # 修改全局变量的值
shoujiwangzhan() # 调用嵌套函数
print('wangzhan内部:', NAME) # 打印修改后的全局变量值
# 注意:这里的print将打印全局变量的初始值
print('调用wangzhan之前:', NAME)
wangzhan() # 调用函数,修改全局变量NAME的值
print('调用wangzhan之后:', NAME) # 打印修改后的全局变量值
# 下面的print会引发NameError,因为name是wangzhan的局部变量
# print(name) # 这将引发NameError
name = '互联网'
def wangzhan():
name = "网站"
def shoujiwangzhan():
nonlocal name #nonlocal:改变上一级的值
name = '自适应'
shoujiwangzhan()
print(name)
print(name)
wangzhan()
print(name)
#风湿理论之函数即变量
#向前引用
def bar():
print('from bar')
def foo():
print('from too')
bar()
foo()
# 定义bar函数
def bar():
print('from bar')
# 定义foo函数,它调用了bar函数
def foo():
print('from foo') # 首先打印from foo
bar() # 然后调用bar函数,打印from bar
# 调用foo函数
foo() # 输出将会是:
# from foo
# from bar
def foo():
print('from too')
bar()
def bar():
print('from bar')
foo()
# 递归调用:在函数内部,可以调用其他函数。如果在调用一个函数的过程中直接或间接调用自身本身
# 递归特性:
# 1. 必须有一个明确的结束条件
# 2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
# 3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
def calc(n):
print(n)
if int(n/2) ==0:
return n
return calc(int(n/2))
calc(10)
# 递归函数示例
import time # 导入time模块以使用time.sleep函数
person_list = ['guanyu', 'zhangfei', 'zhaoyun', 'zhugeliang', 'liubei']
def ask_way(person_list):
print('-0' * 60) # 打印分隔线
if len(person_list) == 0:
return '没人去过这个地方' # 基本情况:如果列表为空,返回特定消息
person = person_list.pop(0) # 从列表中移除第一个人名
if person == 'zhugeliang':
return '%s告诉你要去的地方在上方谷' % person # 如果第一个人名是'zhugeliang',返回特定消息
print('请问将军[%s]要去找粮食怎么样走?' % person) # 打印询问消息
print('%s回答道:我不知道,但我可以帮你问问%s...' % (person, ', '.join(person_list))) # 打印当前询问人和剩余人名列表
time.sleep(3) # 暂停3秒以模拟询问过程
res = ask_way(person_list) # 递归调用自身以继续询问
return res # 返回递归调用的结果
# 调用函数
result = ask_way(person_list)
print(result) # 打印最终结果
柳志军:13418977808(手机微信),QQ:93684042