一,命名空间

#局部命名空间
#全局命名空间
#内置命名空间

#三者的顺序
#加载顺序       内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程序运行中:调用时才加载)

取值

*在局部调用:局部命名空间》全局命名空间》内置命名空间

 #!/usr/bin/env python
#_*_coding:utf-8_*_ max = 1
def f():
print(max) #局部调用max会找全局max=1,如果没有就会打印内置max
f()

*在全局调用:全局命名空间》内置命名空间

#!/usr/bin/env python
#_*_coding:utf-8_*_ x = 1
def f(x):
print(x)
f(10)
print(x)
 #!/usr/bin/env python
#_*_coding:utf-8_*_ #全局命名空间
a = 5
b = 8
#局部命名空间(函数)
def my_max():
c = a if a > b else b
return c
m = my_max()
print(m)

二,作用域

#命名空间+作用域是分不开的
#两种
#全局作用域:全局命名空间、内置命名空间
#局部作用域:局部命名空间

#站在全局看:
#使用名字:
#如果全局有:用全局的
#如果全局没有:用内置的

#为什么要有作用域的概念:
#为了函数内的变量不会影响到全局

 #!/usr/bin/env python
#_*_coding:utf-8_*_ def max(a,b):
a = 10 #局部
b = 20
a = 2 #全局
b = 3 #
max(30,50)
print(a,b)

总结:

#小范围的可以用大范围的
#但是大范围的不能用小范围的
#在小范围内,如果要用一个变量,是当前这个小范围有的,就用自己的
#如果在小范围内没有,就用上一级的,上一级没有就用上上一级的,以此类推。
#如果都没有,报错

三,作用域链,小范围的可以用大范围的

 #!/usr/bin/env python
#_*_coding:utf-8_*_ x = 1
def heihei():
def inner1():
def inner2():
print(x)
inner2()
inner1()
heihei()

四,函数的嵌套

#为了保护内部函数,确定内部函数只能在外部函数中被调用

 #!/usr/bin/env python
#_*_coding:utf-8_*_ #函数嵌套
def animal():
def tiger():
print('bark')
print('eat')
tiger()
animal() #函数嵌套使用
def f1():
print(a) #无法获取f2的a的值,注意执行顺序
print('f1')
def f2():
a = 10
f1()
f2()

五,函数名的本质就是内存地址

 #!/usr/bin/env python
#_*_coding:utf-8_*_ def func():
print('func')
print(func) #函数func内存地址
f = func #就是函数的内存地址
print(f) #函数func内存地址
f() #执行代码
#############
l = [f] #还是函数内存地址
print(l)
l[0] == f #用索引取值
l[0]() #可以用作函数的参数
def func():
print('func')
def func2(f):
print(f) #func的内存地址
f() #执行func函数
print('func2')
func2(func) #可以作为函数的返回值
def func():
print('func')
def func2(f): #1 接收func函数的内存地址
print('func2')
return f #2 返回给fu函数func函数的内存地址
fu = func2(func)
fu() #3 执行函数func #如果我想在全局使用内部的函数

六,闭包

#1.闭 :内部的函数
#2.包 :包含了对外部函数作用域中变量的引用

 #!/usr/bin/env python
#_*_coding:utf-8_*_ #闭包函数:内部函数,包含了对外部作用域中变量的引用
def hei():
x = 20
def inner():
'''
闭包函数
'''
print(x) #闭包的常用形式
def hei():
x = 20
def inner():
print(x) #局部的
return inner
i = hei()
i() #全局 #闭包的例子,爬网页,函数执行完就会消失,但是在调用的时候又会打开,闭包解决了这个问题
from urllib.request import urlopen
# def index():
# url = "http://www.cnblogs.com/Eva-J/articles/7125925.html"
# return urlopen(url).read()
# index() def index():
url = "http://www.cnblogs.com/Eva-J/articles/7125925.html"
def inner():
return urlopen(url).read()
print(inner.__closure__)
return inner
# u = "http://www.cnblogs.com/Eva-J/articles/7125925.html"
get = index()
print(get())

7,作用域方法

#locals,globals方法,只有globals方法,作用是将局部作用域内的变量可以变成全局作用域的变量

 #!/usr/bin/env python
#_*_coding:utf-8_*_ a = 20
b = 50
def haha():
x = 1
y = 2
print(globals()) #全局作用域中的名字a b 方法haha
print(locals()) #局部作用域中的名字x y
haha()
print(globals()) #全局作用域中的名字
print(locals()) #全局的局部还是全局

nonlocal
# 1.外部必须有这个变量
# 2.在内部函数声明nonlocal变量之前不能再出现同名变量
# 3.内部修改这个变量如果想在外部有这个变量的第一层函数中生效

 #!/usr/bin/env python
#_*_coding:utf-8_*_ def f():
a = 3
def f1():
a = 1
def f2():
nonlocal a #可以将上一层的变量更改赋值
a = 2
f2()
print('a in f1 : ', a) #此时a是内部函数的a
f1()
print('a in f : ',a) #此时a是局部函数的a
f()
#a in f1 : 2
#a in f : 3

python开发函数进阶:命名空间,作用域,函数的本质,闭包,作用域方法(globales)的更多相关文章

  1. python基础学习之函数进阶【匿名函数、作用域关系、闭包、递归】

    匿名函数 lambda的用法: lambda x:x+1 解释,同等于以下函数 def test(x): return x+1 因为没有函数名,所以称为匿名函数 只适用于简易的逻辑,复杂逻辑无法实现 ...

  2. python开发第四篇:函数(1)

    函数 阅读目录 一 函数知识体系 二 函数基础 三 函数对象.函数嵌套.名称空间与作用域.装饰器 四 迭代器.生成器.面向过程编程 五 三元表达式.列表推导式.生成器表达式.递归.匿名函数.内置函数 ...

  3. Python开发的入门教程(六)-函数

    介绍 本文主要介绍Python中函数的基本知识和使用 Python之什么是函数 我们知道圆的面积计算公式为: S = πr² 当我们知道半径r的值时,就可以根据公式计算出面积.假设我们需要计算3个不同 ...

  4. Python 函数进阶-高阶函数

    高阶函数 什么是高阶函数 高阶函数就是能够把函数当成参数传递的函数就是高阶函数,换句话说如果一个函数的参数是函数,那么这个函数就是一个高阶函数. 高阶函数可以是你使用def关键字自定义的函数,也有Py ...

  5. python开发面向对象进阶:反射&内置函数

    isinstance和issubclass isinstance(obj,cls)检查是否obj是否是类 cls 的对象或者子类的对象 class Foo(object): pass class ba ...

  6. python开发函数进阶:匿名函数

    一,匿名函数 #简单的需要用函数去解决的问题 匿名函数的函数体 只有一行#也叫lambda表达式# cal2(函数名) = lambda n(参数) : n*n(参数怎么处理,并且返回值)#参数可以有 ...

  7. python开发_python中的range()函数

    python中的range()函数的功能hen强大,所以我觉得很有必要和大家分享一下 就好像其API中所描述的: If you do need to iterate over a sequence o ...

  8. Python开发基础-Day11内置函数补充、匿名函数、递归函数

    内置函数补充 python divmod()函数:把除数和余数运算结果结合起来,返回一个包含商和余数的元组(a // b, a % b) 语法: divmod(a, b) #a.b为数字,a为除数,b ...

  9. python开发[第二篇]------str的7个必须掌握的方法以及五个常用方法

    在Python中 基本数据类型有 str int boolean list dict tuple等 其中str的相关方法有30多个 但是常用的就以下7个 join  # split # find # ...

  10. 【python 3】 函数 进阶

    函数进阶 1.函数命名空间和作用域 命名空间一共分为三种: 全局命名空间 局部命名空间 内置命名空间 *内置命名空间中存放了python解释器为我们提供的名字:input , print , str ...

随机推荐

  1. css3+jQuery实现按钮水波纹效果

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name ...

  2. P3374 【模板】树状数组 1

    树状数组模板题,用cdq分治做 cdq分治: 分:把l到r分成两个区间操作 治:对每个分出来的区间进行操作 但是cdq分治和一般分治不同的是,一般的分治左右两个区间互不干扰,但是cdq分治处理的是区间 ...

  3. IDL语言开发规范

    一.支持的类型 1.IDL支持常见的基本类型,常量,枚举,容器,结构体,服务.不支持多态和重载,参数.返回值不能为空,各个基本类型的标识如下: bool:对应java的boolean,布尔类型(tru ...

  4. 003——VUE操作元素属性

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. shell编程学习1

    1.shell是操作系统的终端命令行 (1)shell可以理解为软件系统提供给用户操作的命令行界面,可以说它是人机交互的一种方式.    (2)我们可以使用shell和操作系统.uboot等软件系统进 ...

  6. 条款16:成对使用new以及delete的时候应该采取相同的形式

    首先思考下面的代码: ]; ... delete stringArray; 这是最常见的错误之一了,new与delete不配对,但是仔细想想new与delete为什么一定要配对呢? 可以想到一种可能就 ...

  7. for-in 的坑

    for-in 循环的下标为字符串,不是数字 var ar=[13,2,13,14]; function isSort(ar){ for(var i in ar){ console.log(i+':'+ ...

  8. RAD Studio Mobile Roadmap updated,XE5 will released on next month, Andriod will be supported.

    RAD Studio Mobile Roadmap updated   Embarcadero updated his RAD Studio Mobile Roadmap. This concern ...

  9. CentOS下安装w3m,及w3m的使用

    centos下安装软件的命令不是apt-get,而是yum,如果安装w3m,利用sudo yum install w3m w3m-img -y即可 △△△△△△△△如果你用的是centos或readh ...

  10. Python之MySQLdb

    MySQLdb是用于Python链接Mysql数据库的接口,它实现了Python数据库API规范V2.0,基于MySql C API上建立的. 1. MySQLdb安装 (1)安装Mysql,参考上篇 ...