羽翼飞扬

古人学问无遗力,少壮工夫老始成。纸上得来终觉浅,绝知此事要躬行。

导航

Pyhton 函数 - 基础很重要

一、大体概览一下Python的函数参数类型吧!

# 1、 此类为参数缺省值,想必有过编程底子的朋友看此定然不削。切~我早知道了!^^
def example(arg1 = 'zhangwei', arg2 = [], arg3 = {}, arg4 = ()) :
  pass # 这说明不执行任何动作比如:if (true) { }

# 2、此类型参数我们姑且喊它为“收集元组类型参数” 注:该参数无法为其书写缺省值
def example2(*arg1):   
  pass 

# 3、此类型参数我们姑且喊它为“收集字典类型参数” 注:该参数无法为其书写缺省值
def example3(**arg1) :
  pass

二、调用函数时的传参:

tuple = ('zhangwei', 22, '矮矬穷') # 先初始化一个元组

example2(*tuple) # 在tuple变量之前加上'*'符号我们称之为“元组反序列”。

dict = {'name':'zhangwei', 'age':22, 'identity':'矮矬穷'} # 在初始化一个字典, python的字典定义与javaScript中的对象定义很是相像喔!
example3(**dict) # 在dict变量之前加上'**'我们称之为“字典反序列”。

# 注意喔!以上两种“反序列语法”只能作用于调用函数时传参的行为喔!
# 比如 tuple_temp = *tuple 这可是一种错误的行为呐!**dict也是同理的!

好了,大家看到上面两种举例之后,想必应该对Python中的函数 “定义参数和调用时传参” 有一定的概念了!我这里只是针对"*"和"**"两种语法的规则,下面就让我们再走几个小实例,将这些使用规则加深记忆在我们婶婶的脑海里!(ps:好吧,我表示对这首歌曲走火入魔了)

 

三、理论与实践结合

example 1:

def example1(*arg1):
  print arg1
example(1, 2, 3, 4, 5)

# 输出结果:(1, 2, 3, 4, 5)
# 可以看到输出的是一个tuple(元组类型的数据), 确实将传进来的5个整型参数都收集了起来。

example 2:

def example2(arg1, *arg2):
    print arg1, arg2
example2(1, 2, 3, 4, 5)

# 输出结果:1 (2, 3, 4, 5)
# 传参的还是5个整型数值,然后arg1等于1, 后面的2,3,4,5被arg2收集了。

example 3:

def example4(arg1, arg2, *arg3):
    print arg1, arg2, arg3
example3(*g_tuple)

# 输出结果:1 2 (3, 4, 5)  arg1为1; arg2为2; arg3=(3, 4, 5)

提示: def example2( *arg2, arg1 ) 或 def example2( arg1,*arg2, *arg3 ) 此类是错误写法,我不再举例,具体原因在后面我会进行说明。

example 4:

def example4(*arg1):
    print arg1
g_tuple = (1, 2, 3, 4, 5)
example3(*g_tuple) # example3(g_tuple) 同样可以

# 输出结果:(1, 2, 3, 4, 5)
# 将tuple类型的变量通过'*'符号反序列化后传入函数, 如果直接传入g_tuple变量进去也是可行的!

example 5:

def example5(arg1, *arg2):
    print arg1, arg2
g_tuple = (1, 2, 3, 4, 5)
example3(100, *g_tuple)

# 输出结果:100 (1, 2, 3, 4, 5) 

example 6:

def example6(**arg1):
  print arg1
dicts = {'name':'zhangwei', 'age':22}
example6(name='zhangwei', age=22) # 或者example6(**dicts) , 但是example6(dicts)这种写法会报错

# 输出结果:{'age': 22, 'name': 'zhangwei'} 这里需要注意一个地方就是字典内的键值输出顺序并非是根据定义的先后.

example 7:

def example7(arg1, **arg2):
    print arg1, arg2
example7(('zhangwei', 22), name='zhangwei', age=22)

# 输出结果:('zhangwei', 22) {'age': 22, 'name': 'zhangwei'}

# 很遗憾,“**参数”不接受类似{'name':'zhangwei', 'age':22}这样的格式传参,会报错:(。
#并且传参的字典数据中的键值不能与该函数内的参数名相同。比如:example6(('zhangwei', 22), name='zhangwei', arg1=22)同样会报错

example 8:

def example8(arg1, *arg2, **arg3):
    print arg1, arg2, arg3
var1, var2 = (99), (100)
example8(('zhangwei', 22), var1, 2, var2, name='zhangwei', age=22)

# 输出结果:('zhangwei', 22) (99, 2, 100) {'age': 22, 'name': 'zhangwei'}

# 这里我们能够看出,arg3完全不理会非字典数据类型的值,('zhangwei', 22)已经被arg1拿走了,剩下的var1, 2, var3中有包含整型数值的,
# 也有tuple元组数据类型的,但是都很合arg2(收集元组)的胃口,所以都被arg2拿走了。所以剩下name和age两种字典类型的数值理所当然的就被arg3拿走咯。

example 9:

def example9(arg, arg2='arg2', arg3 = 'arg3', *arg4, **arg5):
    print arg, arg2, arg3, arg4, arg5
example9(10, arg3="哈哈哈", name='zhangwei'); 
# 输出结果:10 arg2 哈哈哈 () {'name': 'zhangwei'} example9(1, 2, 3, 4, 5, 6, 7, 8, 9);
# 输出结果:1 2 3 (4, 5, 6, 7, 8, 9) {} example9(1, 2, 3, 4, 5, 6, 7, 8, 9, name='zhangwei', age=22);
# 输出结果:1 2 3 (4, 5, 6, 7, 8, 9) {'age': 22, 'name': 'zhangwei'} example9(arg3=100, arg=1000, arg2=10000);
# 输出结果:1000 10000 100 () {} example9(arg3=100, arg=1000, arg2=10000, arg4=123, arg5=456);
# 输出结果:1000 10000 100 () {'arg4': 123, 'arg5': 456} #example9(arg3=100, arg=1000, arg2=10000, 1,2,3); 很遗憾,这种写法不被允许,所以可以得出结论:“*收集元组参数”之前不可以跟类似键值的传参 # 但是以上有一些不太明晰的写法我是不推荐大家使用的,写代码的目的就是为了让人更好的阅读。难道每天10100101这样的写代码你能受得了吗?:)

 

 

如果有细心的朋友一路看下来,肯定会发现一个问题,上面的代码举例中,都是诸如example(arg, *arg2, **arg3)这种写法。

却没有example(arg, **arg2, *arg3) 或者 example(arg, *arg2, arg3) 这种写法。^^, 我明确告诉大家吧,这种写法是错误的。

为什么是错误的?我把这些注意事项统统写在总结里了。朋友们,再坚持一下吧,男人还是持久点好:)。

总结:

通过上面的诸多实例,大家想必能够看出个大致来了,但也难免有遗漏之处,具体的更多用法大家可以自行进行测试。下面我将pyhton中的这些语法规则做个记录。

1、python中 函数的参数为收集类型时有:(“*”:收集元组; “**”:收集字典;)

2、python中 调用函数时传参可以用“*var 元组反序列”,“**var 字典反序列”.

3、当调用函数传参时,如果传递的是“*var元组反序列” 或 “**var 字典反序列”时,其对应的接收参数必须为相应的收集类型.

4、我对函数的参数等级进行了划分,比如:function(arg, *arg2, **arg3); arg等级为1,arg2等级为2, arg3等级为3;排放顺序有先后,等级1的参数后面可跟等级2的参数,等级2的参数后面可跟等级3的参数。反之则不可以,比如等级3的参数后面跟等级2或1的参数,都是错误的哦!而且*参数后面只能跟等级比自己高的**参数,如果跟的还是*参数的话,同样会报错哦!

5、function(sex, name='zhangwei'), 此类语法是为参数name设置缺省值,该参数只能且必须放置在参数列表最后。但是如果参数列表中包含有*arg 或 **arg的时候就不行了,还记得规则4吗?^^, 因为该参数虽说是缺省参数,但是其等级为1啊。所以 (规则4) && (规则5) 必须都成立才可以成立.

 

Author:羽翼飞扬

 

 

posted on 2014-04-05 16:54  羽翼飞扬  阅读(1160)  评论(2编辑  收藏  举报