day4_python之名称空间与作用域、闭包函数、嵌套函数
一、名称空间与作用域
名称空间:存放名字的地方,准确的说名称空间是存放名字与变量值绑定关系的地方 内置名称空间:在python解释器启动时产生,存放一些python内置的名字
全局名称空间:在执行文件时产生,存放文件级别定义的名字
x=1
def func():
y=2
def f1():pass
print import os class Foo:
pass if x==1:z=3 del x 局部名称空间:在执行文件的过程中,如果调用了函数,则会产生该函数的局部名称空间
用来存放该函数内定义的名字,该名字在函数调用时生效,在函数调用结束后失效 加载顺序:内置---》全局---》局部 优先掌握一:名字的查找顺序是:局部-》全局-》内置 # max=1
def foo():
max=2
# print(max) foo()
print(max) x=0
def f1():
x=1
def f2():
x=2
def f3():
x=3
print(x)
f3()
f2()
print('=f1========',x) f1() def func1():
print('from func1') def func1():
print('=====?>') func1() x=1
x=10
print(x)
1、什么是名称空间?
#名称空间:存放名字的地方,三种名称空间,(之前遗留的问题x=1,1存放于内存中,那名字x存放在哪里呢?名称空间正是存放名字x与1绑定关系的地方)
2、名称空间的加载顺序
python test.py
#1、python解释器先启动,因而首先加载的是:内置名称空间
#2、执行test.py文件,然后以文件为基础,加载全局名称空间
#3、在执行文件的过程中如果调用函数,则临时产生局部名称空间
3、名字的查找顺序

局部名称空间--->全局名称空间--->内置名称空间 #需要注意的是:在全局无法查看局部的,在局部可以查看全局的,如下示例 # max=1
def f1():
# max=2
def f2():
# max=3
print(max)
f2()
f1()
print(max)

二、作用域
作用域:作用的范围,
全局作用域:全局存活,全局有效:globals()
max=1111111
def f1():
def f2():
def f3():
def f4():
# print(x)
print(max)
f4()
f3()
f2() f1()
局部作用域:临时存活,局部有效:locals() x=11111111111111111111111111111111111111111111 def f1():
x=1
y=2
def f2():pass
# print(locals())
print(globals()) f1()
print(locals() is globals())
print(locals()) print(dir(globals()['__builtins__'])) --------------------------------------------------
global nonlocal掌握 :global 修改全局的
x=1
def f1():
global x 明确声明x就是全局的x ,所以就会把全局的x=1,改成局部的x=2。
x=2 f1()
print(x)
----------------------------------------------- l=[]
def f2():
l.append('f2') 能直接把l的值改‘f2’,因为l是列表,列表是可变类型。 f2()
print(l) ----------------------------------------------------
x=0
def f1():
# x=1
def f2():
# x=2
def f3():
# global x
nonlocal x //修改的是函数内部正上方的那个X,所有x被修改成2.只在函数内部有效。
x=3
f3()
# print(x)
f2()
print(x)
f1()
print(x) ----------------------------------------------------- 优先掌握二:作用域关系,在函数定义时就已经固定
,与调用位置无关,在调用函数时,必须必须必须
回到函数原来定义的位置去找作用域关系 x=1
def f1():
def f2():
print(x)
return f2
def foo(func):
x=300000
func()
res=f1()
print(res)
func=f1()
print(func)
x=10000000
func()
x=10000000 def foo(func):
x=300000000
func() #f2()
x=10000000000000000000000 foo(f1())
# x=10000000000000000000000
# foo(f1()) x=1
def f1():
global x
x=2 f1()
print(x)
#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 内置模块的名字空间
三、global与nonlocal关键字
global nonlocal掌握 :global 修改全局的
x=1
def f1():
global x 明确声明x就是全局的x ,所以就会把全局的x=1,改成局部的x=2。
x=2 f1()
print(x)
----------------------------------------------- l=[]
def f2():
l.append('f2') 能直接把l的值改‘f2’,因为l是列表,列表是可变类型。 f2()
print(l) ----------------------------------------------------
x=0
def f1():
# x=1
def f2():
# x=2
def f3():
# global x
nonlocal x //修改的是函数内部正上方的那个X,所有x被修改成2.只在函数内部有效。
x=3
f3()
# print(x)
f2()
print(x)
f1()
print(x)
四、闭包函数
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'))

大前提:作用域关系,在函数定义时就已经固定
,与调用位置无关,在调用函数时,必须必须必须
回到函数原来定义的位置去找作用域关系 闭包函数:
1. 定义在函数内部的函数
2. 包含对外部作用域名字的引用,而不是对全局作用域名字的引用
那么该内部函数就称为闭包函数
x=1
def f1():
x=11111111111
def f2():
print(x)
return f2 func=f1() x=1000
func() def foo():
x=12312312312312312312312312312312312313123
func() foo() def deco():
x=123123123123
def wrapper():
print(x)
return wrapper func=deco() func() #闭包函数的应用:惰性计算
import requests #pip3 install requests 安装pip3 def get(url):
return requests.get(url).text print(get('https://www.python.org'))
print(get('https://www.python.org'))
print(get('https://www.python.org'))
print(get('https://www.python.org')) def index(url):
# url='https://www.python.org'
def get():
# return requests.get(url).text
print(requests.get(url).text) return get python_web=index('https://www.python.org')
baidu_web=index('https://www.baidu.com') python_web()
baidu_web() name='egon'
def index(url):
x=1
y=2
def wrapper():
# x
# y
# return requests.get(url).text
print(name)
return wrapper python_web=index('https://www.python.org') # print(python_web.__closure__[0].cell_contents)
print(python_web.__closure__)
# print(python_web.__closure__[0].cell_contents)
# print(python_web.__closure__[1].cell_contents)
# print(python_web.__closure__[2].cell_contents)
五、嵌套函数
函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数
def bar():
print('from nbar') def foo(): #再调用一个函数的过程中,又去调用了另外一个函数
print('from foo')
bar() foo() -----------------------------------------
求两个值最大的函数
def max2(x,y):
if x > y:
return x
else:
return y def max4(a,b,c,d): 求四个值的最大值
res1=max2(a,b) 把a b 传进去会得到第一个结果
res2=max2(res1,c) 再调用一次,拿着这一次得到的结果在跟c进行比较
res3=max2(res2,d)
return res3 得到res3最终的结果 print(max4(1,2,3,-1)) -------------------------------------------------
函数的嵌套定义:在一个函数的内部,又定义另外一个函数 def f2():
print('from f2') def f1():
x=1 函数内部定义的名字,只是在函数被调用的时候生效。
# def f2()
# print('from f2')
f2() f1()
day4_python之名称空间与作用域、闭包函数、嵌套函数的更多相关文章
- Python 函数对象-函数嵌套-名称空间与作用域-闭包函数
今日内容: 1. 函数对象 函数是第一类对象: 指的是函数名指向的值可以被当中数据去使用 1.可以被引用 2.可以当做参数传给另一个函数 3.可以当做一个函数的返回值 4.可以当做容器类型的元素 2. ...
- 10-Python入门学习-函数的对象与嵌套、名称空间与作用域、闭包函数
一.函数的对象 函数是第一类对象,指的是函数名指向的值(函数)可以被当作数据去使用 def func():# func=函数的内地址 print('from func') print(func) ag ...
- 周末学习笔记——day01(函数,函数对象,嵌套调用,名称空间,作用域,闭包,装饰器)
一,复习 字符编码 文件头:py2—ASCII,py3—UTF-8 三种字符串:u' ' b ' ' r ' ' u' ' .endcode(' utf-8 ') b' '.deconde(' utf ...
- Python之函数对象、函数嵌套、名称空间与作用域、闭包函数、装饰器
目录 一 函数对象 二 函数的嵌套 三 名称空间和作用域 四 闭合函数 五 装饰器 一.函数对象 1.函数是第一类对象 #第一类对象的特性:# 可以被引用 # 可以当做参数传递 # 返回值是函数 # ...
- PYTHON-函数对象,嵌套,名称空间与作用域,闭包函数
一 函数是第一类对象,即函数可以当作数据传递 1 可以被引用 2 可以当作参数传递 3 返回值可以是函数 3 可以当作容器类型的元素 def foo(): return len f = foo pri ...
- python函数:函数参数、对象、嵌套、闭包与名称空间、作用域
今天的内容整理共有5部分 一.命名关键字参数 二.函数对象 三.函数的嵌套 四.名称空间与作用域 五.闭包函数 一.命名关键字参数 # 命名关键字参数: 在定义函数时,*与**之间参数称之为命名关键字 ...
- python--函数、参数、名称空间与作用域、匿名函数、内置函数、闭包
python函数 函数定义 def welcome(): print('hello world!!') welcome() #函数调用 ...运行结果 hello world!! 函数定义和编写原则: ...
- python全栈开发-Day9 函数对象、函数嵌套、名称空间与作用域
一 .函数对象 一 .函数是第一类对象,即函数可以当作数据传递 可以被引用 可以当作参数传递 返回值可以是函数 可以当作容器类型的元素 二. 利用该特性,优雅的取代多分支的if def foo(): ...
- python之函数对象、函数嵌套、名称空间与作用域、装饰器
一 函数对象 一 函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 #3 返回值可以是函数 #3 可以当作容器类型的元素 二 利用该特性,优雅的取代多分支的if de ...
随机推荐
- Django-rest Framework(六)
不懂使用机制的直接看源码就好了,也不是很难,能够看得懂 视图家族 1. View:将请求方式与视图类的同名方法建立映射,完成请求响应(原生django) from django.views impor ...
- Cocos2dx 3.0 过渡篇(二十八)C++11强类型枚举
一朋友在微信朋友圈晒了张照片,随手点开大图,带着赞赏的眼光扫了下,恩,几个月不见.又美丽了...咦?等等,她戴的这是什么?酷炫的造型! 金属边框! 微型摄像头! 这不是传说中的谷歌眼镜么?土豪啊,还好 ...
- Odoo 中的widget
many2many_tags one2many_list selection progressbar selection statusbar handle monetary mail_thread s ...
- AT2164 Rabbit Exercise
传送门 解题思路 首先考虑k=1的情况,对于每一个a[i],它可能会到a[i-1]*2-a[i] 与 a[i+1]*2-a[i]两个位置,概率都为%50,那么它的期望位置为 (a[i-1]*2-a[i ...
- 用canvas 画出圆形图片
/** * 把图片处理成圆形,如果不是正方形就按最小边一半为半径处理 * @param {object} imgObj 图片(img)对象 * @param {number} imgType 设置生成 ...
- hdu 2586 (lca-RMQ)
#include <iostream> #include <cstdlib> #include <cstring> #include <queue> # ...
- 读书笔记--Head First 设计模式 目录
1.设计模式入门 2.观察者模式 3.装饰者模式 4.工厂模式 5.单件模式 6.命令模式 7.适配器模式与外观模式 8.模板方法模式 9.迭代器与组合模式 10.状态模式 11.代理模式 12.复合 ...
- Leetcode120.Triangle三角形最小路径和
给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 例如,给定三角形: [ [2], [3,4], [6,5,7], [4,1,8,3] ] 自顶向下的最小路径和为 11 ...
- Leetcode501.Find Mode in Binary Search Tree二叉搜索树中的众数
给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素). 假定 BST 有如下定义: 结点左子树中所含结点的值小于等于当前结点的值 结点右子树中所含结点的值大于等于当 ...
- 深入理解PHP类的自动载入机制方法
第一种情况:文件A.php中内容如下 <?phpclass A{ public function __construct(){ echo 'fff'; }}?> 文件C.php 中内容如下 ...