一,命名空间

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

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

取值

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

 #!/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. git生成和检查秘钥操作

    查看本地是否有git config的配置: git config --list 设置用户名和邮箱: $git config --global user.email "tanteng@gmai ...

  2. 22个HTML5的初级技巧

    Web技术的发展速度太快了,如果你不与时俱进,就会被淘汰.因此,为了应对即将到来的HTML5,本文总结了22个HTML5的初级技巧,希望能对你进一步学习好HTML5会有所帮助. 1. 新的Doctyp ...

  3. go语言的排序、结构体排序

    原文:https://studygolang.com/articles/1598 晚上准备动手写点 go 的程序的时候,想起 go 如何排序的问题.排序 sort 是个基本的操作,当然搜索 searc ...

  4. spring3: Aspectj后置返回通知

    Aspectj后置返回通知 接口: package chapter1.server; public interface IHelloService2 { public int sayAfterRetu ...

  5. IOS-将任意对象存进数据库

    model // // HMShop.h // 将任意对象存进数据库 // // Created by apple on 14/11/20. // Copyright (c) 2014年 heima. ...

  6. java继承的一些问题

    如果在父类中,你声明了一个静态变量. 然后你有两个子类继承了这个父类.我们想看看这两个子类调用继承的父类的类变量a是不是同一个值. 这时候注意,我们在子类的时候不能重写static int a = a ...

  7. opencv:直方图操作

    示例程序: #include <opencv.hpp> using namespace cv; using namespace std; int main() { Mat src, dst ...

  8. 【lightoj-1025】The Specials Menu(区间DP)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1025 [题目大意] 求一个字符串删去任意字符可以构成多少个不同的回文串 [分析 ...

  9. String、StringBuffer、StringBuilder分析(jdk8)

    以下代码只挑选了关键方法进行分析 public final class String //String类不可继承,实现了序列化 implements java.io.Serializable, Com ...

  10. jsp的运行内幕--Tomcat容器对自定义标签的解析过程

    http://blog.sina.com.cn/s/blog_4adc4b090101daqb.html