第1章 名称空间
1.1 定义
1.2 变量运行流程
1.3 临时名称空间
1.4 python三种名称空间
第2章 作用域
2.1 作用域分类
2.2 加载顺序
2.3 取值顺序
函数嵌套
2.4 函数中嵌套函数
2.5 嵌套中的局部空间
第3章 内置函数
3.1 globals()
3.2 locals()
3.3 可变数据类型
第4章 关键字
4.1 global
4.2 nonlocal
第5章 函数名的应用
5.1 函数名对应内存地址
5.2 函数名可以作为容器类数据的元素
5.3 函数名可以作为函数的参数
5.4 函数名可以作为函数的返回值
5.5 函数名可以赋值
第6章 闭包
6.1 __closure__
6.2 闭包引申
第7章 装饰器基础
7.1 原始版测代码效率
7.2 改版1:封装一个函数
7.3 改版2测试多个函数
7.4 改版3同原函数
7.5 改版4 最简单的装饰器
7.6 改版5 语法糖 @
7.7 改版6带参数的装饰器
7.8 改版7:带返回值
7.9 装饰器本质-模板
第8章 拾遗
8.1 python2 里没有nonlocal
8.2 内存地址的坑

第1章 名称空间

1.1 定义

u  名称空间:变量与值的内存地址的对应关系

u  也称:全局名称空间,命名空间

1.2 变量运行流程

解释:当程序运行时,代码从上至下执行,他会将变量与值的关系存储在一个空间中,当调用变量时,找到命名空间中的关系,并找到内存地址,打印内存地址信息

1.3 临时名称空间

u  也称:局部名称空间

u  特点:

当程序遇到函数时,他会将函数名存在内存中,函数体漠不关心

当函数执行时,内存会临时开辟一个空间,存放函数体里面的代码

函数外面访问不到临时空间的内容,随着函数执行完,临时空间关闭释放

1.4 python三种名称空间

u  全局名称空间

u  局部名称空间

u  内置名称空间

例:

# !/usr/bin/env python

# -*- coding:utf-8 -*-

name = 'wang'##全局名称空间

def func1():

name = 'xiao'#局部名称空间

print(111)#内置名称空间

func1()

第2章 作用域

2.1 作用域分类

u  全局作用域

内置名称空间

全局名称空间

u  局部作用域

局部名称空间

2.2 加载顺序

内置名称空间  èè 全局名称空间  èè 局部名称空间

|-程序执行         |-函数调用

2.3 取值顺序

u  从小到大不可逆的去找,单向不可逆

u  引用不是改变

u  取值是从小到大取值LEGB

u  想改变上层空间的变量,要用到global nonlocal

 

函数嵌套

2.4 函数中嵌套函数

例:

def func1():

print(666)

def func2():

func1()

print(333)

def func3():

func2()

print(222)

print(111)

func3()

print(555)

输出

C:\python3\python.exe
D:/python/untitled2/python_auto/lianxi3.py

111

666

333

222

555

2.5 嵌套中的局部空间

执行函数时开辟两个局部空间

def func1():

name =
'wang'

print(name)

def
func2():

name2
= 'su'

print(222)

print(333)

func2()

func1()

输出

C:\python3\python.exe
D:/python/untitled2/python_auto/lianxi3.py

wang

333

222

全局名称空间只能局部引用不能改变

例:

count =1

def func1():

count =
count +1

print(count)

func1()

输出

File
"D:/python/untitled2/python_auto/lianxi3.py", line 51, in func1

count =
count +1

UnboundLocalError: local variable 'count'
referenced before assignment

#报错:改变count之前要先定义

例:正确定义后

count =1

def func1():

count2 =
count +1

print(count2)

func1()

输出

D:/python/untitled2/python_auto/lianxi3.py

2

第3章 内置函数

用来验证名称空间中所存的值

3.1 globals()

返回一个字典,字典里的内容是全局名称空间里的内容

3.2 locals()

返回 以一个字典,当前位置的所有变量

例:

sex = '男'

def func1():

name =
'wang'

age = 100

print(globals())

print(locals())

func1()

输出

'D:/python/untitled2/python_auto/lianxi3.py',
'__cached__': None, 'sex': '男', 'func1': <function
func1 at 0x0000000001D33E18>}

{'age': 100, 'name': 'wang'}

3.3 可变数据类型

解释:对于可变数据类型 list
dict set 不用global
nonlocal

例:

list1 = []

def func1():

list1.append(666)

func1()

print(list1)

输出

C:\python3\python.exe
D:/python/untitled2/python_auto/lianxi3.py

[666]

第4章 关键字

4.1 global


可以引用并改变全局部变量


在局部作用域声明全局变量

例:应用改变

count =1

def func1():

global
count

count =
count +1

print(count)

func1()

print(count)

输出

C:\python3\python.exe
D:/python/untitled2/python_auto/lianxi3.py

2

2

例:在局部作用域声明全局变量

def func1():

global  name

name =
'wang'

print(name)

func1()

print(name)

输出

C:\python3\python.exe
D:/python/untitled2/python_auto/lianxi3.py

wang

wang

4.2 nonlocal

解释:不能操作全局变量,只能操作局部变量;从哪层引用的该变量,从那层开始全改变

不定义局部变量报错:UnboundLocalError:
local variable 'count' referenced before assignment

def func1():

count = 1

def
inner():

count
= count +1

print(count)

inner()

func1()

输出

File
"D:/python/untitled2/python_auto/lianxi3.py", line 67, in inner

count =
count +1

UnboundLocalError: local variable 'count'
referenced before assignment

例:nonlocal运用

def func1():

count = 1

def
inner():

nonlocal count

count
= count +1

print(count)

inner()

func1()

输出

C:\python3\python.exe
D:/python/untitled2/python_auto/lianxi3.py

2

第5章 函数名的应用

解释:函数名定义规则与变量一样,区别是加()就能执行,像这样的函数名又叫:第一类对象

5.1 函数名对应内存地址

例:

def func1():

print(999)

print(func1)

输出

C:\python3\python.exe
D:/python/untitled2/python_auto/lianxi3.py

<function func1 at 0x0000000000463E18>

5.2 函数名可以作为容器类数据的元素

例:

l1 = [func1,fun2,func3]

for i in l1:

i()

5.3 函数名可以作为函数的参数

def func1():

print(666)

def func2(x):

x()

print(222)

func2(func1)

输出

C:\python3\python.exe
D:/python/untitled2/python_auto/lianxi3.py

666

222

5.4 函数名可以作为函数的返回值

例1:

#!/usr/bin/env python

# -*- coding:utf-8 -*-

#注册

def func1():

print(111)

def func2(x):

x()

print(222)

return x

ret = func2(func1)

ret()

输出

C:\python3\python.exe
D:/python/untitled2/python_4/python_lession.py

111

222

111

5.5 函数名可以赋值

例2:

def func1():

print(222)

return
111

f1 = func1

f2 = f1

f3 = f2

print(f3)

f3()

输出

C:\python3\python.exe
D:/python/untitled2/python_auto/lianxi3.py

<function func1 at 0x0000000001D13E18>

222

第6章 闭包

解释:内层函数对外层函数非全局变量的引用

6.1 __closure__

判断方法:函数名.__closure__,返回None不是闭包

例:

name = 'wang'

def wrapper(x):

def
inner():

print(x)

inner()

print(inner.__closure__)

wrapper(name)

输出

D:/python/untitled2/python_auto/lianxi3.py

wang

(<cell at 0x00000000021565E8: str object at
0x0000000001DBA260>,)

6.2 闭包引申

闭包的特性:若果说python解释器遇到了闭包,他有一个机制,这个闭包不会随着函数的结束而释放,后在一定时间后被垃圾回收机制释放掉。

第7章 装饰器基础

作用:在不影响函数执行的基础上,增加一些额外的功能,登录认证,打印日志

#!/usr/bin/env python

# -*- coding:utf-8 -*-

import time

7.1 原始版测代码效率

print(time.time())

def func1():

time.sleep(0.3)

print('非常复杂')

start_time = time.time()

func1()

end_time = time.time()

print('次函数的效率%s' %
(end_time-start_time))

7.2 改版1:封装一个函数

def func1():

time.sleep(0.3)

print('非常复杂。。。')

def func2():

time.sleep(0.3)

print('特别复杂。。。')

7.3 改版2测试多个函数

被测试函数当参数传入,可以测试多个函数执行效率

def timmer(f):

start_time = time.time()

f()

end_time
= time.time()

print('次函数的执行效率%s' % (end_time - start_time))

timmer(func1)

timmer(func2)

7.4 改版3同原函数

测试函数执行效率的同时,不要改变原函数的调用方式

def timmer(f):

start_time = time.time()

f()

end_time
= time.time()

print('次函数的执行效率%s' % (end_time - start_time))

f1 = func1

func1 = timmer

func1(f1)

7.5 改版4 最简单的装饰器

改版3虽然大体上满足了我的要求,但是增加两行代码,而且多了参数,不好,继续改,尽量不添加其他代码,而且做到调用时一模一样

def timmer(f):

def
inner():

start_time = time.time()

f()

end_time = time.time()

print('次函数的执行效率%s' % (end_time - start_time))

return
inner

func1 = timmer(func1)

func2 = timmer(func2)

func1()

func2()

7.6 改版5 语法糖 @

改版4每次测试一个函数的执行效率时都需要增加一行,func1 =
timmer(func1)代码,麻烦,python提出了一个语法糖 @。

def timmer(f):

def
inner():

start_time = time.time()

f()

end_time = time.time()

print('此函数的执行效率%s' % (end_time - start_time))

return  inner

@timmer

def func1():

time.sleep(0.3)

print('非常复杂。。。。')

func1()

7.7 改版6带参数的装饰器

被装饰的函数肯定要有参数的,你现在不能满足,解决这个问题。被装饰的函数带参数的装饰器

def timmer(f):

def
inner(*args,**kwargs):

start_time = time.time()

f(*args,**kwargs)

end_time = time.time()

print('此函数的执行效率%s' % (end_time - start_time))

return  inner

@timmer

def func1(a,b):

time.sleep(0.3)

print(a,b)

print('非常复杂。。。。')

@timmer  # func1
= timmer(func1)  inner

def func2(a,b,name,sex='man'):  # f(1,2,,sex='nv',name='alex')

time.sleep(0.3)

print(a,b,sex,name)

print('非常复杂......')

func2(1,2,sex='nv',name='alex')  # inner()

7.8 改版7:带返回值

被装饰的函数肯定要有返回值的,解决这个问题。被装饰的函数带参数且有返回值的装饰器

def timmer(f): 
# f = func2 函数名

def
inner(*args,**kwargs):  # args = (1,2),kwargs {sex:'nv',name:'alex'}

start_time = time.time()

ret =
f(*args,**kwargs)  #
f(1,2,,sex='nv',name='alex')

end_time = time.time()

print('此函数的执行效率%s' % (end_time - start_time))

return ret

return
inner

@timmer  #
func1 = timmer(func1)  inner

def func2(a,b,name,sex='man'):  # f(1,2,,sex='nv',name='alex')

time.sleep(0.3)

print(a,b,sex,name)

print('非常复杂......')

return
666

print(func2(1,2,sex='nv',name='alex'))  # inner()

def timmer(f):

def
inner(*args,**kwargs):

start_time = time.time()

ret =
f(*args,**kwargs)

end_time = time.time()

print('此函数的执行效率%s' % (end_time - start_time))

return ret

return
inner

@timmer

def func2(a,b,name,sex='man'):

time.sleep(0.3)

print(a,b,sex,name)

print('非常复杂......')

return
666

ret1 = func2(1,2,sex='nv',name='alex')

print(ret1)

7.9 装饰器本质-模板

装饰器的本质:是闭包

装饰器根本作用:在不影响原函数执行的基础上,增加一些额外的功能登录认证,打印日志等等。

def wrapper(f):

def
inner(*args,**kwargs):

"""被装饰函数执行之前的操作"""

ret =
f(*args,**kwargs)

"""被装饰函数执行之后的操作"""

return ret

return
inner

第8章 拾遗

8.1 python2 里没有nonlocal

8.2 内存地址的坑

def extendlist(val,list=[]):

list.append(val)

return
list

list1 = extendlist(10)

list2 = extendlist(123,[])

list3 = extendlist('a')

print('list1=%s'%list1)

print('list=%s'%list2)

print('list3=%s'%list3)

输出

C:\python3\python.exe
D:/python/untitled2/python_4/python_lession.py

list1=[10, 'a']

list=[123]

list3=[10, 'a']

python_函数嵌套(4)的更多相关文章

  1. JavaScript ES7 中使用 async/await 解决回调函数嵌套问题

    原文链接:http://aisk.me/using-async-await-to-avoid-callback-hell/ JavaScript 中最蛋疼的事情莫过于回调函数嵌套问题.以往在浏览器中, ...

  2. python之函数嵌套

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

  3. 不使用回调函数的ajax请求实现(async和await简化回调函数嵌套)

    在常规的服务器端程序设计中, 比如说爬虫程序, 发送http请求的过程会使整个执行过程阻塞,直到http请求响应完成代码才会继续执行, 以php为例子 $url = "http://www. ...

  4. Oracle之分组函数嵌套以及表连接

    --1 数据环境准备 scott 用户下面的emp,dept表 --2 要求 :求平均工资最高的部门编号,部门名称,部门平均工资 select d.deptno,d.dname,e.salfrom(s ...

  5. nodejs批量导入数据eventproxy(回调函数嵌套解决方案)使用实例

    回调函数嵌套解决方案——eventProxy API地址:https://github.com/JacksonTian/eventproxy 1.安装eventproxy 执行npm install ...

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

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

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

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

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

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

  9. python基础知识13---函数对象、函数嵌套、名称空间与作用域、装饰器

    阅读目录 一 函数对象 二 函数嵌套 三 名称空间与作用域 四 闭包函数 五 装饰器 六 练习题 一 函数对象 1 函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 ...

随机推荐

  1. Mac OS用vmvare安装多节点kubernetes

    参考网址 https://kubernetes.io/docs/setup/ 1.安装vmvare 2.下载ubuntu镜像(可以不要界面,可以下载server版大约900M,否则下载desktop版 ...

  2. crontab -e 定时任务中的 脚本文件 路径

    crontab -l 57 */1 * * * python /home/data/crontab_chk_url/personas/trunk/plugins/spider/chk_url_stat ...

  3. amazon lightsail

    https://51.ruyo.net/6038.html https://aws.amazon.com/cn/lightsail/

  4. 关于js的值传递和引用传递

    最近在弄一个东西,明明就很简单的.不知道为啥有个坑,双向绑定,不过当有个数组为空时,它不会发送空的数组,而是不发送.这就坑爹了.导致老是删不掉. 处理了下,改成验证为空时,发送'[]‘字符串.成功.但 ...

  5. android之View坐标系(view获取自身坐标的方法和点击事件中坐标的获取)

    在做一个view背景特效的时候被坐标的各个获取方法搞晕了,几篇抄来抄去的博客也没弄很清楚. 现在把整个总结一下. 其实只要把下面这张图看明白就没问题了. 涉及到的方法一共有下面几个: view获取自身 ...

  6. .NET 4.0 System.Threading.Tasks学习笔记

    由于工作上的需要,学习使用了System.Threading.Tasks的使用,特此笔记下来. System.Threading.Tasks的作用: Tasks命名空间下的类试图使用任务的概念来解决线 ...

  7. 使用cocoaPods加载框架的具体步骤:

    注意事项: 1.使用之前备份一下代码.因为pod更新很快,如果某个文件名有中文,pod install 一下.整个项目可能就要废掉了. 2.如果不把pod文件推动到远程服务器. 每一次用的时候在本地p ...

  8. MDZX——张能传

    「你们到底要干什么?!」——8012年7月13日 张能于MDZX ———————————— 序章 ———————————— 话说天下大势,分久必合,合久必分. 他肩扛99米大砍刀,站在MDZX大门对面 ...

  9. 【Sdoi2008】沙拉公主的困惑

    [题目链接] 点击打开链接 [算法] gcd(a,b)=gcd(a mod b, b),又m!|n!          则有ans=(n!/m!)·ϕ(m!)          由ϕ(n)=n(1-1 ...

  10. c/c++内存机制(一)(原)

    一:C语言中的内存机制 在C语言中,内存主要分为如下5个存储区: (1)栈(Stack):位于函数内的局部变量(包括函数实参),由编译器负责分配释放,函数结束,栈变量失效. (2)堆(Heap):由程 ...