参数传递
    在 python 中,类型属于对象,变量是没有类型的:
        a=[1,2,3]
        a="Runoob"
    以上代码中,[1,2,3] 是 List 类型,"Runoob" 是 String 类型,而变量 a 是没有类型,她仅仅是一个对象的引用(一个指针),可以是指向 List 类型对象,也可以是指向 String 类型对象。

可更改(mutable)与不可更改(immutable)对象
    在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象。
        不可变类型:变量赋值 a=5 后再赋值 a=10,这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变a的值,相当于新生成了a。
        可变类型:变量赋值 la=[1,2,3,4] 后再赋值 la[2]=5 则是将 list la 的第三个元素值更改,本身la没有动,只是其内部的一部分值被修改了。
    python 函数的参数传递:
        不可变类型:类似 c++ 的值传递,如 整数、字符串、元组。如fun(a),传递的只是a的值,没有影响a对象本身。比如在 fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身。
        可变类型:类似 c++ 的引用传递,如 列表,字典。如 fun(la),则是将 la 真正的传过去,修改后fun外部的la也会受影响
    python 中一切都是对象,严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象。

python 传不可变对象实例
        #!/usr/bin/python3
        
        def ChangeInt( a ):
            a = 10

        b = 2
        ChangeInt(b)
        print( b ) # 结果是 2
    实例中有 int 对象 2,指向它的变量是 b,在传递给 ChangeInt 函数时,按传值的方式复制了变量 b,a 和 b 都指向了同一个 Int 对象,在 a=10 时,则新生成一个 int 值对象 10,并让 a 指向它。

传可变对象实例
    可变对象在函数里修改了参数,那么在调用这个函数的函数里,原始的参数也被改变了。例如:
        #!/usr/bin/python3
        
        # 可写函数说明
        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]]

参数
    以下是调用函数时可使用的正式参数类型:
        必需参数
        关键字参数
        默认参数
        不定长参数

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

    调用printme()函数,你必须传入一个参数,不然会出现语法错误:
        #!/usr/bin/python3
        
        #可写函数说明
        def printme( str ):
           "打印任何传入的字符串"
           print (str)
           return
        
        #调用printme函数
        printme()
    以上实例输出结果:
        Traceback (most recent call last):
          File "test.py", line 10, in <module>
            printme()
        TypeError: printme() missing 1 required positional argument: 'str'

关键字参数
    关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。
    使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。
    以下实例在函数 printme() 调用时使用参数名:

#coding=utf-8
def jiao(pet1,pet2):
print('喵的叫声',pet1)
print('汪的叫声',pet2)
# jiao('2ha','bosi')
jiao(pet1='bosi',pet2='2哈')

以下实例中演示了函数参数的使用不需要使用指定顺序:
        #!/usr/bin/python3
        
        #可写函数说明
        def printinfo( name, age ):
           "打印任何传入的字符串"
           print ("名字: ", name)
           print ("年龄: ", age)
           return
        
        #调用printinfo函数
        printinfo( age=50, name="runoob" )
    以上实例输出结果
        名字:  runoob
        年龄:  50

默认参数
    调用函数时,如果没有传递参数,则会使用默认参数。以下实例中如果没有传入 age 参数,则使用默认值:
        #!/usr/bin/python3
        
        #可写函数说明
        def printinfo( name, age = 35 ):
           "打印任何传入的字符串"
           print ("名字: ", name)
           print ("年龄: ", age)
           return
        
        #调用printinfo函数
        printinfo( age=50, name="runoob" )
        print ("------------------------")
        printinfo( name="runoob" )
    以上实例输出结果:
        名字:  runoob
        年龄:  50
        ------------------------
        名字:  runoob
        年龄:  35

...

#coding=utf-8
def jiao(pet1,pet2='2ha'):
print('喵是%s的叫声'%pet1)
print('汪是%s的叫声'%pet2) # jiao('波斯')
jiao('波斯','阿拉')

不定长参数
    你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述2种参数不同,声明时不会命名。基本语法如下:
        def functionname([formal_args,] *var_args_tuple ):
           "函数_文档字符串"
           function_suite
           return [expression]
    加了星号(*)的变量名会存放所有未命名的变量参数。如果在函数调用时没有指定参数,它就是一个空元组。我们也可以不向函数传递未命名的变量。

如下实例:
        #!/usr/bin/python3
        # 可写函数说明
        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 f(a,b,*,c):
            return a+b+c
    用法:星号(*)后的参数必须用关键字传入。
        >>> 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

#coding=utf-8

# def test(x,y,*args):
# print(x,y,args)
#
# test(1,2,3,4,5) def test1(x,y,**args):
print(x,y,args) test1(1,2,a=3,b=4)

Python 函数 参数传递的更多相关文章

  1. Python 函数参数传递机制.

    learning python,5e中讲到.Python的函数参数传递机制是对象引用. Arguments are passed by assignment (object reference). I ...

  2. Python函数参数传递

    Python中函数参数的传递是采用传值方式,但是和C/C++有所不同 C/C++方式 void fun(int a) { a = 10; } void main() { int c =3; fun(c ...

  3. [蟒蛇菜谱]Python函数参数传递最佳实践

    将函数作为参数传递,同时将该函数需要的参数一起传递.可参考threading.Timer的处理方式: class threading.Timer(interval, function, args=[] ...

  4. python函数的参数传递问题---传值还是传引用?

    摘要:在python中,strings, tuples, 和numbers是不可更改的对象,而list,dict等则是可以修改的对象.不可更改对象的传递属于传值,可更改对象属于传引用.想要在函数中传递 ...

  5. Python 函数的参数传递

    C/C++中,传递参数的类型是可以指定的.一般来说,传递参数可以分为两种:值传递和引用传递.对于值传递,参数传递的过程中进行了复制操作,也就是说,在函数中对参数的任何改动都不会影响到传入的变量:对于引 ...

  6. Python 函数中,参数是传值,还是传引用?

    在 C/C++ 中,传值和传引用是函数参数传递的两种方式,在Python中参数是如何传递的?回答这个问题前,不如先来看两段代码. 代码段1: def foo(arg): arg = 2 print(a ...

  7. python函数和lambda表达式学习笔记

    1. python函数 不同于其他语言,python支持函数返回多个值 为函数提供说明文档:help(函数名)或者函数名.__doc__ def str_max(str1, str2): ''' 比较 ...

  8. Python语言特性之1:函数参数传递

    问题:在Python文档中好像没有明确指出一个函数参数传递的是值传递还是引用传递.如下面的代码中"原始值"是不放生变化的: class PassByReference: def _ ...

  9. Python学习笔记之函数参数传递 传值还是传引用

      在学完Python函数那一章节时,很自然的的就会想到Python中函数传参时传值呢?还是传引用?或者都不是? 在回答上面的问题之前我们先来看看下面的代码: 代码1: def foo(var): v ...

随机推荐

  1. JVM学习笔记——方法区

    方法区 Method Area 方法区在逻辑上属于堆的一部分,但可以看做是一块独立于 Java 堆的内存空间.所有的字段和方法字节码,以及一些特殊的方法,如构造函数,接口代码在此定义.所有定义方法的信 ...

  2. react之组建通信

    父组件与子组件通信 父组件将自己的状态传递给子组件,子组件当做属性来接收,当父组件更改自己状态的时候,子组件接收到的属性就会发生改变 父组件利用ref对子组件做标记,通过调用子组件的方法以更改子组件的 ...

  3. js 改变this指向的三种方法 bind call apply

    先了解下bind call apply 的注意点 bind 需要手动调用 第一个参数 this 要指向的对象,后面是 散列的参数 call 不需要手动调用 第一个参数 this 要指向的对象,后面是 ...

  4. wqs二分 学习笔记

    wqs二分学习笔记 wqs二分适用题目及理论分析 wqs二分可以用来解决这类题目: 给你一个强制要求,例如必须\(n\)条白边,或者划分成\(n\)段之类的,然后让你求出最大(小)值.但是需要满足图像 ...

  5. Java(35)IO特殊操作流&Properties集合

    作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15228454.html 博客主页:https://www.cnblogs.com/testero ...

  6. 【UE4 C++】UKismetMathLibrary 源代码

    // Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" # ...

  7. 【数据结构与算法Python版学习笔记】图——基本概念及相关术语

    概念 图Graph是比树更为一般的结构, 也是由节点和边构成 实际上树是一种具有特殊性质的图 图可以用来表示现实世界中很多有意思的事物,包括道路系统.城市之间的航班.互联网的连接,甚至是计算机专业的一 ...

  8. 【数据结构与算法Python版学习笔记】树——平衡二叉搜索树(AVL树)

    定义 能够在key插入时一直保持平衡的二叉查找树: AVL树 利用AVL树实现ADT Map, 基本上与BST的实现相同,不同之处仅在于二叉树的生成与维护过程 平衡因子 AVL树的实现中, 需要对每个 ...

  9. c++继承关系中成员函数的重载、重写、重定义之间的区别

    1.Override.Overload.Redefine Overload 重载只能发生在类内部,不能发生在子类和父类的继承中.具体来说,如果子类中有父类同名.同返回值类型,但是不同参数列表,这两个在 ...

  10. docker 使用报错的相关问题

    docker 创建本地主机实例Virtualbox 驱动报错,显示没有下载这个驱动 解决方案,下载virtuabox. https://www.cnblogs.com/effortday/p/1502 ...