设为首页 收藏本站
查看: 871|回复: 0

[经验分享] Python函数相关

[复制链接]

尚未签到

发表于 2015-11-30 09:09:33 | 显示全部楼层 |阅读模式
  Python中的函数也是一种对象,而且函数还是一等公民。函数能作为参数,也能作为返回值,这使得Python中的函数变得很灵活。想想前面两篇中介绍的通过内嵌函数实现的装饰器和闭包。
  下面就介绍一下Python函数相关的一写内容。

可变长度参数
  在编程的过程中,可能会遇到函数参数个数不固定的情况,这时就需要使用可变长度的函数参数。在Python函数定义中,使用*和**符号分别指定元组(非关键字)和字典(关键字)作为参数。

非关键字变长参数(元组)
  当函数被调用的时候,所有的参数都将值赋给了在函数声明中对应的局部变量,剩下的非关键字参数按照顺序添加到一个元组中便于访问。
  可变长元组参数必须在位置和默认参数之后,所以使用可变长元组参数的函数形式一般如下(中括号表示可选参数),可变长元组参数前有一个"*"符号:



def funcName([fromal_args,] *tuple_grp_nonkw_args):
pass
  看一个例子:



def argFunc(positional_arg, keyword_arg="foo", *tuple_grp_nonkw_args):
print "positional_arg:", positional_arg
print "keyword_arg:", keyword_arg
for arg in tuple_grp_nonkw_args:
print "additional_arg:", arg
argFunc(3)
print
argFunc(3, 4)
print
argFunc(3, 4, "hello", "world")
  代码的输出为:
DSC0000.png

关键字变长参数(字典)
  除了上面的方式,Python还可以支持关键字变长参数,额外的关键字参数被放入了一个字典进行使用。
  可变长字典参数必须是函数定义中的最后一个参数,所以使用可变长字典参数的函数形式一般如下(中括号表示可选参数),可变长字典参数前有一个"**"符号:



def funcName([fromal_args,] [*tuple_grp_nonkw_args,] **dict_grp_kw_args):
pass
  看一个例子:



def argFunc(positional_arg, keyword_arg="foo", *tuple_grp_nonkw_args, **dict_grp_kw_args):
print "positional_arg:", positional_arg
print "keyword_arg:", keyword_arg
for arg in tuple_grp_nonkw_args:
print "additional non-keyword arg:", arg
for argKey in dict_grp_kw_args.keys():
print "additional keyword arg: {'%s': %s}" %(argKey, dict_grp_kw_args[argKey])
argFunc(3, 4, name="wilber", age=28)
print
argFunc(3, 4, "hello", "world", name="wilber", age=28)
print
  代码输出为:
DSC0001.png
  函数调用的完整形式为:



func( positional_args, keyword_args, *tuple_grp_nonkw_args, **dict_grp_kw_args )
  在使用的过程中,所有参数都是可选的,但应当注意的是:上面四种参数的位置是不可调换的

匿名函数(lambda)
  Python允许使用lambda关键字创建匿名函数,通过lambda关键字,可以快速编写简单函数。
  使用lambda关键字的形式为:



lambda [arg1 [, arg2, ... argN]]: expression
  对于不经常被调用的简单函数,建议直接使用lambda表达式,方便简洁:



addNum = lambda x, y: x+y
print addNum
print "3 + 4 = ", addNum(3, 4)
几个内建函数
  Python可以很好的支持面向对象编程,但是通过Python中以下几个内建函数和lambda表达式,也可以体验一下函数式编程。

filter()
  filter函数的完整形式为filter(func, seq):调用一个布尔类型的函数func来遍历每一个seq中的元素,返回一个使func返回值为ture的元素的序列。
  例如获取100以内的奇数:



print filter(lambda n: (n%2) == 1, range(100))
  当然对于上面的例子,也可以使用列表解析实现:



print [i for i in range(100) if i%2 == 1]
map()
  map函数的完整形式为map(func, seq1 [, seq2...]):将函数func作用于给定序列的每一个元素,并用一个列表来提供返回值;如果func为None,作用同zip()。
  是不是被上面的描述搞晕了,还是看例子吧:



# map的func为None
print map(None, [4, 5, 6])
print map(None, [1, 2, 3], [4, 5, 6])
# map 针对一个序列
print map(lambda x: x*2, [4, 5, 6])
# map 针对多个序列
print map(lambda x, y: x + y, [1, 2, 3], [4, 5, 6])
  代码输出为:
DSC0002.png

reduce()
  reduce函数的完整形式为reduce(func, seq [, init]):func是一个二元函数;reduce对seq中的每一个元素进行迭代,每次迭代将上一次的迭代结果(第一次时使用init,如没有init,则使用seq的第一个元素)与下一个元素执行func函数。
  看一个例子,通过reduce函数进行求和操作:



print reduce(lambda x, y: x + y, range(10))
print reduce(lambda x, y: x + y, range(10), 100)
  输出为:
DSC0003.png
  根据上面的介绍,我们自己也可以实现一个reduce函数:



def xreduce(bin_func, seq, init=None):
Iseq = list(seq)
if init is None:
res = Iseq.pop(0)
else:
res = init
for obj in Iseq:
res = bin_func(res,obj)
return res
总结
  本文介绍了Python函数相关的一些内容:


  • 可变长参数
  • 匿名函数lambda
  • 内建函数filter(),map(),reduce

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-145153-1-1.html 上篇帖子: python DictFormatting 下篇帖子: python的远程调试(使用pycharm)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表