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

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

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

子程序:比如.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']...
------------------------------------------------------------
hi 美男[yuanhao],敢问路在何方
yuanhao回答道:我不知道,但念你慧眼识猪,你等着,我帮你问问['linhaifeng', 'zsc']...
------------------------------------------------------------
yuanhao问的结果是: 'linhaifeng说:我知道,老男孩就在沙河汇德商厦,下地铁就是'es
wupeiqi问的结果是: 'linhaifeng说:我知道,老男孩就在沙河汇德商厦,下地铁就是'es
alex问的结果是: 'linhaifeng说:我知道,老男孩就在沙河汇德商厦,下地铁就是'es
linhaieng说:我知道,老男孩就在沙河汇德商厦,下地铁就是

第十二篇 Python函数之全局变量&局部变量&递归函数的更多相关文章

  1. Python开发【第二十二篇】:Web框架之Django【进阶】

    Python开发[第二十二篇]:Web框架之Django[进阶]   猛击这里:http://www.cnblogs.com/wupeiqi/articles/5246483.html 博客园 首页 ...

  2. Python之路【第十二篇】:JavaScrpt -暂无内容-待更新

    Python之路[第十二篇]:JavaScrpt -暂无内容-待更新

  3. 跟我学SpringCloud | 第十二篇:Spring Cloud Gateway初探

    SpringCloud系列教程 | 第十二篇:Spring Cloud Gateway初探 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如 ...

  4. 第十二章 Python文件操作【转】

    12.1 open() open()函数作用是打开文件,返回一个文件对象. 用法格式:open(name[, mode[, buffering[,encoding]]]) -> file obj ...

  5. Mysql优化(出自官方文档) - 第十二篇(优化锁操作篇)

    Mysql优化(出自官方文档) - 第十二篇(优化锁操作篇) 目录 Mysql优化(出自官方文档) - 第十二篇(优化锁操作篇) 1 Internal Locking Methods Row-Leve ...

  6. 解剖SQLSERVER 第十二篇 OrcaMDF 行压缩支持(译)

    解剖SQLSERVER 第十二篇   OrcaMDF 行压缩支持(译) http://improve.dk/orcamdf-row-compression-support/ 在这两个月的断断续续的开发 ...

  7. 第十二篇 SQL Server代理多服务器管理

    本篇文章是SQL Server代理系列的第十二篇,详细内容请参考原文 在这一系列的上一篇,我们查看了维护计划,一个维护计划可能会创建多个作业,多个计划.你还简单地看了SSIS子系统,并查看了维护计划作 ...

  8. 第十二篇 Integration Services:高级日志记录

    本篇文章是Integration Services系列的第十二篇,详细内容请参考原文. 简介在前一篇文章我们配置了SSIS内置日志记录,演示了简单和高级日志配置,保存并查看日志配置,生成自定义日志消息 ...

  9. 【译】第十二篇 Integration Services:高级日志记录

    本篇文章是Integration Services系列的第十二篇,详细内容请参考原文. 简介在前一篇文章我们配置了SSIS内置日志记录,演示了简单和高级日志配置,保存并查看日志配置,生成自定义日志消息 ...

随机推荐

  1. papers-06-07

    A simple neural network module for relational reasoning Visual Interaction Networks 今天被这两篇文章的工作刷屏,说实 ...

  2. SpringBoot非官方教程 | 第十六篇:用restTemplate消费服务

    转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springboot/2017/07/11/springboot11-restTemplate/ 本文出自方志朋的 ...

  3. oracle 完整性约束的禁用启用以及对表的影响,表的修改和复制

    primary key ----表的唯一性约束,不能为空,且不能有重复值 foreign key ----俩表之间的约束,启用之时,在删除数据时需要先删除父表数据,再删除子表数据 禁用方式为:alte ...

  4. js对URL的相关操作集锦

    1.location.href..... (1)self.loction.href="/url" window.location.href="/url"    ...

  5. angular、angular2、vue的生命周期

    angular生命周期是什么 1.Angular每个组件都存在一个生命周期,从创建,变更到销毁.Angular提供组件生命周期钩子,把这些关键时刻暴露出来,赋予在这些关键结点和组件进行交互的能力,掌握 ...

  6. 浅谈css蒙版效果

    我们进网站浏览时经常看到当鼠标悬浮在图片上或者某一个地方时,会出现一层朦胧现象覆盖着悬浮位置,简单的理解为“蒙版效果”.下面简单列举实现过程: HTML: CSS:

  7. ES6、7、8、9新语法新特性

    前言 如果你擅长这种扩散式学习方式,不妨再进一步温习一下整个 ES6 引入的新特性,笔者强烈推荐阮一峰老师的 ECMAScript 6 入门 一书. ES2018 引入的特性还太新,单在对 ES6 特 ...

  8. Sencha Visual Studio(IDE插件)

    Sencha Visual Studio(IDE插件) 首先从官网上下载Visual Studio插件,注意不是VSCode编辑器,下载完后安装打开Visual Studio提示你去注册,输入你的se ...

  9. ECSHOP和SHOPEX快递单号查询申通插件V8.6专版

    发布ECSHOP说明: ECSHOP快递物流单号查询插件特色 本ECSHOP快递物流单号跟踪插件提供国内外近2000家快递物流订单单号查询服务例如申通快递.顺丰快递.圆通快递.EMS快递.汇通快递.宅 ...

  10. 继上一篇bootstrap框架(首页)弄的资讯页面

    还是和上一篇首页一样给出每一步的注解: 做的有点简单,但是,以后还是会加深的.毕竟是初学者嘛! <html lang="zh-cn">   <head>   ...