博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python 的函数、值传递、和作用域(例子)
阅读量:7078 次
发布时间:2019-06-28

本文共 2628 字,大约阅读时间需要 8 分钟。

1.python的函数格式

def FuncName([arg1,arg2,..]):                func_suite        def: def是函数的关键字        FuncName: 实际也是变量,它指向函数对象,在函数定义时被赋值,根据习惯,这里我们成为函数名        ():()是函数运算符,引用函数时,用函数名+()引用,如: FuncName()        [arg1,arg2,..]: 这个是函数体的参数,当为空时,我们称这个函数为无参函数,相对应的就是有参函数,python的参数传递很强大,可以是位置参数一一对应,也可以默认参数赋值,还可以传递字典等        ":" : python的语句都必须以 : 结尾        func_suite: 这个是函数体的内容,可以用"pass"进行占位,还可以嵌套函数等需要注意的是,每个函数结束后都必须返回值,如果没有用return关键字明确指明,那么默认返回None

例子:

In [2]: def hello():

...: print "hello"
...:

In [3]: a=hello()

hello

In [4]: print a

None

2.参数传递

<1>普通的从左往右匹配的参数传递

def f1(x,y):     print "x:%d y:%d" %(x,y)In [38]: m=1In [39]: n=2In [40]: f1(m,n)x:1 y:2In [41]: f1(n,m)x:2 y:1这种方式传参个数必须匹配,否则报错

<2>设置默认参数

In [42]: def f2(x=1,y):    ...:     print "x:%d y:%d" %(x,y)  File "
", line 1 def f2(x=1,y):SyntaxError: non-default argument follows default argumentIn [43]: def f2(y,x=1): ...: print "x:%d y:%d" %(x,y)In [45]: n=99In [46]: m=6In [47]: f2(n)x:1 y:99In [48]: f2(n,m)x:6 y:99(1)默认参数要写在位置参数后面,否则报错(2)传递参数时,可以不传递默认有值的参数,但是当传递了对应参数,默认值会被覆盖掉

<3>1个'*',传递任意个数参数(非键值对),函数收集为列表

In [53]: def f3(x,*y):...:     print x,y...:       In [54]: n=1;m=2In [55]: f3(n,m,4,5,6)1 (2, 4, 5, 6)带*的参数也要放在位置参数后面,位置参数匹配完后,剩下的才会收集为列表并赋值给y这个变量

<4>2个'*',传递任意个键值对参数,收集为字典

In [85]: def f4(x,**y):    ...:     print x,y    ...:     In [86]: f4(1,n=2,a=4,b=2)1 {'a': 4, 'b': 2, 'n': 2}

3.python的作用域(LEGB),参考:

简而言之,LEGB 代表名字查找顺序: locals -> enclosing function -> globals -> builtins

locals 是函数内的名字空间,包括局部变量和形参    enclosing 外部嵌套函数的名字空间(闭包中常见)    globals 全局变量,函数定义所在模块的名字空间    builtins 内置模块的名字空间所以,在 Python 中检索一个变量的时候,优先回到 locals 里面来检索,检索不到的情况下会检索 enclosing ,enclosing 没有则到 globals 全局变量里面检索,最后是到 builtins 里面来检索。

例子:

[root@cqhdtest python_learn]# ./getvalue.py Ex Gy EzLx Gy Ez[root@cqhdtest python_learn]# cat getvalue.py #!/usr/local/anaconda2/bin/pythonx='Gx'y='Gy'z='Gz'def f1(x,y,z):    x='Ex'    z='Ez'    print x,y,z    def f2(x,y,z):    x='Lx'    print x,y,z    f2(x,y,z)f1(x,y,z)当调用f1函数时,此时f1中的print语句会去寻找x,y,z变量的值,它从当前作用域开始找,x,z都在本域有值,所以x='Ex',z='Ez',y没有值,所以它向外去globals作用域找,发现y='Gy',所以第一行输出为"Ex Gy Ez",程序继续执行,调用f2函数,f2的print也查找x,y,z的变量的值,首先在local域找,发现x="Lx",y在local找不到,于是去enclosing域找,发现也没有,于是找Global域,所以y='Gy',z同理,在enclosing域找到了,便停止搜索,于是z='Ez',所以第二行输出为"Lx Gy Ez"如果我们想在函数内对全局变量进行修改,则可以使用global关键字    global:告诉函数,使用全局变量作为当前变量

例子:

[root@cqhdtest python_learn]# ./global.py GxEx[root@cqhdtest python_learn]# cat global.py #!/usr/local/anaconda2/bin/pythonx='Gx'def f1():    x='Ex'def f2():    global x    x='Ex'f1()print xf2()print x函数f1中的x是本地变量,当f1执行完后x的值也被销毁函数f2中的x使用全局变量,所以当x被改变后,print的值也变了

转载于:https://blog.51cto.com/linzb/2089011

你可能感兴趣的文章
xtrabackup: error: last checkpoint LSN (3409281307) is larger than last copied LSN (3409274368). #2
查看>>
关于NoClassDefFoundError和ClassNotFoundException异常
查看>>
一、Autofac入门
查看>>
HTML 总结
查看>>
C# 随机列表
查看>>
C# 文件的读取与另存为(WPF)
查看>>
poj1129
查看>>
socket 简历网络连接
查看>>
App.Config操作
查看>>
并查集(涂色问题) HDOJ 4056 Draw a Mess
查看>>
20151217:Web之Repeater使用:主页面
查看>>
从一次浅尝则止的代码优化说起(一) 简单的异常分离
查看>>
BZOJ1834:[ZJOI2010]网络扩容——题解
查看>>
76.培训记录信息 Extjs 页面
查看>>
7.Maven之(七)pom.xml配置文件详解
查看>>
如何成为一名黑客
查看>>
[置顶] openHAB 部分代码结构 UML 图
查看>>
网址探测器 - 零基础入门学习Delphi41
查看>>
批量导入数据一定得有回滚方案
查看>>
[Note]后缀数组
查看>>