Python入门之函数的嵌套/名称空间/作用域/函数对象/闭包函数

时间:2021-05-30 01:23:26

本篇目录:

    一、函数嵌套

    二、函数名称空间与作用域

    三、函数对象

    四、闭包函数

==============================================================================

一、函数嵌套

  1. 函数的嵌套调用

      函数内又调用了其他函数(函数平级)

def max(x,y):
return x if x > y else y def max4(a,b,c,d):
res1=max(a,b)
res2=max(res1,c)
res3=max(res2,d)
return res3
print(max4(1,2,3,4))

  

    2. 函数的嵌套定义

      函数在自己内部定义了其他函数(自己使用)

def f1():
def f2():
print('from f2')
f2()
f1()

二、函数名称空间与作用域

  1. 空间名称的定义

#名称空间:存放名字的地方,三种名称空间,(之前遗留的问题x=1,1存放于内存中,那名字x存放在哪里呢?名称空间正是存放名字x与1绑定关系的地方)

    

    1.1 内置名称空间 

# a. Python解释器自带的名字,Python自带的一些方法, built-in function
# b. 打开Python解释器时候就加载就绪,解释器关闭就释放资源

   

    1.2 全局名称空间

# a. 文件级别的名字,不是系统自带,不是函数内部
# b. 执行文件,加载内容时候准备就绪;在文件执行结束,或者文件运行期间被删除的时候,是释放资源

Python入门之函数的嵌套/名称空间/作用域/函数对象/闭包函数    

    1.3 局部名称空间

# a. 函数内部定义的名字,函数的参数以及函数内的名字都存放在局部名称空间
# b. 在函数调用时候临时生效

Python入门之函数的嵌套/名称空间/作用域/函数对象/闭包函数

  2. 名字空间的加载顺序

python test.py
#1、python解释器先启动,因而首先加载的是:内置名称空间
#2、执行test.py文件,然后以文件为基础,加载全局名称空间
#3、在执行文件的过程中如果调用函数,则临时产生局部名称空间
#4、内部名称空间>>>全局名称空间>>>局部名称空间

Python入门之函数的嵌套/名称空间/作用域/函数对象/闭包函数

  3. 函数的作用域

Python入门之函数的嵌套/名称空间/作用域/函数对象/闭包函数

#1、作用域即范围
- 全局范围(内置名称空间与全局名称空间属于该范围):全局存活,全局有效
  - 局部范围(局部名称空间属于该范围):临时存活,局部有效
#2、作用域关系是在函数定义阶段就已经固定的,与函数的调用位置无关,如下
x=1
def f1():
def f2():
print(x)
return f2
x=100
def f3(func):
x=2
func()
x=10000
f3(f1()) #3、查看作用域:globals(),locals() LEGB 代表名字查找顺序: locals -> enclosing function -> globals -> __builtins__
locals 是函数内的名字空间,包括局部变量和形参
enclosing 外部嵌套函数的名字空间(闭包中常见)
globals 全局变量,函数定义所在模块的名字空间
builtins 内置模块的名字空间
# 局部名称空间--->全局名称空间--->内置名称空间

# 需要注意的是:在全局无法查看局部的,在局部可以查看全局的,如下示例

# max=1
def f1():
# max=2
def f2():
# max=3
print(max)
f2()
f1()
print(max)

  

    3.1 全局作用域

# 包含的是内置名称空间和全局名称空间;
# 在任何位置都已访问,该范围内名字会伴随程序整个生命周期

    3.2 局部作用域

# 包含的是局部名称空间的名字;
# 只能在函数内使用,调用函数时生效,调用结束失效

三、函数对象(函数在Python中是第一类对象)

  

  1. 函数可以被引用

Python入门之函数的嵌套/名称空间/作用域/函数对象/闭包函数

  2.函数可以被当作参数传入

Python入门之函数的嵌套/名称空间/作用域/函数对象/闭包函数

# 注意函数名字没带括号,传入的是内存地址
# 如果是函数名带括号,传入的是函数的return值

  3. 函数可以当返回值

Python入门之函数的嵌套/名称空间/作用域/函数对象/闭包函数

  4. 函数可以被当作容器类型的元素(放入列表,元素,字典中)

Python入门之函数的嵌套/名称空间/作用域/函数对象/闭包函数

Python入门之函数的嵌套/名称空间/作用域/函数对象/闭包函数

# 注意下图中, dic[choice](),相当于value加了括号,直接调用了函数

Python入门之函数的嵌套/名称空间/作用域/函数对象/闭包函数

四、闭包函数

  1. 什么是闭包

#内部函数包含对外部作用域而非全局作用域的引用

#提示:之前我们都是通过参数将外部的值传给函数,闭包提供了另外一种思路,包起来喽,包起呦,包起来哇

        def counter():
n=0
def incr():
nonlocal n
x=n
n+=1
return x
return incr c=counter()
print(c())
print(c())
print(c())
print(c.__closure__[0].cell_contents) #查看闭包的元素

  2.闭包的意义与作用

#闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域
#应用领域:延迟计算(原来我们是传参,现在我们是包起来)
from urllib.request import urlopen def index(url):
def get():
return urlopen(url).read()
return get baidu=index('http://www.baidu.com')
print(baidu().decode('utf-8'))
# 作用域关系,在函数定义阶段就被固定了,与调用位置无关(请看下图解释)

Python入门之函数的嵌套/名称空间/作用域/函数对象/闭包函数

Python入门之函数的嵌套/名称空间/作用域/函数对象/闭包函数的更多相关文章

  1. Python记录9:函数4:名称空间作用域+闭包函数+装饰器

    ''' 一: 名称空间namespaces     名称空间就是存放名字与值绑定关系的内存空间 二: 名称空间分为三种     内置名称空间:         1. 特点: 存放是python解释器自 ...

  2. 【0809 | Day 12】可变长参数/函数的对象/函数的嵌套/名称空间与作用域

    可变长参数 一.形参 位置形参 默认形参 二.实参 位置实参 关键字实参 三.可变长参数之* def func(name,pwd,*args): print('name:',name,'pwd:',p ...

  3. 《Python》 函数进阶和名称空间作用域

    函数进阶: 一.动态参数:*args  **kwargs *args是元祖形式,接收除去键值对以外的所有参数 # args可以换成任意变量名,约定俗成用args **kwargs接收的只是键值对的参数 ...

  4. Python 基础之函数的嵌套与nonlocal修改局部变量及闭包函数

    一.函数的嵌套 嵌套在外层,称之为外函数 嵌套在里层,称之为内函数#例:def outer(): def inner():        print("I'm inner")    ...

  5. Python 函数对象-函数嵌套-名称空间与作用域-闭包函数

    今日内容: 1. 函数对象 函数是第一类对象: 指的是函数名指向的值可以被当中数据去使用 1.可以被引用 2.可以当做参数传给另一个函数 3.可以当做一个函数的返回值 4.可以当做容器类型的元素 2. ...

  6. Python函数02/函数的动态参数/函数的注释/名称空间/函数的嵌套/global以及nolocal的用法

    Python函数02/函数的动态参数/函数的注释/名称空间/函数的嵌套/global以及nolocal的用法 目录 Python函数02/函数的动态参数/函数的注释/名称空间/函数的嵌套/global ...

  7. day 23 对象的名称空间 类,对象属性和方法 封装 接口提供

    一.对象的特有名称空间 # 对象独有的名称空间:在产生对象时就赋初值 '''class ted: def func(): 当func里不存在参数时,调用时不需要给值 print('hah')ted.f ...

  8. python-函数进阶-动态传参,名称空间,作用域的问题

    一.函数的动态的动态参数 动态参数分为两种:动态接收位置参数.动态接收关键字参数. 1.*args  位置参数动态传参 # 顺序: 位置参数=>*args(arguments) => 默认 ...

  9. 036-PHP闭包函数的域限制,与如何向闭包函数传递变量

    <?php // 闭包函数的域限制,与如何向闭包函数传递变量 # 隐藏上面的代码,我们最后再来试下 function demo($ATxt) { $func = function () use ...

随机推荐

  1. ajax简单应用

    var xmlhttp;if (window.XMLHttpRequest) { // IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码 xmlhttp=new ...

  2. PHP时间日期

    PHP常用的几个时间日期函数有:date(),mktime(),strtotime(); 一.string date ( string $format [, int $timestamp ] ) 函数 ...

  3. Redis、Memcache和MongoDB的区别

    >>Memcached Memcached的优点:Memcached可以利用多核优势,单实例吞吐量极高,可以达到几十万QPS(取决于key.value的字节大小以及服务器硬件性能,日常环境 ...

  4. color the python console text

    //install termcolor module cd \ cd python27 cd scripts pip install termcolor pip install colorama // ...

  5. android获取屏幕分辨率

    DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); dm. ...

  6. 工厂类分离与java反射机制

    网易 博客 发现 小组 风格 手机博客 玩LOFTER,免费冲印20张照片!> 创建博客登录  加关注 黙言-在路上 奋斗 首页 日志 相册 音乐 收藏 博友 关于我             黙 ...

  7. React虚拟DOM具体实现——利用节点json描述还原dom结构

    前两天,帮朋友解决一个问题: ajax请求得到的数据,是一个对象数组,每个对象中,具有三个属性,parentId,id,name,然后根据这个数据生成对应的结构. 刚好最近在看React,并且了解到其 ...

  8. 自学Zabbix3&period;6&period;5-触发器item-Unit symbols单位符号

    在zabbix里面,我们不需要使用大数字来,例如我们可以不使用86400来表示一天,这个数字又不容易理解也容易出错.用什么办法来解决大数字问题呢?我们可以使用单位来简化,例如简化zabbix触发器表达 ...

  9. Delphi之TStrings和TStringLists类

    Delphi之TStrings和TStringLists类 有些类不是组件,但它们支持存在的组件.这些类是其他组件的典型属性,直接由TPersistent派生,如TStrings.TCanvas和TC ...

  10. 数据库MySql的安装

    1.MySQL概述 MySQL最初是由“MySQL AB公司”开发的一套关系型数据库管理系统(RDBMS-Relation DataBase Management System).MySQL不仅是最流 ...