Python语言函数 - 基础很重要
小标 2018-07-17 来源 : 阅读 866 评论 0

摘要:本文主要向大家介绍了Python语言函数 - 基础很重要,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助。

本文主要向大家介绍了Python语言函数 - 基础很重要,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助。

一、大体概览一下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) 必须都成立才可以成立.

本文由职坐标整理并发布,了解更多内容,请关注职坐标编程语言Python频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程