设为首页 收藏本站
查看: 1142|回复: 0

[经验分享] Python作用域和参数

[复制链接]

尚未签到

发表于 2017-4-25 12:13:28 | 显示全部楼层 |阅读模式
转(http://blog.lzp729.com/code-life/python/python-groundwork/python%E7%9F%A5%E8%AF%86%E6%95%B4%E7%90%86-14-%E4%BD%9C%E7%94%A8%E5%9F%9F%E5%92%8C%E5%8F%82%E6%95%B0.html)
Python中的变量名在第一次被赋值时已经创建, 并且必须经过赋值后才能够使用.
每一个模块都是一个全局作用域, 没有类型C++那样的能够存活在整个项目中的作用域.Python作用域的范围仅限于单个文件(模块).赋值的变量名除非声明为全局变量(通过global), 否则均为本地变量.所有的变量名都可以归纳为本地, 全局或者内置.注意实地改变变量并不会把变量划分为本地变量, 实际上只有对变量名赋值才可以.
变量名解析: LEGB原则
变量名分为三个作用域进行查找, 本地 => 函数内 => 全局 => 内置
全局声明将赋值变量名映射到模块文件内部的作用域(全局域).
对于内置名字, 如zip函数, 可以直接使用, 如zip(), 或者import __building__; __buildin__.zip()
自定义变量会掩盖自带的名字, 甚至可以替换自带的名字, 如__buildin__.zip = …
通过global将变量声明为全局域变量
X = 88
def func():
global X
X = 99 //(改变全局域的X)
除了通过global方式访问全局域变量外, 还可以在函数中import自身module, 然后通过模块名.变量的形式访问.
// thismod.py
var = 99
def local():
var = 0
def glob1():
global var
var += 1
def glob2():
var = 0
import thismod
thismod.var += 1
def glob3():
var = 0
import sys
glob = sys.module['thismod']
glob.var += 1
工厂函数
def maker(N):
def action(X):
return X**N
return action
func = maker(2)
f(3) == 9
使用默认参数来保留嵌套作用域的状态
def maker():
x = 88
def action(x = x):
print x
return action
func = maker()
f(3) // print 88
在某一个函数内部调用一个之后才定义的函数是可行的, 只要第二个函数定义是在第一个函数调用之前就行.
lamda表达式: action = (lambda n,x: return x ** n); action(2,3) == 9
def makeActions():
acts = []
for i in range(5):
acts.append(lambda x: i ** x)
return acts
acts = makeActions()
acts[2](3) == 64 // 因为嵌套作用域中的变量在嵌套的函数被调用时才进行查找, 所以这里的acts函数组里的每个i都是4
def makeActions():
acts = []
for i in range(5):
acts.append(lambda x, i = i : i ** x)
return acts
acts = makeActions()
acts[2](3) == 8// 在lambda中, 用默认参数的方式记住每一次i迭代的值.
作为参数被传递的对象从来不自动拷贝. 不可变参数通过值传递, 可变对象是通过引用进行传递. 自动对传入的参数进行赋值的效果与运行一系列简单的赋值语句是相同的.
返回多个变量: def return(x, y); return2(1,2) == (1,2) 看似返回多个, 实际上返回的是一个元组
函数参数匹配表
语法位置解释
func(value)调用者常规参数:通过位置进行匹配
func(name = value)调用者关键字参数: 通过变量名匹配
func(*name)调用者以name传递所有的对象, 并作为独立的基于位置的参数
func(**name)调用者以name传递所有关键字/值, 并作为独立的关键字参数
def func(name)函数常规参数:通过位置进行匹配
def func(name = value)函数默认参数值, 如果没有在调用中传递
def func(*name)函数匹配并收集(在元组中)所有包含位置的参数
def func(**name)函数匹配并收集(在字典中)所有包含关键字的参数
// L1, L5
def func(a,b,c):print a,b,c
func(1,2,3)
// L2, L6
def func(a,b,c):print a,b,c
func(1,b = 2, c = 3)
// L3, L7
def func(a,b,c):print a,b,c
args = (1,2,3)
func(*args)
// L4, L8
def func(a,b,c):print a,b,c
args = {'a':1, 'b' : 2, 'c' : 3}
func(**args)
Python函数可作为传输传递
def minmax(test, *args):
res = args[0]
for arg in args[1:]:
if test(arg, res):
res = arg
return res
def lessthan(x,y): return x < y
def grtrthan(x,y): return x > y
print minmax(lessthan, 4,1,2,3)
print minmax(grtrthan, 4,1,2,3)
参数匹配法则
在函数调用中, 所有的非关键字参数必须首先出现, 其后跟随所有的关键字参数, 后面跟着*name的形式, 并且如果需要的话, 最后是**name的形式
在函数头部, 参数必须以相同的顺序出现: 一般参数, 默认参数, 后面是*name和**name.

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-369118-1-1.html 上篇帖子: 自学python-helloworld等基础 下篇帖子: Python:Dir及str函数
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表