Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1754322
  • 博文数量: 335
  • 博客积分: 4690
  • 博客等级: 上校
  • 技术积分: 4341
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-08 21:38
个人简介

无聊之人--除了技术,还是技术,你懂得

文章分类

全部博文(335)

文章存档

2016年(29)

2015年(18)

2014年(7)

2013年(86)

2012年(90)

2011年(105)

分类: Python/Ruby

2013-04-05 23:48:51

        函数的定义大家都无比熟悉,不论何种语言,都有类似的定义,但是python语言还是有其独到之处,函数的定义本身来说,都差不多,
这里我么需要关注的是函数参数的类型,注意哦,这里的类型不是参数本身的数据类型,而是参数在调用时候具有的不同特性。

点击(此处)折叠或打开

  1. # about parameter : position & keyword parameter & default value
  2. def greet(name,greeting='hello world'):
  3.     print name,greeting
  4. # call with keyword parameter
  5. print 'call without keyword format'
  6. greet('kin','welcome !')
  7. greet('welcome !','kin')
  8. # call with keyword parameter
  9. print 'call with keyword format '
  10. greet(name='kin',greeting='welcome !')
  11. greet(greeting='welcome !',name='kin')
  12. print 'about default parameter'
  13. greet('kin')
  14. greet('kin','welcome once again')
程序的输出:
  1. call without keyword format
  2. kin welcome !
  3. welcome ! kin
  4. call with keyword format
  5. kin welcome !
  6. kin welcome !
  7. about default parameter
  8. kin hello world
  9. kin welcome once again
同一个函数,使用不用的调用方式,产生的程序输出不同,
注意这里,函数的定义没有变,改变的函数的调用方式,
一种是使用position argument : 无需考虑变量名称,直接调用即可
一种是keyword argument :    在调用的时候,使用变量名来确定不同变量的调用顺序,(说道这里,说点题外话,在JCL中,也有类似的定义的先是position argument,后是keyword  argument,现在想来,语言都是想通的)
使用函数的默认值: 函数的默认值必须作为最后的参数来定义,当然了你可以覆盖掉该值
在着就是你需要注意的是,如果函数的参数个数是不确定情况下,函数时如何定义并调用的?在python中,它也是使用特殊的语法来实现的:
看看下面的代码:

点击(此处)折叠或打开

  1. def complexpara(x,y,z,name='a',*tuplep,**dicp):
  2.     print x,y,z # position paramter
  3.     print name
  4.     print tuplep # leftover position parater
  5.     print dicp # leftover keyword parameter
  6. # call with complex agurment
  7. complexpara(1,2,3,'kin',4,5,6,add='shanghai',email='@gmail.com')
  8. # let's think something about usage of * when call
  9. tuplep=(1,3,5)
  10. def myadd(*element):
  11.     print reduce(lambda x,y:x+y,element)
  12. print 'sum result is ',myadd(*tuplep), # call with arguments unpacked from a tuple
  13. tuplep=(1,3,5,7,9)
  14. print 'sum result is ',myadd(*tuplep),  # call with arguments unpacked from a tuple


  15. dicp={'name':'kin','age':'30'}
  16. def parsedic(**dictp):
  17.     print 'name is '+dictp['name']+'age is '+dictp['age']
  18. def parsediccom(dictp):
  19.     print 'name is '+dictp['name']+'age is '+dictp['age']
            parsedic(**dicp)            # call with arguments unpacked from a dict
            parsediccom(dicp)           # call with arguments unpacked from a dict 


程序的输出:

点击(此处)折叠或打开

  1. 1 2 3
  2. kin
  3. (4, 5, 6)
  4. {'add': 'shanghai', 'email': '@gmail.com'}
  5. sum result is 9
  6. None sum result is 25
  7. None name is kinage is 30
  8. name is kinage is 30
首先看第一个例子,这个函数的定义就是定义了一个复杂的参数定义,需要注意语法时:
*tuplep,**dicp
该变量一个是tuple,一个是dict,其目的实现变参(参数的个数不确定的情况)
一个是用来接收剩余的position argument ,一个是用来接收keyword argument
通过函数的调用,你就可以知道二者的作用

第二个例子与第三个例子则是说明了如何定义,并调用类似的函数,
通过定义可变长度参数函数,myadd,你可以以任意个那数参数对其进行调用,
同样通过定义你也可以使用字典来进行定义,并调用,不过你也开一使用普通方式,进行调用,二者的功能是相同的,
但是语法的形式,以及函数的灵活性不同,相比较而言,使用了*,**的可读性要差点,但是程序的灵活性变强。

总体上来说,python的函数功能还是很强大,知道这些对你阅读,编写程序是很有帮助的
同时,还是提醒自己啊,再好的书,也不如官方文档啊,威武!
这里还涉及到了list,tuple,dict的upack,
tt=(5,6)
x,y=tt
ref:

A call calls a callable object (e.g., a function) with a possibly empty series of arguments
call ::= primary "(" [argument_list [","]
            | expression genexpr_for] ")"
argument_list ::= positional_arguments ["," keyword_arguments]
                     ["," "*" expression]
                     ["," "**" expression]
| keyword_arguments ["," "*" expression]
                    ["," "**" expression]
| "*" expression ["," "**" expression]
| "**" expression
positional_arguments ::= expression ("," expression)*
keyword_arguments ::= keyword_item ("," keyword_item)*
keyword_item ::= identifier "=" expression
阅读(8376) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~