一、名称空间与作用域

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

内置名称空间:在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. C++ base64 opencv Mat 转换

    static std::string base64Decode(const char* Data, int DataByte) { //解码表 const char DecodeTable[] = { ...

  2. goland设置颜色和字体

  3. 【python之路40】Python 作用域

    python的作用域与javaScript是一样的,参考:http://www.cnblogs.com/sunshuhai/p/9112578.html 一.python是以函数作为作用域的 if 1 ...

  4. TZ_06_SpringMVC_传统文件上传和SpringMVC文件上传方式

    1.传统文件上传方式 <!-- 文件上传需要的jar --> <dependency> <groupId>commons-fileupload</groupI ...

  5. Java中的String,StringBuffer和StringBuilder

    在了解这个问题的时候查了不少资料,最有帮助的是这个博文:http://swiftlet.net/archives/1694,看了一段时间,咀嚼了一段时间,写一个经过自己消化的博文,希望能帮到大家. 首 ...

  6. jnhs中国的省市县区邮编坐标mysql数据表

    https://blog.csdn.net/sln2432713617/article/details/79412896 -- 1.之前项目中需要全国的省市区数据,在网上找了很多,发现数据要么不全,要 ...

  7. 避免SQL注入三慷慨法

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/wangyy130/article/details/26154837       要说SQL注入还要从 ...

  8. 2019.9.28 csp-s模拟测试54 反思总结

    咕咕咕的冲动如此强烈x T1x: 看完题目想了想,感觉把gcd不为1的强行放在一组,看作一个连通块,最后考虑连通块之间的组合方式就可以了. 然后维护这个连通块可以写并查集可以连边跑dfs怎么着都行… ...

  9. top进程命令

    top命令用来显示系统当前的进程状况. 格式:top [选项] 主要选项如下. d:指定更新的间隔,以秒计算. q:没有任何延迟的更新.如果使用者有超级用户,则top命令将会以最高的优先序执行. c: ...

  10. Intellij IDEA 创建资源文件夹 source folder

    [转载]原文链接:https://blog.csdn.net/u014723529/article/details/78050725 之前用 eclipse 新建有一个 source folder , ...