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
    >>>
    
  • 相关阅读:
    【数据结构】线性表&&顺序表详解和代码实例
    【智能算法】超详细的遗传算法(Genetic Algorithm)解析和TSP求解代码详解
    【智能算法】用模拟退火(SA, Simulated Annealing)算法解决旅行商问题 (TSP, Traveling Salesman Problem)
    【智能算法】迭代局部搜索(Iterated Local Search, ILS)详解
    10. js时间格式转换
    2. 解决svn working copy locked问题
    1. easyui tree 初始化的两种方式
    10. js截取最后一个斜杠后面的字符串
    2. apache整合tomcat部署集群
    1. apache如何启动
  • 原文地址:https://www.cnblogs.com/keye/p/15072861.html
Copyright © 2011-2022 走看看