函数的嵌套

  通过名字就能理解,函数里是还可以套着函数用的。这么牛,下面就来看看几段代码,看看是怎么回事。注意:函数一定是先定义后使用。

x=1234
def f1(): #定义一个主函数
x = 1
print('f1---> ', x)
def f2(): #主函数下的嵌套函数
x = 2
print('f2-----> ', x)
def f3(): #主函数下的嵌套函数
x = 3
print('f3-------> ', x)
f3() #调用函数f3
f2()#调用函数f2 f1() #调用主函数
f1---> 1 #以下是输出的结果
f2-----> 2
f3-------> 3

  函数的特性:

  1、函数可以被赋值

def foo(): #创建一个函数
print('foo')
f=foo #给变量名为f的赋值为foo函数
print(f)
f() #变量名可以直接调用函数等同于发f()=foo()

  2、可以把函数当成参数传递

def bar(func):#func=foo的值,给函数传参数
print(func)
func()
bar(foo)#foo是上面那个函数的返回值

  3、可以把函数当成返回值

def bar(func):
print(func)
return func f=bar(foo) #将foo的值传给func
print(f)
f()
<function foo at 0x0000000002133E18> #打印func的内存地址和foo的一致
foo #f的值

  4、把函数当做容器类型的元素去用(这个就不用举例了,像列表、元组、字典等容器)

  名称空间与作用域  

  名称空间是名称(标识符)到对象的映射。

  向名称空间添加名称的操作过程涉及到绑定标识符到指定对象的操作(以及给该对象的引用计数加 1 )。

  名称空间分为:

  1、内置名称空间

  2、全局名称空间

  3、局部名称空间

  作用域分为:

  1、L:local,局部作用域,即函数中定义的变量;

  2、E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的;

  3、G:globa,全局变量,就是模块级别定义的变量;

  4、B:built-in,系统固定模块里面的变量,比如int, bytearray等。

  搜索变量的优先级顺序依次是:

  作用域局部>外层作用域>当前模块中的全局>python内置作用域,也就是L>E>G>B。

  闭包

  闭包:首先必须是内部定义的函数,该函数包含对外部作用域而非全局作用域定义变量的引用。

x=1234 #x为全局作用域
def f1(): #定义一个主函数 f1函数名为全局作用域
x = 1
print('f1---> ', x)
def f2(): #f2为这个函数的局部作用域
x = 2
print('f2-----> ', x)
def f3(): #f3为这个函数的局部作用域
print('f3-------> ', x)
f3() #调用函数f3
f2()#调用函数f2 f1() #调用主函数
f1---> 1 #以下是输出的结果
f2-----> 2
f3-------> 2 #这个值就是调用的父级函数变量名的值

  总结:因为上面我们清楚了作用域搜索变量的优先顺序,在父级函数能匹配到对应的变量名的值,so,这个全局作用域的x的值形同虚设。没有引用到全局作用域的变量名的值,这就是闭包。

Python基础之函数二的更多相关文章

  1. python基础(12):函数(二)

    1. 函数参数 之前我们说过了传参,如果我们需要给⼀个函数传参,⽽参数⼜是不确定的,或者我给⼀个函数传很多参数,我的形参就要写很多,很⿇烦,怎么办呢,我们可以考虑使⽤动态参数. 形参的第三种: 动态参 ...

  2. Python 基础 面向对象之二 三大特性

    Python 基础 面向对象之二 三大特性 上一篇主要介绍了Python中,面向对象的类和对象的定义及实例的简单应用,本篇继续接着上篇来谈,在这一篇中我们重点要谈及的内容有:Python 类的成员.成 ...

  3. python基础篇(二)

    PYTHON基础篇(二) if:else,缩进 A:if的基础格式和缩进 B:循环判断 C:range()函数和len()函数 D:break,contiue和pass语句 for,while循环 函 ...

  4. python基础之函数详解

    Python基础之函数详解 目录 Python基础之函数详解 一.函数的定义 二.函数的调用 三.函数返回值 四.函数的参数 4.1 位置参数 4.2 关键字参数 实参:位置实参和关键字参数的混合使用 ...

  5. python基础——匿名函数

    python基础——匿名函数 当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便.  在Python中,对匿名函数提供了有限支持.还是以map()函数为例,计算f(x)=x2时 ...

  6. python基础——返回函数

    python基础——返回函数 函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回.  我们来实现一个可变参数的求和.通常情况下,求和的函数是这样定义的: def calc_ ...

  7. python基础——sorted()函数

    python基础——sorted()函数 排序算法 排序也是在程序中经常用到的算法.无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小.如果是数字,我们可以直接比较,但如果是字符串或者两个d ...

  8. python基础——filter函数

    python基础——filter函数 Python内建的filter()函数用于过滤序列. 和map()类似,filter()也接收一个函数和一个序列.和map()不同的是,filter()把传入的函 ...

  9. python基础——匿名函数及递归函数

    python基础--匿名函数及递归函数 1 匿名函数语法 匿名函数lambda x: x * x实际上就是: def f(x): return x * x 关键字lambda表示匿名函数,冒号前面的x ...

随机推荐

  1. JAVA配置文件/反射操作

    配置文件 1. 在src目录下新建一个file, 命名为XXX.properties 2.编写配置文件: 3. import java.util.ResourceBundle; 4. 使用如下代码读取 ...

  2. MySql 在cmd下的学习笔记 —— 有关多表查询的操作(内连接,外连接,交叉连接)

    mysql> create table test5( -> id int, ) -> )engine myisam charset utf8; Query OK, rows affe ...

  3. Docker安装MySQL

    查看镜像 docker search mysql 拉取镜像 docker pull mysql:5.7 说明:5.7为指定下载的版本,可以更换其他版本 运行镜像 docker run --name m ...

  4. 修改/dev/shm大小 tmps

    /dev/shm  在oracle开启AMM时发现/dev/shm下的空间不够用 WARNING: You are trying to use the MEMORY_TARGET feature. T ...

  5. android java 字符串正则表达式 分离特殊字符串

    Java中正则表达式的使用 在Java中,我们为了查找某个给定字符串中是否有需要查找的某个字符或者子字串.或者对字符串进行分割.或者对字符串一些字符进行替换/删除,一般会通过if-else.for 的 ...

  6. 连接字符串配置在App.config中

    <?xml version="1.0" encoding="utf-8"?> <configuration> <connectio ...

  7. 向量的L2范数求导

    回归中最为基础的方法, 最小二乘法. \[ \begin{align*} J_{LS}{(\theta)} &= \frac { 1 }{ 2 } { \left\| A\vec { x } ...

  8. 第八章 让Bootstrap轮播插件carousel支持左右滑动手势的三种方法

    因为最近开发的项目涉及到移动设备上的 HTML5 开发,其中需要实现轮播效果.然后最快捷的方式,你知道的(Bootstrap),然后原生的 Bootstrap 的 carousel.js 插件并没有支 ...

  9. System.Data.SqlClient.SqlException: 数据类型 text 和 varchar 在 equal to 运算符中不兼容。

    一.引起的源头 环境:vs2015,sqlserver2008 相关程序包:ef6 定义了一个实体article public class Article { public string Data{g ...

  10. 【转】细说new与malloc的10点区别

    1.申请的内存所在位置 new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存.自由存储区是C++基于new操作符的一个抽象概念,凡是通过new ...