python 的函数、值传递、和作用域(例子)

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=1

In [39]: n=2

In [40]: f1(m,n)
x:1 y:2

In [41]: f1(n,m)
x:2 y:1

这种方式传参个数必须匹配,否则报错

<2>设置默认参数

In [42]: def f2(x=1,y):
    ...:     print "x:%d y:%d" %(x,y)
  File "<ipython-input-42-52965f3ab864>", line 1
    def f2(x=1,y):
SyntaxError: non-default argument follows default argument

In [43]: def f2(y,x=1):
    ...:     print "x:%d y:%d" %(x,y)
In [45]: n=99

In [46]: m=6

In [47]: f2(n)
x:1 y:99

In [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=2

In [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),参考:https://segmentfault.com/a/1190000000640834
简而言之,LEGB 代表名字查找顺序: locals -> enclosing function -> globals -> builtins

    locals 是函数内的名字空间,包括局部变量和形参
    enclosing 外部嵌套函数的名字空间(闭包中常见)
    globals 全局变量,函数定义所在模块的名字空间
    builtins 内置模块的名字空间

所以,在 Python 中检索一个变量的时候,优先回到 locals 里面来检索,检索不到的情况下会检索 enclosing ,enclosing 没有则到 globals 全局变量里面检索,最后是到 builtins 里面来检索。

例子:

[[email protected] python_learn]# ./getvalue.py
Ex Gy Ez
Lx Gy Ez
[[email protected] python_learn]# cat getvalue.py
#!/usr/local/anaconda2/bin/python
x=‘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:告诉函数,使用全局变量作为当前变量

例子:

[[email protected] python_learn]# ./global.py
Gx
Ex
[[email protected] python_learn]# cat global.py
#!/usr/local/anaconda2/bin/python
x=‘Gx‘
def f1():
    x=‘Ex‘
def f2():
    global x
    x=‘Ex‘
f1()
print x
f2()
print x

函数f1中的x是本地变量,当f1执行完后x的值也被销毁
函数f2中的x使用全局变量,所以当x被改变后,print的值也变了

原文地址:http://blog.51cto.com/linzb/2089011

时间: 2024-08-14 11:31:55

python 的函数、值传递、和作用域(例子)的相关文章

Python:函数名称空间与作用域:

Python:函数名称空间与作用域 函数对象:(第一类对象) 定义:函数是第一类对象:函数名可以当做数据来使用 1.可以直接被引用,加()就能运行 def foo(): print("from foo") f=foo f() 2.可以当作参数传入另一个函数 def warpper(x): x() warpper(foo) 3.可以当作另外函数的返回值 def warpper2(): return foo f=warpper2() print(f is foo) 4.可以当作容器类型的一

Python 到底是值传递还是引用传递

我们平时写的 Python 程序中充斥着大量的函数,包括系统自带函数和自定义函数,当我们调用函数时直接将参数传递进去然后坐等接收返回值即可,简直不要太好用.那么你知道函数的参数是怎么传递的么,是值传递还是引用传递呢,什么又是值传递和引用传递呢? 这个问题对于很多初学者还是比较有难度的,看到这里你可以稍加停顿,自己思考一下,看看自己是否真正理解了.很多人只是知道概念但是让他说他又说不清楚,思考过后如果你还觉得模糊的话,往下仔细看,我今天就带着你深入剖析下函数的参数传递机制. 为了搞清楚函数的参数传

python中的值传递和引用传递

Python中的变量是没有类型的,我们可以把它看做一个(*void)类型的指针,变量是可以指向任何对象的,而对象才是有类型的. Python中的对象有可变对象(number,string,tuple等)和不可变对象之分(list,dict等). 值传递(passl-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本.值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函

javascript 值传递与作用域

ECMAScript的变量是松散类型的,在将一个值赋给变量时,解析器必须确定这个值是基本类型还是引用类型.基本类型是按值访问的,因为可以操作保存在变量中的实际的值. 引用类型的值是保存在堆内存中的对象,JavaScript 不容许直接访问内存中的位置,也就是说不能直接操作对象的内存空间.在操作对象时,实际上是在操作对象的引用而不是 操作实际的对象.因此 JavaScript 引用类型是按引用访问的. 对于引用类型我们可以为他添加属性和方法,但是我们不能给基本类型的值添加属性,虽然这样做不会导致任

day10 python学习 函数的嵌套命名空间作用域等

1.三元运算 #1.三元运算 利用已下方法就可以实现一步运算返回a b中大的值 def my_max(a,b): c=0 a=int(input('请输入')) b=int(input('请输入')) # if a>b: # c=a # else: # c=b #或者这样 c = a if a > b else b return c ret=my_max(1,3) print(ret) 2.补充上节差的知识点 形参: #位置参数 #默认参数(关键字参数) #动态参数 *args:接收说有按照位

区别PHP引用传递与值传递的小例子

定义 传值:是把实参的值赋值给行参 ,那么对行参的修改,不会影响实参的值 传引用 :真正的以地址的方式传递参数以后,行参和实参都是同一个对象,只是他们名字不同而已,对行参的修改将影响实参的值 说明 传值:跟copy是一样的.打个比方,我有一栋房子,我给你建筑材料,你建了一个跟我的房子一模一样的房子,你在你的房子做什么事都不会影响到我,我在我的房子里做什么事也不会影响到你,彼此独立. 传引用:让我想起了上大学时学习C语言的指针了,感觉差不多.打个比方,我有一栋房子,我给你一把钥匙,我们二个都可以进

[转]Python中函数的值传递和引用传递

首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题.基本的参数传递机制有两种:值传递和引用传递. 值传递(passl-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本.值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值. 引用传递(pass-

验证python中函数传参是引用传递

定义: 值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数. 引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数. 从上面定义可以看出,主要区别就在于内存地址的变化.值传递,内存地址发生变化.引用传递,内存地址不发生变化. 使用User来验证 1 def printid(user): 2 user.age=20 3 p

c++中函数参数传递(值传递、指针传递,引用传递)进一步认识

概念 首先从概念上来说一下这几种函数传参方式及区别: 1.值传递:形参是实参的拷贝,改变函数形参的值并不会影响外部实参的值,这是最常用的一种传参方法,也是最简单的一种传参方法,只需要传递参数,返回值那是return考虑的: 2.指针传递:指针传递参数从本质上来说也是值传递,它传递的是一个地址.[值传递过程中,被调函数的形参作为被调函数的局部变量来处理,即在函数内的栈中开辟内存空间以存放由主调函数放进来的实参的值,从而成了实参的一个副本(记住这个,函数内参数的是实参的副本)].由于指针传递的是外部