Python基础笔记(1):函数篇(1):关于函数参数

来源:互联网 发布:兰灯翻墙for mac 编辑:程序博客网 时间:2024/06/05 18:24

一、函数参数


1、两种对象

     python采用“对象传递(pass by object)"(Python中有一句话:一切皆为对象)

     根据传递过来的对象分为:

    a. 可变对象,可变对象可在函数内对对象所在内存地址进行值修改,list、dict......都属于可变对象。示例:

>>> L=[1,2,3,4,5]>>> id(L) 41630088>>> L[0]=100>>> L[100, 2, 3, 4, 5]>>> id(L)41630088
对list对象进行修改,修改前后对象的地址没有改变 对象值改变后,引用L并未指向新的对象,而是在原有基础进行改变

               

    b. 不可变对象

                看一个简单的例子

>>> a=1>>> id(a)1985323456>>> a=a+1>>> id(a)1985323488>>>
不可变对象修改值是让引用指向一个新创建的对象,因此地址改变,原来的对象也被回收了


2、位置参数

        就是一般函数参数的传递,有多少参数需要什么参数就怎么传


3、默认参数

      

def sum(x,n=100):    ...    ...

        默认参数有一点要注意,当没有参数传入时,调用函数,其中的默认参数执行操作后并没有消失,依旧在局部函数中,而且保留了上次操作结果(对于可变对象来说)。看下面代码:

>>> def Test(L=[]):... L.append('Hello')... print(L)... >>> Test()['Hello']>>> Test()['Hello', 'Hello']>>> Test()['Hello', 'Hello', 'Hello']>>>
    默认这里涉及到了前面的可变对象。函数每次调用都添加一个字符串,是因为局部函数中,L这个引用一直指向同一个list对像,不断增加字符串并不会改变地址,指向新的对象


4、可变参数

    如果传递给一个函数的参数,一会需要1一个,一会需要100个,该怎么做呢?使用默认参数能做到这样,但是未免太过于低效和麻烦了。可变参数就派上用场了,在C/C++中,scanf和printf函数就是常用的能接受可变参数的函数,C/C++其中实现的细节后面再谈,我们先看Python。示例:

def sum(*num):result=0for value in num:result=result+valuereturn resultprint(sum(1,2,3,4))</span>
在参数头加上一个“ * ”表示此函数可以传递可变参数。如果要传入一个列表:

def sum(*num):result=0for value in num:result=result+valuereturn resultL=[1,2,3,4]print(sum(*L))#输出结果:10
应用在lambda表达式中:

fun=lambda *num: [print(value) for value in num]  fun(1,2,3,4)

5、关键字参数

    关键字参数像是dict和可变参数的组合,看代码:

def key_paramer(**args): #两个*号print(args)for key,value in args.items():print(key,':',value)key_paramer(city='Chonqing',name='zhangsan')




1 0
原创粉丝点击