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 ...
随机推荐
- JVM安全退出(如何优雅的关闭java服务)
https://tech.imdada.cn/2017/06/18/jvm-safe-exit/?utm_source=tuicool&utm_medium=referral 背景 用户:货都 ...
- ie7 动态改变select option时,宽度自动变短解决方法
<html> <head> <title>JQuery</title> <meta http-equiv="pragma" c ...
- Go-gin CORS 跨域中间件
原文:https://stackoverflow.com/questions/29418478/go-gin-framework-cors func CORSMiddleware() gin.Hand ...
- GitLab使用总结[转]
http://blog.csdn.net/huaishu/article/details/50475175 GitLab使用总结
- IOS-RunTime应用
什么是Runtime 总结起来,iOS中的RunTime的作用有以下几点: 1.发送消息(obj_msgSend) 2.方法交换(method_exchangeImplementations) 3.消 ...
- 控制语句1:真假与if 语句
一.真假与运算符 1.1 真假的划分.查看 任何数据都可以分为两类:True 与 False False : 0,None,空的数据结构例如:[] ,{},str1 = '' True :除了上面情 ...
- 【辅助工具】Python实现微信跳一跳
最近迷上了微信跳一跳小游戏,正好也看到知乎上有大神分享了技术贴,我也参考了好多资料,原理就是通过abd命令截取图片,python计算两个点距离,然后转化按压时间,让电脑来完成游戏.我花了很长时间才把程 ...
- GDB和Core Dump使用笔记
一.GNU C编译器(即GCC) GCC使用 1 .gcc -g hello.c -o hello 编译生成可执行文件 2.gdb hello 启动GDB ...
- hibernate 延迟加载和抓取策略
一.延迟加载 1.简单查询get,load 针对对象本身延迟或即时 当使用load方法来得到一个对象时,此时hibernate会使用延迟加载的机制来加载这个对象,即:当我们使用session.load ...
- LeetCode OJ:Linked List Cycle(链表循环)
Given a linked list, determine if it has a cycle in it. Follow up:Can you solve it without using ext ...