一、名称空间与作用域

名称空间:存放名字的地方,准确的说名称空间是存放名字与变量值绑定关系的地方

内置名称空间:在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之名称空间与作用域、闭包函数、嵌套函数的更多相关文章

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

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

  2. 10-Python入门学习-函数的对象与嵌套、名称空间与作用域、闭包函数

    一.函数的对象 函数是第一类对象,指的是函数名指向的值(函数)可以被当作数据去使用 def func():# func=函数的内地址 print('from func') print(func) ag ...

  3. 周末学习笔记——day01(函数,函数对象,嵌套调用,名称空间,作用域,闭包,装饰器)

    一,复习 字符编码 文件头:py2—ASCII,py3—UTF-8 三种字符串:u' ' b ' ' r ' ' u' ' .endcode(' utf-8 ') b' '.deconde(' utf ...

  4. Python之函数对象、函数嵌套、名称空间与作用域、闭包函数、装饰器

    目录 一 函数对象 二 函数的嵌套 三 名称空间和作用域 四 闭合函数 五 装饰器 一.函数对象 1.函数是第一类对象 #第一类对象的特性:# 可以被引用 # 可以当做参数传递 # 返回值是函数 # ...

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

    一 函数是第一类对象,即函数可以当作数据传递 1 可以被引用 2 可以当作参数传递 3 返回值可以是函数 3 可以当作容器类型的元素 def foo(): return len f = foo pri ...

  6. python函数:函数参数、对象、嵌套、闭包与名称空间、作用域

    今天的内容整理共有5部分 一.命名关键字参数 二.函数对象 三.函数的嵌套 四.名称空间与作用域 五.闭包函数 一.命名关键字参数 # 命名关键字参数: 在定义函数时,*与**之间参数称之为命名关键字 ...

  7. python--函数、参数、名称空间与作用域、匿名函数、内置函数、闭包

    python函数 函数定义 def welcome(): print('hello world!!') welcome() #函数调用 ...运行结果 hello world!! 函数定义和编写原则: ...

  8. python全栈开发-Day9 函数对象、函数嵌套、名称空间与作用域

    一 .函数对象 一 .函数是第一类对象,即函数可以当作数据传递 可以被引用 可以当作参数传递 返回值可以是函数 可以当作容器类型的元素 二. 利用该特性,优雅的取代多分支的if def foo(): ...

  9. python之函数对象、函数嵌套、名称空间与作用域、装饰器

    一 函数对象 一 函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 #3 返回值可以是函数 #3 可以当作容器类型的元素 二 利用该特性,优雅的取代多分支的if de ...

随机推荐

  1. 二、Python安装和第一个程序

    <1.Python语言介绍1.官方介绍:Python 是一款易于学习且功能强大的编程语言. 它具有高效率的数据结构,能够简单又有效地实现面向对象编程.Python 简洁的语法与动态输入之特性,加 ...

  2. python中的*args与**kwargs的含义与作用

    在定义函数的时候参数通常会使用 *args与**kwgs,形参与实参的区别不再赘述,我们来解释一下这两个的作用. *args是非关键字参数,用于元组,**kwargs是关键字参数 (字典)例如下面的代 ...

  3. matlab实现一次性实现多个文件夹图片转化为.mat文件

    %这里是主函数:命名为readImg.m; clc;clear; %---read_image; filepath = 'G:\人脸重建\data\src_all\';%图片路径可以根据自己需要修改; ...

  4. --1.plsql中学习job

    --1.plsql中学习job --学习job --建表 create table test_job(para_date date); commit; insert into test_job val ...

  5. [mybatis]Example的用法 标签: mybatis 2017-05-21 21:46 651人阅读 评论(11)

    Example类是什么? Example类指定如何构建一个动态的where子句. 表中的每个non-BLOB列可以被包括在where子句中. 例子是展示此类用法的最好方式. Example类可以用来生 ...

  6. HDU6135 拓展KMP模板

    emmm...模板,虽然每太搞懂 #include <iostream> #include <cstdio> #include <string.h> #pragma ...

  7. nfs服务安装配置

    一.准备阶段 配置解析主机 检查版本及内核 二.服务端安装 1) 配置yum把下载好的软件留着,下次备用,不用再下载 cachedir=/var/cache/yum/$basearch/$releas ...

  8. Shell脚本编程中截取字符串方法

    例如: 假设变量var=http://www.baidu.com/111.png 1.#号截取(删左留右) echo ${var#*//} # 号是运算符,*// 表示从左边开始删除第一个 // 号及 ...

  9. Redis 混合存储最佳实践指南

    Redis 混合存储实例是阿里云自主研发的兼容Redis协议和特性的云数据库产品,混合存储实例突破 Redis 数据必须全部存储到内存的限制,使用磁盘存储全量数据,并将热数据缓存到内存,实现访问性能与 ...

  10. 原生ajax请求json数据

    <?php header("content-type:text/html;charset=utf-8"); echo '{"name":"小明& ...