我们写东东的时候,往往有一些东西要频繁去复用,那么每个功能是10行代码,复用2次就是20行,这样看来我们的程序如果频繁利用某些代码的话,那么会是我们开发的东西越来越臃肿。那么好的方法有没有呢,那就是函数,函数可以把功能进行模块化,当大量复用的时候,可以有效的减少代码数量。

 

那么啥叫函数呢?打个土鳖的比方,比如我要从单位回老家的话,需要先坐地铁去火车站,然后乘坐XXx列火车回XX地,然后再打车回家。

  好的,那么我们可以把这个过程抽象成一个函数命名为"回老家",当我把这个过程讲述一遍以后,在今后我再提起回老家,就可以想到。要坐地铁去火车站,然后乘坐XXx列火车回XX地,然后再打车回家这样的一个过程。这就是一个函数。

  抽象成python代码的话可能是这样的:

  

def 回老家():
    坐地铁去火车站
    乘坐xxx列车
    打车回家

   好的,上面的def(define)是用来声明一个函数。函数主体就是一个过程。

  接下来我们实际编写一个函数:

def SayHello():
    print "hello world!"

 上面的函数,只要我们引用他,那么他就会打印hello world这句话,

 

接下来我们就要讲些如何给函数赋值变量了。不然他总执行一个动作,功能上未免有些单一。

函数的参数赋值,基本上分为3类。

第一类,直接引用参数(变量)

def SayHello(a,b,c):
   print "hello world %s %s %s" %(a,b,c)

1、使用方法:
SayHello("hello","world","!")#依次将"hello","world","!"赋值给a,b,c,缺陷是:如果用户给出的参数个数小于要求个数会报错。
2、使用方法:
SayHello(a="say",b="hello",c="world")#依次将"say","hello","world",赋值给a,b,c,好处是,可以一目了然的知晓赋值了哪些参数。

当然有些时候,我们限定了2个参数,如果用户少给了参数,那么程序会报错,但是用户手抖或者记错了,多写了参数一般情况都是不输出,那岂不是很不爽,是吧?

那好我们接下来看看怎么让用户多输入的参数也能够打印出来。

#-*- encoding:utf8 -*-
a="hello"
b="world"
def say2(a,b,*c):
    print "系统默认的参数%s %s" %(a,b)
    if c:
        print "其他参数",
        for i in c:
            print i,
say2(a,b,"other","canshu")

 这样输出出来:

系统默认的参数hello world
其他参数 other canshu

那好,我们来看看*c做了一个什么操作

#-*- encoding:utf8 -*-
a="hello"
b="world"
def say2(a,b,*c):
    print "系统默认的参数%s %s" %(a,b)
    if c:
        print "c is ",c
        print "其他参数",
        for i in c:
            print i,
say2(a,b,"other","canshu")


输出结果:
系统默认的参数hello world
c is  ('other', 'canshu')
其他参数 other canshu

好的,我们可以看到*c 就是把原来未定义的所有参数,都融合到一起,然后组成了一个列表(关于列表的使用这里就不赘述了)。

 

在看另一种情况,如果某些同学佯装高端,这么去写

#-*- encoding:utf8 -*-
a="hello"
b="world"
def say2(a,b,*c):
    print "系统默认的参数%s %s" %(a,b)
    if c:
        print "c is ",c
        print "其他参数",
        for i in c:
            print i,
say2(a="other",b="world",name="dab")

结果出错:

Traceback (most recent call last):
  File "F:\python\python\crossin\test_def.py", line 11, in <module>
    say2(a="other",b="world",name="dab")
TypeError: say2() got an unexpected keyword argument 'name'
告诉你类型错误,获取了一个意外的关键词选项。

这个错误是因为name="dab"无法转换为列表。那这种情况可以使用如下代码进行处理。

#-*- encoding:utf8 -*-
a="hello"
b="world"
def say2(a,b,**c):
    print "系统默认的参数%s %s" %(a,b)
    if c:
        print "c is ",c
        print "其他参数",
        for i in c:
            print i,
say2(a="other",b="world",name="dab")


结果:
系统默认的参数other world
c is  {'name': 'dab'}
其他参数 name

从上面的结果可以看到,**c是把多余的选项当作字典进行储存。

 

posted on 2013-10-29 17:28  Kairong  阅读(312)  评论(0编辑  收藏  举报