09-Python之路---函数进阶
Python之路---函数进阶️
程序员三大美德:
- 懒惰
因为一直致力于减少工作的总工作量。
- 缺乏耐性
因为一旦让你去做本该计算机完成的事,你将会怒不可遏。
- 傲慢
因为被荣誉感冲晕头的你会把程序写得让谁都挑不出毛病来。
大家好, 现在让我们一起来学习一下函数进阶部分的内容
药引
我们在前面学会了函数的基本使用,那么我们来看以下的代码:
def myfunc(x, y):
m = x + y
myfunc(10, 20)
print(m)
so , 执行代码:
NameError: name 'm' is not defined
报错了!程序猿最怕的并不是报错,而是报的错误解决不了。
我们来看下这个报错,“name 'm' is not defined”,变量m没有被定义?,但是我们明明在函数内定义了!

首先,我们看看上篇文章中的一张图片,了解下代码运行时遇到函数是怎么做的:
1. 从Python解释器开始执行之后,就会在内存中开辟一个空间
2. 每当遇到一个变量时,就会把变量名和值的对应关系保存下来
但是当遇到函数定义时,解释器只是象征性的把函数名读入内存,表示知道有这个函数存在了,而函数内部的变量和逻辑,解释器不关心。
3. 等调用函数时,python解释器会在开辟一块内存来存储函数里的内容,这个时候才关注函数里面有哪些变量,而函数中的变量只能在函数内部使用,并且会随着函数执行完毕,这块内存中的内容会被清空(垃圾回收)
这就是为什么变量m没有定义的原因?
而我们给这个“存放名字与值”的空间起来一个名字---命名空间
命名空间是一种绝妙的理念,让我们尽情的使用发挥吧!----《Python之禅》
命名空间
命名空间一共分为三种:
- 全局命名空间---代码在运行伊始,创建的存储“变量名与值的关系”的空间
- 局部命名空间---在函数的运行中开辟的临时的空间
- 内置命名空间---程序运行前加载
PS:*内置命名空间中存放了python解释器为我们提供的名字:input,print,str,list,tuple...它们都是我们拿过来就可以用的方法。
加载顺序:内置命名空间-->全局命名空间-->局部命名空间
取值顺序:局部命名空间-->全局命名空间-->内置命名空间
作用域
作用域就是作用范围(铜锣湾陈浩南)
按照生效范围分为:
- 全局作用域:包含内置名称空间、全局名称空间,在整个文件的任意位置都能被引用、全局有效
- 局部作用域:局部名称空间,只能在局部范围内生效
global
global关键字的作用:全局声明
a = 10
def func():
global a
a = 20
print(a)
func()
print(a)
函数嵌套
我们学过if语句嵌套,for循环嵌套,其实函数也可以嵌套
函数嵌套定义
def f1():
print("in f1")
def f2():
print("in f2")
f2()
f1()
函数嵌套调用
def max2(x, y):
'''比较两个数的大小'''
m = x if x > y else y
return m
def max4(a, b, c, d):
res1 = max2(a, b)
res2 = max2(res1, c)
res3 = max2(res2, d)
return res3
the_max = max4(23, -7, 30, 11)
print(the_max)
函数名
函数名本质上就是函数的内存地址
def func():
print('in func')
print(func) # output:<function func at 0x0000019B7FF22EA0>
可以被引用
def func():
print('in func') f = func
print(f)
可以被当作容器类型的元素
PS: 一句话,可以当成普通变量用
闭包
内部函数包含对外部作用域而非全剧作用域名字的引用,该内部函数称为闭包函数
闭包的常用的用法:
def func(): # 外部函数
name = 'mark'
def inner(): # 内部函数
print(name)
print(inner.__closure__) #判断闭包函数的方法
return inner
f = func()
f()
总结
命名空间:

函数的嵌套:
嵌套定义:定义在内部的函数无法直接在全局被调用
函数名的本质:
就是一个变量,保存了函数所在的内存地址
闭包:
内部函数包含对外部作用域而非全剧作用域名字的引用,该内部函数称为闭包函数
09-Python之路---函数进阶的更多相关文章
- python之路——函数进阶
阅读目录 楔子 命名空间和作用域 函数嵌套及作用域链 函数名的本质 闭包 本章小结 楔子 假如有一个函数,实现返回两个数中的较大值: def my_max(x,y): m = x if x> ...
- Python全栈之路----函数进阶----装饰器
Python之路,Day4 - Python基础4 (new版) 装饰器 user_status = False #用户登录后改为True def login(func): #传入想调用的函数名 de ...
- 【python 3】 函数 进阶
函数进阶 1.函数命名空间和作用域 命名空间一共分为三种: 全局命名空间 局部命名空间 内置命名空间 *内置命名空间中存放了python解释器为我们提供的名字:input , print , str ...
- python语法基础-函数-进阶-长期维护
############### 函数的命名空间和作用域 ############## """ # 函数进阶 命名空间和作用域 命名空间 全局命名空间——我们自 ...
- python之路:进阶篇
> ) { ; } printf(;} print i >>> >>> == : name == == ...
- Python之路-函数
一.函数是什么: python中函数定义:函数是逻辑结构化和过程化的一种编程方法.定义函数的方法为: def function(): ""The function definiti ...
- python之路:进阶篇 内置函数
li = [11, 22, 33] news = map( li = [100, 2200, 3300] news = map( [13, 24, 35] [11, 11, 11] [22, 4 ...
- Python全栈开发之路 【第五篇】:Python基础之函数进阶(装饰器、生成器&迭代器)
本节内容 一.名称空间 又名name space,就是存放名字的地方.举例说明,若变量x=1,1存放于内存中,那名字x存放在哪里呢?名称空间正是存放名字x与1绑定关系的地方. 名称空间共3种,分别如下 ...
- Python全栈之路----函数进阶----名称空间
又名name space,顾名思义就是存放名字的地方,存什么名字呢?举例说明,若变量x=1,1存放于内存中,那名字x存放在哪里呢?名称空间正是存放名字x与1绑定关系的=地方 名称空间共3种,分别如下 ...
随机推荐
- [Qt] 打开文件夹 Windows
bool ok = QDesktopServices::openUrl(QUrl("c:/users/administrator/desktop/dir"));
- Zabbix备份数据文件
mysql自带的工具mysqldump,当数据量大了之后进行全备所花的时间比较长,这样将会造成数据库的锁读.从而zabbix服务的监控告警不断,想着做下配置文件的备份.刚好有这么个脚本.满足了需求. ...
- Taro 2.2 全面插件化,支持拓展和定制个性化功能
自 2.2 开始,Taro 引入了插件化机制,允许开发者通过编写插件的方式来为 Taro 拓展更多功能或者为自身业务定制个性化功能,欢迎大家进行尝试,共同讨论~ 当前版本 2.2.1 官方插件 Tar ...
- Spring Boot中使用@JsonComponent
文章目录 序列化 反序列化 在同一个class中序列化和反序列化 Spring Boot中使用@JsonComponent @JsonComponent 是Spring boot的核心注解,使用@Js ...
- Scala的自定义类型标记
Scala的自定义类型标记 Scala中有很多千奇百怪的符号标记,看起来是那么的独特,就像是一杯dry martini-好像黑夜中的萤火虫,那么耀眼,那么出众. 好了言归正传,这一篇文章我们会讲一下S ...
- 你的GitHub,怎么和我用的不太一样?
说起代码托管,相信绝大多数人脑海中浮现出的第一个词都是"GitHub".经过多年的发展,GitHub俨然已经成为了代码托管领域的标签- 随着国内互联网环境的优化,互联网产业链的不断 ...
- IT服务,共享经济的下一个风口?
前两天,在上千名CIO参加.释放10亿采购需求的2017华南CIO大会暨信息技术交易会上,一款"一站式IT工程师共享平台"成为大会关注焦点--这就是神州数码旗下的神州邦邦. 其实最 ...
- Golang Context 的原理与实战
本文让我们一起来学习 golang Context 的使用和标准库中的Context的实现. golang context 包 一开始只是 Google 内部使用的一个 Golang 包,在 Gola ...
- Codeforces Round #623 (Div. 2, based on VK Cup 2019-2020 - Elimination Round, Engine) C. Restoring
C. Restoring Permutation time limit per test1 second memory limit per test256 megabytes inputstandar ...
- Python(Redis 中 String/List/Hash 类型数据操作)
1.下载 redis 模块 pip install redis 2.redis 数据库两种连接方式 简单连接 decode_responses=True,写入和读取的键值对中的 value 为 str ...