Python之路---函数进阶️

程序员三大美德:

  1. 懒惰

因为一直致力于减少工作的总工作量。

  1. 缺乏耐性

因为一旦让你去做本该计算机完成的事,你将会怒不可遏。

  1. 傲慢

因为被荣誉感冲晕头的你会把程序写得让谁都挑不出毛病来。

大家好, 现在让我们一起来学习一下函数进阶部分的内容

药引

我们在前面学会了函数的基本使用,那么我们来看以下的代码:

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>
  1. 可以被引用

    def func():
    print('in func') f = func
    print(f)
  2. 可以被当作容器类型的元素

PS: 一句话,可以当成普通变量用

闭包

内部函数包含对外部作用域而非全剧作用域名字的引用,该内部函数称为闭包函数

闭包的常用的用法:

def func():  # 外部函数
name = 'mark'
def inner(): # 内部函数
print(name)
print(inner.__closure__) #判断闭包函数的方法
return inner f = func()
f()

总结

命名空间

函数的嵌套

  嵌套定义:定义在内部的函数无法直接在全局被调用

函数名的本质

  就是一个变量,保存了函数所在的内存地址

闭包

  内部函数包含对外部作用域而非全剧作用域名字的引用,该内部函数称为闭包函数

09-Python之路---函数进阶的更多相关文章

  1. python之路——函数进阶

    阅读目录   楔子 命名空间和作用域 函数嵌套及作用域链 函数名的本质 闭包 本章小结 楔子 假如有一个函数,实现返回两个数中的较大值: def my_max(x,y): m = x if x> ...

  2. Python全栈之路----函数进阶----装饰器

    Python之路,Day4 - Python基础4 (new版) 装饰器 user_status = False #用户登录后改为True def login(func): #传入想调用的函数名 de ...

  3. 【python 3】 函数 进阶

    函数进阶 1.函数命名空间和作用域 命名空间一共分为三种: 全局命名空间 局部命名空间 内置命名空间 *内置命名空间中存放了python解释器为我们提供的名字:input , print , str ...

  4. python语法基础-函数-进阶-长期维护

    ###############    函数的命名空间和作用域    ############## """ # 函数进阶 命名空间和作用域 命名空间 全局命名空间——我们自 ...

  5. python之路:进阶篇

     > ) {        ;    }    printf(;} print i >>>      >>>  == :    name  ==   ==   ...

  6. Python之路-函数

    一.函数是什么: python中函数定义:函数是逻辑结构化和过程化的一种编程方法.定义函数的方法为: def function(): ""The function definiti ...

  7. python之路:进阶篇 内置函数

     li = [11, 22, 33] news = map(  li = [100, 2200, 3300] news = map(  [13, 24, 35] [11, 11, 11] [22, 4 ...

  8. Python全栈开发之路 【第五篇】:Python基础之函数进阶(装饰器、生成器&迭代器)

    本节内容 一.名称空间 又名name space,就是存放名字的地方.举例说明,若变量x=1,1存放于内存中,那名字x存放在哪里呢?名称空间正是存放名字x与1绑定关系的地方. 名称空间共3种,分别如下 ...

  9. Python全栈之路----函数进阶----名称空间

    又名name space,顾名思义就是存放名字的地方,存什么名字呢?举例说明,若变量x=1,1存放于内存中,那名字x存放在哪里呢?名称空间正是存放名字x与1绑定关系的=地方 名称空间共3种,分别如下 ...

随机推荐

  1. Memcached在企业中的应用

    Memcached简介 Memcached是一个自由开源的,高性能,分布式内存对象缓存系统. Memcached是以LiveJournal旗下Danga Interactive公司的Brad Fitz ...

  2. 汉字编码对照表(gb2312/Big5/GB2312)

    一.汉字编码的种类 1.GB2312又称国标码,由国家标准总局发布,1981年5月1日实施,通行于大陆.新加坡等地也使用此编码.它是一个简化字的编码规范,当然也包括其他的符号.字母.日文假名等,共74 ...

  3. Spring.getBean()流程和循环依赖的解决

    getBean流程介绍(以单例的Bean流程为准) getBean(beanName) 从BeanFactory中获取Bean的实例对象,真正获取的逻辑由doGetBean实现. doGetBean( ...

  4. 「每天一道面试题」Java类的生命周期包括哪几个阶段?

    一个Java类被加载到虚拟机中,它的生命周期才算开始,直到被从内存中卸载,它的生命周期才算结束.从开始到结束,它的整个生命周期包括加载.验证.准备.解析.初始化.使用和卸载7个阶段,其中验证.准备和解 ...

  5. 如何设计scalable 的系统 (转载)

    Design a Scalable System Design a system that scales to millions of users (AWS based) Step 1: Outlin ...

  6. java中for循环和while循环,哪个更快?--一道面试题

    for的 while的

  7. C++--浅谈开发系统的经验

    最近写了不少类了,从垃圾代码爬坑,虽然还是很垃圾,但是照葫芦画瓢,有几分神韵.在这里总结一下,写类的经验教训. 第一步 分析: 当拿到一个要求时,要先去考虑怎样一个类到底该实现什么样的功能,有什么样的 ...

  8. MySQL高级(十三)--- 表锁

    前言:锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算机资源(如CPU.RAM.I/O等)的争用外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是 ...

  9. ubuntu 使用 vsftpd 基于系统用户配置相互隔离的 ftp (ftps) 服务

    我们在日常使用 UbuntuServer 服务器时,经常会直接使用基于 ssh 的  sftp 连接服务器直接进行文件上传和下载,不过这个方式其实有一定的安全隐患,当一个团队有多个人员,需要连接服务器 ...

  10. Thinkphp 缓存RCE

     5.0.0<=ThinkPHP5<=5.0.10 .   漏洞利用条件: 1.基于tp5开发的代码中使用了Cache::set 进行缓存 2.在利用版本范围内 3.runtime目录可以 ...