编程语言
首页 > 编程语言> > 变量关系Python函数之全局变量&局部变量&递归函数

变量关系Python函数之全局变量&局部变量&递归函数

作者:互联网

局变量:在定义的时候,顶头写的,没有任何缩进的变量就是全局变量。

全局变量的特点:在当前文件里的任何地方都可以进行调用

局部变量:在子程序里定义的变量,就是局部变量。

子程序:比如.py文件里,写的函数就是个子程序。而这个函数里定义的变量就是局部变量

示例:全局变量

复制代码

全局变量

name=‘alex’

def change_name():
print(‘change_name’,name) # 调用了全局变量

change_name()

结果

change_name alex

print(name) #调的是全局变量

结果

alex
复制代码
示例:函数体内定义局部变量

复制代码

全局变量:全局作用域

name=‘alex’

def change_name():
name=‘帅呆了’ # 局部变量:局部作用域
print(‘change_name’,name) # 先在自己的子程序里找,调用了局部变量

举个生活中的例子,刚起床找手机,肯定现在自己卧室(函数)找,自己卧室找不到,才可能会到卧室(函数之外)之外去找。

所以,很好的理解,就是优先内部,然后外部;局部变量只能该函数自己使用(私心重),全局变量就比较大方,谁需要就可以拿去用

change_name()

结果

change_name 帅呆了

print(name) #调的是全局变量

结果

alex
复制代码
示例:函数体内声明全局变量

复制代码

全局变量

name=‘alex’

def change_name():
global name # 函数体内声明了全局变量
name=‘帅呆了’ # 函数体内修改了全局变量的值
print(‘change_name’,name) # 调用了全局变量

change_name()

结果

change_name 帅呆了

print(name) #调的是全局变量,但是全局变量的值已经被修改

结果

帅呆了
复制代码
更好的示例

如果函数的内容无global关键字,优先读取局部变量;如果没有局部变量,只能读取全局变量,无法对全局变量重新赋值,但于可变类型,是可以对内部元素进行操作

如果函数的内容有global关键字,函数内的变量就是全面局变量,可以读取,可以赋值

复制代码
name = “桃花李”

def yangjian():
global name # 已经声明,NAME就是全局的的那个变量
print(‘我要’, name)
name = “小东北” # 修改 全局的变量
print(‘我要’, name)

def qupengfei():
name = “基”
print(‘我要搞’, name)

yangjian()
qupengfei()

#结果
我要 桃花李
我要 小东北
我要搞 基
复制代码
总结

全局变量变量名大写
局部变量变量名小写
复制代码
下面的示例为了说明全局变量和局部变量的关系,都用的是大写。

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

- 有声明局部变量

NAME = [“产品经理”,“廖波湿”]
def qupengfei():
NAME = “自己”
print(‘我要搞’, NAME)
qupengfei()

- 无声明局部变量

NAME = [“产品经理”,“廖波湿”]
def qupengfei():
NAME.append(‘XXOO’)
print(‘我要搞’, NAME)
qupengfei()

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

- 有声明局部变量

NAME = [“产品经理”,“廖波湿”]
def qupengfei():
global NAME
NAME = “自己”
print(‘我要搞’, NAME)
qupengfei()

错误示例, 全部变量放在了局部变量的下面,是不行的;所以,如果要什么全局变量,就尽量往前放。

NAME = [“产品经理”,“廖波湿”]
def qupengfei():
NAME = “自己”
global NAME
print(‘我要搞’, NAME)
qupengfei()

- 无声明局部变量

NAME = [“产品经理”,“廖波湿”]
def qupengfei():
global NAME
NAME = [“阿毛”]
NAME.append(‘XXOO’)
print(‘我要搞’, NAME)
qupengfei()
复制代码
函数里也可以嵌套函数,执行顺序如下图所示

复制代码
name=‘海风’
def huangwei():
name = “黄伟”
print(name)
def liuyang():
name = “刘洋”
print(name)
def nulige():
name = ‘炉指花’
print(name)
print(name)
nulige()
liuyang()
print(name)

huangwei()

结果

黄伟
刘洋
刘洋
炉指花
黄伟
复制代码

复制代码
name = “刚娘”

def weihou():
name = “陈卓”
def weiweihou():
global name # global,声明的是全局变量,
name = “冷静” # 此处修改的是最外层的全局变量,而不是它上一级同名变量
weiweihou()
print(name)
print(name)
weihou()
print(name)

#结果
刚娘
陈卓
冷静
复制代码

复制代码
name = “刚娘”

def weihou():
name = “陈卓”
def weiweihou():
nonlocal name # nonlocal,指定上一级变量,如果没有就继续往上直到找到为止
name = “冷静”
weiweihou()
print(name)

print(name)
weihou()
print(name)

结果

刚娘
冷静
刚娘
复制代码
前向引用(野路子好记,别名风湿理论):函数即变量

复制代码
def foo():
print(‘from foo’)
bar()

def bar():
print(‘from bar’)

foo()

结果

from foo
from bar
复制代码
复制代码
def foo():
print(‘from foo’)
bar()

foo()

结果

程序报错,因为没有定义bar()
复制代码
复制代码
def foo():
print(‘from foo’)
bar()

foo()

def bar():
print(‘from bar’)

结果

报错,即使定义了bar(),但是他放在了foo()调用的后面,也不会执行
复制代码

复制代码

用前向引用解释函数嵌套的调用

name=‘海风’
def huangwei():
name = “黄伟”
print(name)
def liuyang():
name = “刘洋”
print(name)
def nulige():
name = ‘炉指花’
print(name)
print(name)
nulige()
liuyang()
print(name)

print(name)
huangwei()
print(name)

结果

黄伟
刘洋
刘洋
炉指花
黄伟
海风
复制代码
函数递归

递归就好比你去问A腾达大厦怎么走?A说我不知道,我去问问B,B说完我也不知道,我去问问C,然后C又去问D,D说我知道,告诉了C,C又告诉了B,B告诉了A,A把最后的结果返回给了你。

递归特性:

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

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

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

堆栈扫盲http://www.cnblogs.com/lln7777/archive/2012/03/14/2396164.html

尾递归优化:http://egon09.blog.51cto.com/9161406/1842475

示例:

递归函数内部,有自己调用自己,就会形成一个循环,一直循环下去, 最后报错

复制代码
def calc(n):
print(n)
calc(n)

calc(10)

#结果
10
10
…10
RecursionError: maximum recursion depth exceeded while calling a Python object
复制代码
复制代码
def calc(n):
print(n)
if int(n/2) ==0:
return n
return calc(int(n/2))

calc(10)

输出:
10
5
2
1
复制代码
复制代码

以问路的生活实例来解释递归函数

import time

问路,得先有问的人,需要定义一个列表

person_list=[‘alex’,‘wupeiqi’,‘yuanhao’,‘linhaifeng’,'sb’]

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(3)
res=ask_way(person_list)
print(’%s问的结果是: %res’ %(person,res))
return res

res=ask_way(person_list)
print(res)

结果


hi 美男[alex],敢问路在何方
alex回答道:我不知道,但念你慧眼识猪,你等着,我帮你问问[‘wupeiqi’, ‘yuanhao’, ‘linhaifeng’, ‘zsc’]…

hi 美男[wupeiqi],敢问路在何方
wupeiqi回答道:我不知道,但念你慧眼识猪,你等着,我帮你问问[‘yuanhao’, ‘linhaifeng’, ‘zsc’]…

iask.sina.com.cn/b/r57x1aqQj7w.html?pvfn
iask.sina.com.cn/b/rcvx41XM3Fk.html?lvfr
iask.sina.com.cn/b/qg9k4g9i5TU.html?bdvn
iask.sina.com.cn/b/qPBJ3tDJcZ0.html?vbnb
iask.sina.com.cn/b/rj9JuISCNxI.html?dnxh
iask.sina.com.cn/b/qmNwpFBppiS.html?jxlx
iask.sina.com.cn/b/qIXwFMhL8Yu.html?fvhr
iask.sina.com.cn/b/ripVIT0xJGC.html?dvhv
iask.sina.com.cn/b/qORVyTn8GvA.html?xpdp
iask.sina.com.cn/b/qAPJ04F4fRs.html?ndpx
iask.sina.com.cn/b/rln89cqWj38.html?ldth
iask.sina.com.cn/b/r6B8cOYUGSy.html?fvjt
iask.sina.com.cn/b/qZd86D9gcvY.html?vjth
iask.sina.com.cn/b/qD37WRqbMdg.html?lvbf
iask.sina.com.cn/b/qRP7V9QShFY.html?nblp
iask.sina.com.cn/b/qoh7PoiqmE6.html?xzvn
iask.sina.com.cn/b/qvF7Ln27XH0.html?vbdh
iask.sina.com.cn/b/qJHkqSDLfUq.html?rfpx
iask.sina.com.cn/b/r5RkuRfvcYe.html?lbrd
iask.sina.com.cn/b/qCjkdth2y62.html?tjvd
iask.sina.com.cn/b/qU2wUgl06dg.html?nbpx
iask.sina.com.cn/b/r84JrQKxfIy.html?zjrb
iask.sina.com.cn/b/qquwDB7fghE.html?hxnb
iask.sina.com.cn/b/qx8IUqLF4tw.html?jbpd
iask.sina.com.cn/b/qLUJ6sBs5zw.html?xnbp
iask.sina.com.cn/b/qZWVIrTVLtk.html?dtdn
iask.sina.com.cn/b/rm6VXalTyiy.html?lzjv
iask.sina.com.cn/b/qwoVrfVTZ5Y.html?xpfp
iask.sina.com.cn/b/qHLMQQcDlBc.html?brdn
iask.sina.com.cn/b/r3bZqotDrT8.html?pftf
iask.sina.com.cn/b/qedMyeUxIHc.html?fzdn
iask.sina.com.cn/b/qzDZk7gAu5M.html?zflt
iask.sina.com.cn/b/qsfZfGAvNT0.html?hzlb
iask.sina.com.cn/b/qGdBQ43UTkW.html?fhzp
iask.sina.com.cn/b/r91OkIuPGAS.html?hhrh
iask.sina.com.cn/b/qn5nVDfA2xE.html?lvbp
iask.sina.com.cn/b/qXhAB3jQPng.html?xdnz
iask.sina.com.cn/b/riHNfT3Am8C.html?jdfj
iask.sina.com.cn/b/rbjNcQBTCMe.html?hlxx
iask.sina.com.cn/b/r6SZuRdxVZc.html?lpdr
iask.sina.com.cn/b/qKIZs716QDs.html?zzlb
iask.sina.com.cn/b/qhaZd22aQ34.html?ptfh
iask.sina.com.cn/b/rkbosyUQPqC.html?tvhb
iask.sina.com.cn/b/r96oeHOpUoS.html?djtl
iask.sina.com.cn/b/qjonS7UAkr4.html?hlvd
iask.sina.com.cn/b/qMWo3HG2Co6.html?hlxl
iask.sina.com.cn/b/rmoNmsMAC1E.html?hfph
iask.sina.com.cn/b/rbon2ZiSz8i.html?nvbl
iask.sina.com.cn/b/qPemY87lHZA.html?rvfz
iask.sina.com.cn/b/qt4mHQweZvo.html?hrbt
iask.sina.com.cn/b/qdyyW7YEAQm.html?nrbf
iask.sina.com.cn/b/qyUbAoibwn4.html?prbt
iask.sina.com.cn/b/r5J2ofxqstU.html?zxnj
iask.sina.com.cn/b/qQdeTXCRaAm.html?txhb
iask.sina.com.cn/b/qmFesbDGDzU.html?hhxr
iask.sina.com.cn/b/r9q2FgZiPXU.html?vvvf
iask.sina.com.cn/b/qFS2jkiOzyS.html?jrzh
iask.sina.com.cn/b/r8GeWYw3i6G.html?flvh
iask.sina.com.cn/b/qiYenIHF5p4.html?ltdl
iask.sina.com.cn/b/r53OLN0YFc2.html?ltdn
iask.sina.com.cn/b/rbI1gvTA49w.html?nlvn
iask.sina.com.cn/b/qmJOve22AMe.html?jrbf
iask.sina.com.cn/b/qQhOBwkLsfQ.html?zblx
iask.sina.com.cn/b/qWW14u3N33w.html?bhnr
iask.sina.com.cn/b/qIa16ScszaS.html?hjpv
iask.sina.com.cn/b/qm00ODrla22.html?xbfp
iask.sina.com.cn/b/r3AdxCHzCFM.html?ptzh
iask.sina.com.cn/b/qA2dgMz3NVA.html?fnxf
iask.sina.com.cn/b/qzipTOz4y2W.html?zjpd
iask.sina.com.cn/b/qUICfiH84KG.html?dhrj
iask.sina.com.cn/b/rgSCtEdU0gu.html?hlvz
iask.sina.com.cn/b/qkwpG1zHIN8.html?bbht
iask.sina.com.cn/b/qraCbE7LVvM.html?txhr
iask.sina.com.cn/b/qm535JsenRc.html?tblv
iask.sina.com.cn/b/qWhfR8Egwqy.html?nlxp
iask.sina.com.cn/b/qdXfuWn53Ua.html?zhrd
iask.sina.com.cn/b/rhCqhW9Yfbo.html?xblz
iask.sina.com.cn/b/r5SEYzwsiBM.html?ffjt
iask.sina.com.cn/b/rjURqbTU03A.html?fpzn
iask.sina.com.cn/b/r4p3yZT9iqi.html?dnth
iask.sina.com.cn/b/qEy3u9ltzMW.html?rtfx
iask.sina.com.cn/b/r0I3Dzf22su.html?ntxj
iask.sina.com.cn/b/re0srBGkSIe.html?dfrr
iask.sina.com.cn/b/qgUrRrv1C7s.html?prxz
iask.sina.com.cn/b/rolETbjatB4.html?jjtd
iask.sina.com.cn/b/rnBRmPZLJx4.html?zbht
iask.sina.com.cn/b/r1rR4Y9QbHE.html?hjrz
iask.sina.com.cn/b/qj7QFXex27Y.html?lrzp
iask.sina.com.cn/b/qm9Db1SDUoS.html?xbjr
iask.sina.com.cn/b/qlpPsmucvee.html?xdpx

hi 美男[yuanhao],敢问路在何方
yuanhao回答道:我不知道,但念你慧眼识猪,你等着,我帮你问问[‘linhaifeng’, ‘zsc’]…

yuanhao问的结果是: 'linhaifeng说:我知道,老男孩就在沙河汇德商厦,下地铁就是’es
wupeiqi问的结果是: 'linhaifeng说:我知道,老男孩就在沙河汇德商厦,下地铁就是’es
alex问的结果是: 'linhaifeng说:我知道,老男孩就在沙河汇德商厦,下地铁就是’es
linhaieng说:我知道,老男孩就在沙河汇德商厦,下地铁就是

标签:cn,递归函数,Python,name,html,iask,全局变量,com,sina
来源: https://blog.csdn.net/m0_54983229/article/details/113357091