一、函数对象

函数是第一类对象:函数的内存地址(即函数名)可以像一个变量值一样去使用

1、变量值可以被引用,例如 x = 1,y = x

def foo():
print('from foo') f = foo # 变量值(函数名)被引用
print(f)
f()

2、变量值可以当作参数传给另外一个函数

def foo():
print('from foo') def bar(x):
print(x)
x() bar(foo) # 函数名当作参数传给另外一个函数

3、变量值可以当作函数的返回值

def foo():
print('from foo') def func(x):
return x f = func(foo) # 函数名当作函数的返回值
print(f)

4、变量值可以当作容器类型的元素

def foo():
print('from foo') li = [foo, ] # 函数名当作列表的元素
print(li)
li[0]() dic = {'': foo} # 函数名当作字典的元素
print(dic)
dic['']()

二、函数嵌套

1、函数的嵌套定义:在函数内又定义了其他函数

def func():
def foo():
print('from foo') foo()
x = 1
print(x) func()

2、函数嵌套调用:在一个函数内部又调用其他函数

# 比较四个数的大小
def max2(x, y):
if x > y:
return x
else:
return y def max4(a, b, c, d):
res1 = max2(a, b)
res2 = max2(res1, c)
res3 = max2(res2, d)
return res3 print(max4(1, 2, 3, 4))
# 计算圆的面积和周长

from math import pi

def circle(radius, action):
def cal_perimeter():
return 2 * pi * radius def cal_area():
return pi * (radius ** 2) if action == 1:
res = cal_perimeter()
elif action == 2:
res = cal_area() return res res = circle(5, 1)
print(res)

计算圆的面积和周长

三、名称空间

1、定义:存放名字与值的内存地址绑定关系的地方

2、名称空间分为三大类:

  内置名称空间:存放的是 Python 解释器自带的名字,Python 解释器的启动则产生,关闭则销毁

  全局名称空间:创建的存储 “变量名与值的关系” 的空间,是在顶级定义的,Python程序执行时产生,程序执行完毕后则销毁

  局部名称空间:在函数的运行中开辟的临时的空间,是在函数内部定义的,在函数调用时临时产生,调用完毕后则销毁

三种名称空间的加载顺序和取值顺序:

加载顺序:内置(程序运行前加载)-->全局(从上到下顺序加载进来的)-->局部(调用的时候加载)--->内置

取值:

  当前在局部名称空间:局部 ---> 全局 ---> 内置

  当前在全局名称空间:全局 ---> 内置

使用:全局不能使用局部的,局部的可以使用全局的

四、作用域:就是作用范围

1、全局作用域

定义:包含内置与全局名称空间的名字

特点:在整个程序的任意位置都能被引用,全局有效

2、局部作用域

定义:包含局部名称空间的名字

特点:临时存活,只能在局部范围内生效

作用域关系是在函数定义阶段就已经固定死了,与调用位置无关!!

# 示范一:
def f1():
print(xxx)
xxx = 111 def f2():
xxx = 222
# 不管f1在哪调用, 都是去找定义阶段的作用域关系,
# 与上面的xxx=222没有任何关系
f1() f2() # 执行结果:111
# 示范二:
xxx = 111
def f1():
'''
函数定义阶段只检测语法, 不执行代码
这里先输出xxx, 先从局部找xxx, 找到了x=222但是却定义在了输出的下面
语法上这种写法是错误的
'''
print(xxx)
xxx = 222 f1() # 执行结果报错

五、闭包函数

闭:封闭,指的是该函数定义一个内部函数

包:该内部函数包含了对外层函数作用域中变量的引用

def outter():
x = 1
def inner():
print("from inner", x)
return inner f = outter() # 通过外部函数拿到了内部函数的地址 def foo():
print(f)
f() foo()

为函数体传值的两种方式:

  def foo():

    print('hello %s' %name)

方式一:直接以参数的形式传入

def foo(name):
print("hello %s" %name) foo('qiu')
foo('qiu')
foo('qiu')

这种方式要想多次传值,每次都要手动添加参数

方式二:闭包含数

def outter(name):
def foo():
print("hello %s" %name)
return foo f = outter('qiu')
f()
f()
f()

要想多次传值只需要多次调用函数即可

应用:获取一个网页的信息

# 解决方案一: 以参数的形式传入

def get(url):
response = requests.get(url)
if response.status_code == 200:
print(response.text) # 要想多次获取信息只能多次传入
get('https://www.baidu.com')
get('https://www.cnblogs.com')
# 解决方案二: 闭包函数无需多次传入

def outter(url):
def get():
response = requests.get(url)
if response.status_code == 200:
print(response.text) return get baidu = outter('https://www.baidu.com')
cnblogs = outter('https://www.cnblogs.com') # 要想多次获取只需多次调用
baidu()
baidu()
cnblogs()

Learning-Python【11】:函数嵌套及作用域的更多相关文章

  1. python基础—函数嵌套与闭包

    python基础-函数嵌套与闭包 1.名称空间与作用域 1 名称空间分为: 1 内置名称空间   内置在解释器中的名称 2 全局名称空间   顶头写的名称 3 局部名称空间 2 找一个名称的查找顺序: ...

  2. python之路day10-命名空间和作用域、函数嵌套,作用域链、闭包

    楔子 假如有一个函数,实现返回两个数中的较大值: def my_max(x,y): m = x if x>y else y return mbigger = my_max(10,20)print ...

  3. Python之函数--命名空间、作用域、global、nonlocal、函数的嵌套和作用域链

    命名空间 -------‘’存放名字与值的关系”的空间 代码在运行伊始,创建的存储“变量名与值的关系”的空间叫做全局命名空间: 在函数的运行中开辟的临时的空间叫做局部命名空间. 命名空间一共分为三种: ...

  4. Day 11 函数对象,函数嵌套,作用域,闭包

    函数总结 # 函数的定义:def func(a, b):    print(a, b)    return a + b​​# 函数四个组成部分# 函数名:调用函数的依据,必须的# 函数体:执行函数逻辑 ...

  5. day 10 函数命名空间、函数嵌套和作用域

    1. day 09 内容复习 # 函数 # 可读性强 复用性强 # def 函数名(): # 函数体 #return 返回值 # 所有的函数 只定义不调用就一定不执行 #先定义后调用 #函数名() # ...

  6. python中函数嵌套、函数作为变量以及闭包的原理

    嵌套函数: python允许创建嵌套函数.也就是说我们可以在函数里面定义函数,而且现有的作用域和变量生存周期依旧不变. 例子: #encoding=utf-8 def outer():    name ...

  7. 《Python》 函数嵌套、闭包和迭代器

    一.函数的嵌套: 1.函数的嵌套调用 def max2(x,y): m = x if x>y else y return m def max4(a,b,c,d): res1 = max2(a,b ...

  8. python之函数嵌套

    python很多特性与JavaScript是相似甚至相同的: 1. 无类型 2. 函数亦对象 .... 自然: python也允许函数嵌套, 这与JavaScript中函数闭包的作用一样....

  9. 跟着太白老师学python day10 函数嵌套, global , nonlocal

    函数嵌套: 第一种嵌套方法 def func(): count = 123 def inner(): print(count) inner() func() 第二种嵌套方法 count = 123 d ...

随机推荐

  1. spring 核心

    1 Spring 1.1 专业术语了解 1.1.1 组件/框架设计 侵入式设计 引入了框架,对现有的类的结构有影响:即需要实现或继承某些特定类. 例如:     Struts框架 非侵入式设计 引入了 ...

  2. [教程]微信官方开源UI库-WeUI使用方法【申明:来源于网络】

    [教程]微信官方开源UI库-WeUI使用方法 [ 教程]微信官方开源UI库-WeUI使用方法 地址:http://www.weui.org.cn/?/article/1 微信公众号开发-WeUI使用说 ...

  3. NFC中国-中国第一NFC论坛,NFC中文论坛+NFC技术社区+NFC_电子发烧友网【申明:来源于网络】

    NFC中国-中国第一NFC论坛,NFC中文论坛+NFC技术社区[申明:来源于网络] NFC中国-中国第一NFC论坛,NFC中文论坛:http://nfcchina.org/forum.php NFC技 ...

  4. 线程同步-使用SimaphoreSlim类

    SimaphoreSlim类是作为Semaphore类的轻量级版本的.该类限制了同时访问同一个资源的线程数量. 代码Demo: using System;using System.Threading; ...

  5. 图->连通性->关节点和重连通分量

    文字描述 相关定义:假若在删去顶点v以及和v相关联的各边之后,将图的一个连通分量分割成两个或两个以上的连通分量,则称顶点v为该图的一个关节点.一个没有关节点的连通图称为重连通图. 在重连通图上,任意一 ...

  6. WebDriver API--元素定位

    WebDriver属于Selenium体系中设计出来操作浏览器的一套API, 站在WebDriver的角度, 因为它针对多种编程语言都实现了一遍这套API,所以它可以支持多种编程语言: 站在编程语言的 ...

  7. PTA地下迷宫探索

    地道战是在抗日战争时期,在华北平原上抗日军民利用地道打击日本侵略者的作战方式.地道网是房连房.街连街.村连村的地下工事,如下图所示. 我们在回顾前辈们艰苦卓绝的战争生活的同时,真心钦佩他们的聪明才智. ...

  8. 斑马打印机ZT410中文打印

    ^XA ^CW1, E:SIMSUN.TTF^CI28^FO50,50^A1N,50,50^FD汉字^FS^XZ ******************************************* ...

  9. javaweb(2)之Servlet入门

    Hello Servlet 方式一 1.新建 web 工程,编写一个类,实现 javax.servlet.Servlet 接口: package com.zze.servlet; import jav ...

  10. java框架之Spring(2)-注解配置IOC&AOP配置

    注解配置IoC 准备 1.要使用注解方式配置 IoC,除了之前引入的基础 jar 包,还需要引入 spring-aop 支持包,如下: 2.在 applicationContext.xml 中引入 c ...