python开发函数进阶:命名空间,作用域,函数的本质,闭包,作用域方法(globales)
一,命名空间
#局部命名空间
#全局命名空间
#内置命名空间
#三者的顺序
#加载顺序 内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程序运行中:调用时才加载)
取值
*在局部调用:局部命名空间》全局命名空间》内置命名空间
#!/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)的更多相关文章
- python基础学习之函数进阶【匿名函数、作用域关系、闭包、递归】
匿名函数 lambda的用法: lambda x:x+1 解释,同等于以下函数 def test(x): return x+1 因为没有函数名,所以称为匿名函数 只适用于简易的逻辑,复杂逻辑无法实现 ...
- python开发第四篇:函数(1)
函数 阅读目录 一 函数知识体系 二 函数基础 三 函数对象.函数嵌套.名称空间与作用域.装饰器 四 迭代器.生成器.面向过程编程 五 三元表达式.列表推导式.生成器表达式.递归.匿名函数.内置函数 ...
- Python开发的入门教程(六)-函数
介绍 本文主要介绍Python中函数的基本知识和使用 Python之什么是函数 我们知道圆的面积计算公式为: S = πr² 当我们知道半径r的值时,就可以根据公式计算出面积.假设我们需要计算3个不同 ...
- Python 函数进阶-高阶函数
高阶函数 什么是高阶函数 高阶函数就是能够把函数当成参数传递的函数就是高阶函数,换句话说如果一个函数的参数是函数,那么这个函数就是一个高阶函数. 高阶函数可以是你使用def关键字自定义的函数,也有Py ...
- python开发面向对象进阶:反射&内置函数
isinstance和issubclass isinstance(obj,cls)检查是否obj是否是类 cls 的对象或者子类的对象 class Foo(object): pass class ba ...
- python开发函数进阶:匿名函数
一,匿名函数 #简单的需要用函数去解决的问题 匿名函数的函数体 只有一行#也叫lambda表达式# cal2(函数名) = lambda n(参数) : n*n(参数怎么处理,并且返回值)#参数可以有 ...
- python开发_python中的range()函数
python中的range()函数的功能hen强大,所以我觉得很有必要和大家分享一下 就好像其API中所描述的: If you do need to iterate over a sequence o ...
- Python开发基础-Day11内置函数补充、匿名函数、递归函数
内置函数补充 python divmod()函数:把除数和余数运算结果结合起来,返回一个包含商和余数的元组(a // b, a % b) 语法: divmod(a, b) #a.b为数字,a为除数,b ...
- python开发[第二篇]------str的7个必须掌握的方法以及五个常用方法
在Python中 基本数据类型有 str int boolean list dict tuple等 其中str的相关方法有30多个 但是常用的就以下7个 join # split # find # ...
- 【python 3】 函数 进阶
函数进阶 1.函数命名空间和作用域 命名空间一共分为三种: 全局命名空间 局部命名空间 内置命名空间 *内置命名空间中存放了python解释器为我们提供的名字:input , print , str ...
随机推荐
- C++(十六) — 类中引用成员函数、命名空间的使用
1.为什么类中引用成员函数? 类将属性和方法做了封装.类是一种数据类型,也就是:固定大小内存块的别名. 类的定义是一个抽象的概念,定义时不分配内存,当用类定义对象时,才分配一个固定大小的内存块. 此时 ...
- Xcode 8 GM 编译缺失 /Users/usr/lib/libresolv.9.dylib
原因是操作系统的文件与手机需要的不同. 解决办法是将iOS DeviceSupport里当前手机版本的Symbols的libresolv.9.dylib文件,代替编译失败项目的Build Phases ...
- Codeforces Round #394 (Div. 2) E. Dasha and Puzzle
E. Dasha and Puzzle time limit per test:2 seconds memory limit per test:256 megabytes input:standard ...
- Django框架(二)
一:Django项目创建步骤: 方式1:命令创建: 进入指定目录 C:\Users\bing>F: F:\>cd mysite F:\mysite>django-admin star ...
- LeetCode OJ:Compare Version Numbers(比较版本字符串)
Compare two version numbers version1 and version2.If version1 > version2 return 1, if version1 &l ...
- SpringCloud教程 | 第十三篇: 断路器聚合监控(Hystrix Turbine)
版权声明:本文为博主原创文章,欢迎转载,转载请注明作者.原文超链接 ,博主地址:http://blog.csdn.net/forezp. http://blog.csdn.net/forezp/art ...
- Python基础学习(第7天)
第6课 1.循环对象:包括一个next方法,这个方法的目的是进行到下一个结果,结束后抛出StopInteration异常: 当循环结构如for循环调用一个循环对象时,每次循环的时候都会调用next方法 ...
- Arcgis for Js之Graphiclayer扩展详解
在前两节,讲到了两种不同方式的聚类,一种是基于距离的,一种是基于区域范围的,两种不同的聚类都是通过扩展esri/layers/GraphicsLayer方法来实现的.在本节,就详细的讲讲esri/la ...
- SVN 用户名切换
方法1:主要针对Window下安装了客户端设置 右键桌面-->settings-->Saved Data -->Authentication data -->clear 方法2 ...
- 使用 DocFX 生成 .Net/Unity项目文档
孙广东 2017.5.27 http://blog.csdn.NET/u010019717 微软开源全新的文档生成工具DocFX 类似JSDoc或Sphinx 如何使用看 : http: ...