zoukankan      html  css  js  c++  java
  • python 参数传递

    在 python 中,类型属于对象,变量是没有类型的:

    a = [1, 2, 3]
    a = 'Runoob'
    

    以上代码中,[1, 2, 3]是 list 类型,'Runoob' 是 String 类型,而变量 a 是没有类型,它只是一个对象的引用(一个指针),可以是 list 类型对象,也可以是 String 类型对象。



    1.可更改(mutable)与不可更改(immutable)对象

    在 python 中, string, tuples,和 numbers 是不可更改对象,而 list, dict 是可修改对象。

    python 函数的参数传递:

    • 不可变类型:类似 c++ 的值传递,如整数、字符串、元组。如 fun(a), 传递的是 a 的值,没有影响 a 对象本身。如果在fun(a)内部修改 a 的值,则是新生成一个 a 的对象。
    • 可变类型:类似 c++ 的引用传递,如列表、字典。如 fun(la) ,则是将 la 真正传过去,修改后 fun 外部的 la 也会受到影响。

    python中一切都是对象,严格意义不能说是值传递还是引用传递,应该说传不可变对象和可变对象。



    2.python传不可变对象实例

    通过 id() 函数查看内存地址变化:

    def change(a):
        print(id(a))
        a = 10
        print(id(a))
        
    a = 1
    print(id(a))
    change(a)
    
    140703710290320
    140703710290320
    140703710290608
    

    可以看到在调用函数前后,形参和实参指向同一个对象(对象 id 相同),在函数内部修改形参后,形参指向的是不同的 id。



    3.传可变对象实例

    可变对象在函数里修改了参数,那么在调用这个函数,原始的参数也被改变了。例如:

    def changeme(mylist):
        '修改传入的列表'
        mylist.append([1, 2, 3, 4])
        print('函数内取值:', mylist)
        return
    
    # 调用changeme函数
    mylist = [10, 20, 30]
    changeme(mylist)
    print('函数外取值:', mylist)
    

    传入函数和在末尾添加新内容的对象用的是同一个引用。故输出结果如下:

    函数内取值: [10, 20, 30, [1, 2, 3, 4]]
    函数外取值: [10, 20, 30, [1, 2, 3, 4]]
    


    4. 参数

    参数类型:

    • 必须参数
    • 关键字参数
    • 默认参数
    • 不定长参数

    必须参数

    必须参数必须以正确的顺序传入函数。调用时的数量必须和声明的一样。

    调用 printme() 函数,必须传入一个参数,不然会出现语法错误:

    def printme(str):
        '打印任何传入的字符串'
        print(str)
        return
    
    # 调用 printme 函数,不加参数会报错
    printme()
    
    TypeError: printme() missing 1 required positional argument: 'str'
    

    关键字传参

    关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。

    使用关键字参数允许函数调用时参数的顺序与声明不一致,因为 python 解释器能用参数名匹配参数值。

    def printme(str):
        # 打印任何传入的字符串
        print(str)
        return
    
    # 调用printme函数
    printme(str = '爱你呦')
    
    爱你呦
    

    默认参数

    如果没有传递参数,则使用默认参数。

    def printinfo(name, age=35):
        "打印任何传入的字符串"
       print ("名字: ", name)
       print ("年龄: ", age)
       return
    
    #调用printinfo函数
    printinfo( age=50, name="runoob" )
    print ("------------------------")
    printinfo( name="runoob" )
    
    名字:  runoob
    年龄:  50
    ------------------------
    名字:  runoob
    年龄:  35
    

    不定长参数

    有时需要一个函数能处理比当初声明时更多的参数。不定长参数声明时不会命名。

    加了*号的参数以元组(tuple)、列表的形式导入。

    def printinfo( arg1, *vartuple ):
       "打印任何传入的参数"
       print ("输出: ")
       print (arg1)
       print (vartuple)
     
    # 调用printinfo 函数
    printinfo( 70, 60, 50 )
    
    输出: 
    70
    (60, 50)
    

    如果在函数调用时没有指定参数,他就是一个空元组。也可以不向函数传递未命名的变量。

    def printinfo( arg1, *vartuple ):
       "打印任何传入的参数"
       print ("输出: ")
       print (arg1)
       for var in vartuple:
          print (var)
       return
     
    # 调用printinfo 函数
    printinfo( 10 )
    printinfo( 70, 60, 50 )
    
    输出:
    10
    输出:
    70
    60
    50
    

    两个**的参数以字典的形式导入。

    def printinfo( arg1, **vardict ):
       "打印任何传入的参数"
       print ("输出: ")
       print (arg1)
       print (vardict)
     
    # 调用printinfo 函数
    printinfo(1, a=2,b=3)
    
    输出: 
    1
    {'a': 2, 'b': 3}
    

    星号*单独出现,参数必须以关键字传入。

    >>> def f(a,b,*,c):
    ...     return a+b+c
    ... 
    >>> f(1,2,3)   # 报错
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: f() takes 2 positional arguments but 3 were given
    >>> f(1,2,c=3) # 正常
    6
    >>>
    
  • 相关阅读:
    NYOJ135 取石子(二)
    NYOJ448 寻找最大数
    NYOJ20吝啬的国度
    NYOJ47过河问题
    NYOJ199无线网络覆盖
    NYOJ92图像有用区域
    NYOJ287Radar
    NYOJ71独木舟上的旅行
    NYOJ484The Famous Clock
    NYOJ148fibonacci数列(二)
  • 原文地址:https://www.cnblogs.com/keye/p/15072861.html
Copyright © 2011-2022 走看看