原文地址https://blog.csdn.net/love666666shen/article/details/77131487

1.位置与关键字传递

(1)位置传递:先用形式参数定义,然后在调用时对应位置使用实参(具体的数值)调用

def sum(a, b): 
    return a + b 
sum(5, 6)

(2)关键字传递:先使用形式参数定义,然后调用时使用定义时的关键词并赋予其相应的值 
def sub(a, b): 
    return a - b 
s1 = sub(a=6, b=3) 
s2 = sub(b=3, a=0) 
s3 = sub(9, b=3) 
以上程序都是关键字传递,返回值为s1 = 3, s2 = -3, s3 = 6 

注意:
(1)关键字传递是根据每个参数的名字进行参数传递的,关键字可以不遵守位置的对应关系(如s2的调用);
(2)关键字传递可以和位置传递混用,但位置参数要出现在关键字参数之前(如s3的调用)。

2.参数默认值

参数默认值是指函数在定义时,参数被预先赋予相应的默认值。这样在调用时,可以重新赋值,也可以(对默认参数)不用赋值而使用默认的值。

def mul(a, b=3, c=2):
    print("a:{0}, b:{1}, c:{2}".format(a, b, c))
    return a *b*c

3.包裹传递

在定义函数时,我们有时候并不知道调用的时候会传递多少个参数。这时候,包裹(packing)位置参数,或者包裹关键字参数,来进行参数传递,会非常有用。
(1)包裹位置传递:
def func(*name):
    print type(name), name
func(1,6)
func(5,6,8,3,2,7)

①name是包裹位置传递所用的参数名,在定义func时,要在name前加*代表使用包裹位置传递,调用时传递的参数可以有多个;
②两次调用,尽管参数个数不同,但都基于同一个func定义。在func的参数表中,所有的参数被name收集,根据位置合并成一个元组(tuple)。
 
(2)包裹关键字传递的例子:
def func(**dict):
    print type(dict), dict
func(name="jim", age=23, num=123568 , count="china")
func(m=2, n=1, c=11)

这里,由于字典类型是无序的,所以输出时并不一定跟输入的顺序一致。

①参数dict是包裹关键字传递所用的参数名,在dict前加**表示使用的是包裹关键字传递;
②调用时,将所有的参数名和数值组合成字典key:value的形式,传递给dict,这里dict代表一个字典,收集所有的关键字,传递给函数func。

包裹传递的关键在于定义函数时,在相应元组或字典前加*或**。

4.解包裹

*和**,也可以在调用的时候使用,即解包裹(unpacking), 下面为例:
def func(a,b,c):
    print a,b,c
args = (1,3,4)
func(*args)
在这个例子中,所谓的解包裹,就是在传递tuple元祖类型数据时,让tuple的每一个元素对应一个位置参数。在调用func时使用*,把args按照定义时参数的个数进行拆分成,分别传递给a,b,c。
 
相应的,也存在对词典的解包裹,使用相同的func定义,然后:
dict = {'a':1,'b':2,'c':3}
func(**dict)
在传递词典dict时,让词典的每个键值对作为一个关键字传递给func。

注意:在关键字解包裹时,调用时字典中key的名字要与定义函数时的参数名相同(且需要引号括进来),数目需要一致,顺序可以不一样。

解包裹的关键在于调用函数时,在相应元组或字典前加*或**。

5.几种类型的混合

在定义或者调用参数时,参数的几种传递方式可以混合。但在过程中要小心前后顺序。基本原则是,先位置,再关键字,接着包裹位置,最后包裹关键字的顺序,并且根据上面所说的规则细细分辨。
 
注意:请注意定义时和调用时的区分。包裹和解包裹并不是相反操作,是两个相对独立的过程。

python中参数传递之位置传递、关键字传递、包裹传递与解包裹的更多相关文章

  1. python中参数传递的方法

    Python中函数传递参数的形式主要有以下五种,分别为位置传递,关键字传递,默认值传递,不定参数传递(包裹传递)和解包裹传递. 1.位置传递实例: def fun(a,b,c) return a+b+ ...

  2. Python核心技术与实战——十三|Python中参数传递机制

    我们在前面的章节里学习了Python的函数基础以及应用,那么现在想一想:传参,也就是把一些参数从一个函数传递到另一个函数,从而使其执行相应的任务,这个过程的底层是如何工作的,原理又是怎样的呢? 在实际 ...

  3. Python中的*可变参数与**关键字参数

    1.定义了一个需要两个参数的函数 def print_str(first, second): print first print second if __name__ == "__main_ ...

  4. python中获取当前位置所在的行号和函数名(转)

    http://www.vimer.cn/2010/12/%E5%9C%A8python%E4%B8%AD%E8%8E%B7%E5%8F%96%E5%BD%93%E5%89%8D%E4%BD%8D%E7 ...

  5. python中获取当前位置所在的行号和函数名(转)

    http://www.vimer.cn/2010/12/%E5%9C%A8python%E4%B8%AD%E8%8E%B7%E5%8F%96%E5%BD%93%E5%89%8D%E4%BD%8D%E7 ...

  6. python中的sort、sorted、reverse、reversed详解

    python语言中的列表排序方法有三个:reverse反转/倒序排序.sort正序排序.sorted可以获取排序后的列表.在更高级列表排序中,后两中方法还可以加入条件参数进行排序. reverse() ...

  7. Python中匿名函数与内置高阶函数详解

    大家好,从今天起早起Python将持续更新由小甜同学从 初学者的角度 学习Python的笔记,其特点就是全文大多由 新手易理解 的 代码与注释及动态演示 .刚入门的读者千万不要错过! 很多人学习pyt ...

  8. python中在同一个位置输出数据

    import sys, time def print_data(): for i in range(5): sys.stdout.write(str(i) + '\r') time.sleep(1) ...

  9. Python中Gradient Boosting Machine(GBM)调参方法详解

    原文地址:Complete Guide to Parameter Tuning in Gradient Boosting (GBM) in Python by Aarshay Jain 原文翻译与校对 ...

随机推荐

  1. WPF datagrid 获取行或单格为NULL 问题

    datagrid  属性 EnableRowVirtualization 设置为 false 解决...不要问我为什么. 害死我了

  2. myEclipse中项目无法部署到tomcat

    问题现象: 从svn上新下载了项目到win环境上. 部署项目的时候,在servers视图里,Add Deployment,如下图: 发现只有一个项目可以加载,另外的项目看不到:可是明明我并没有部署过啊 ...

  3. java课堂动手动脑总结

    java有8种基本数据类型:byte,int,short,long,boolean,char,float,double. 对应的为:Byte,Int,Short,Long,Boolean,Charec ...

  4. GMM-实现聚类的代码示例

    Matlab 代码: % GMM code function varargout = gmm(X, K_or_centroids) % input X:N-by-D data matrix % inp ...

  5. FFmpeg制作+x264+faac

    https://blog.csdn.net/leixiaohua1020/article/details/47071547  雷神的博客 https://www.jianshu.com/p/3f023 ...

  6. MSSQL优化之————探索MSSQL执行计划

    最近总想整理下对MSSQL的一些理解与感悟,却一直没有心思和时间写,晚上无事便写了一篇探索MSSQL执行计划,本文讲执行计划但不仅限于讲执行计划. 网上的SQL优化的文章实在是很多,说实在的,我也曾经 ...

  7. LeetCode 427 Construct Quad Tree 解题报告

    题目要求 We want to use quad trees to store an N x N boolean grid. Each cell in the grid can only be tru ...

  8. SQL union介绍

    UNION 操作符用于合并两个或多个 SELECT 语句的结果集 UNION 内部的 SELECT 语句必须拥有相同数量的列.列也必须拥有相似的数据类型.同时,每条 SELECT 语句中的列的顺序必须 ...

  9. mybatis获取批量插入的主键自增id

    一.写一个实体类 public class UserInfo { private long userId; private String userAccount; private String use ...

  10. 【python基础】迭代器和生成器函数

    1.迭代器协议: 1.迭代器协议是指:对象必须提供一个 __next__() 方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代(只能往后走不能往前退) ...