参数传递
    在 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. ElasticSearch搜索引擎

    官网:Elasticsearch:官方分布式搜索和分析引擎 | Elastic Elaticsearch,简称为es,es是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储.检索数据;本身扩 ...

  2. 1-SQL Server2019安装

    sql server2019安装 首先去官网下载(下载express版本): 打开安装程序 选择自定义 更改一下安装目录,点击安装 等待安装 等安装完成后,出现如下页面 选择SQL Server独立安 ...

  3. 【C++ Primer Plus】编程练习答案——第3章

    1 void ch3_1() { 2 using namespace std; 3 unsigned int factor = 12; 4 unsigned int inch, feet; 5 cou ...

  4. 关于使用antd-vue的卡片无法设置avatar图标/头像问题的解决方案

    在使用antd-vue的卡片a-card时,遇到无法添加avatar图标/头像的问题,原因出在a-avatar,他不支持webpack图片打包. 上代码:       <a-card hover ...

  5. JVM学习笔记——类加载器与类加载过程

    类加载器与类加载过程 类加载器ClassLoader 类加载器 ClassLoader 用于把 class 文件装载进内存. 启动类加载器(Bootstrap ClassLoader): 这个类加载使 ...

  6. 微信小程序内判断是否关注公众号(JAVA)

    微信小程序内判断是否关注公众号(JAVA) 思路来源(第二种): https://blog.csdn.net/Yanheeee/article/details/117295643 /** * 总体思路 ...

  7. 洛谷4400 BlueMary的旅行(分层图+最大流)

    qwq 首先,我们观察到题目中提到的每天只能乘坐一次航班的限制,很容易想到建分层图,也就是通过枚举天数,然后每天加入一层新的点. (然而我一开始想的却是erf) 考虑从小到大枚举天数,然后每次新建一层 ...

  8. Wireshark 过滤器的使用

    符号 例子 = = tcp.port = = 80 过滤出来TCP包含80端口的数据包 != ip.src != 127.0.0.1 ip的原地址不是127.0.0.1过滤出来 > lp.len ...

  9. 极速上手 VUE 3 —— teleport传送门组件

    一.teleport 介绍 teleport 传送门组件,提供一种简洁的方式,可以指定它里面的内容的父元素.通俗易懂地讲,就是 teleport 中的内容允许我们控制在任意的DOM中,使用简单. 使用 ...

  10. Coursera Deep Learning笔记 序列模型(三)Sequence models & Attention mechanism(序列模型和注意力机制)

    参考 1. 基础模型(Basic Model) Sequence to sequence模型(Seq2Seq) 从机器翻译到语音识别方面都有着广泛的应用. 举例: 该机器翻译问题,可以使用" ...