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 ...
随机推荐
- SpannableString实现TextView的链接效果
SpannableString实现TextView的链接效果 一.简介 TextView使用SpannableString设置复合文本TextView通常用来显示普通文本,但是有时候需要对其中某些文本 ...
- TextView两种显示link的方法
TextView两种显示link的方法 一.简介 也是TextView显示文本控件两种方法 也是显示丰富的文本 二.方法 TextView两种显示link的方法 1)通过TextView里面的类ht ...
- Android GridView 行间距过大(一页一行)
1. gridView.xml中 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&quo ...
- javaweb图片上传 tomcat重新部署 图片消失
标签: 图片上传tomcat重新部署图片消失原因分析以及解决办法 最近在做一个Javaweb的项目,涉及到图片上传,并且需要将图片通过URL回显给JSP页面,在调试的时候发现,上传到tomcat的 ...
- 【Python】小技巧
1. 退出python shell 在windows下,Ctrl + Z退出 在unix下,Ctrl + D退出
- 【sparkStreaming】SparkStream的创建
DStream编程数据模型 DStream(Discretized Stream)作为Spark Streaming的基础抽象,它代表持续性的数据流. 这些数据流既可以通过外部输入源赖获取,也可以通过 ...
- opencv:直方图操作
示例程序: #include <opencv.hpp> using namespace cv; using namespace std; int main() { Mat src, dst ...
- 【费用流】bzoj1221 [HNOI2001] 软件开发
几乎为“线性规划与网络流24题”中的餐巾问题. 这里把S看成毛巾的来源,T看成软件公司,我们的目的就是让每天的毛巾满足要求(边满流). 引用题解: [问题分析] 网络优化问题,用最小费用最大流解决. ...
- OC-文件操作
一.归档NSKeyedArchiver========================== 1.第一种方式:存储一种数据.===================== //归档 //第一种写法 //对象 ...
- 限流之令牌桶算法——RateLimiter官方文档
原文链接 作者:Dimitris Andreou 译者:魏嘉鹏 校对:方腾飞 RateLimiter 从概念上来讲,速率限制器会在可配置的速率下分配许可证.如果必要的话,每个acquire() 会阻 ...