Chinaunix首页 | 论坛 | 博客
  • 博客访问: 417381
  • 博文数量: 72
  • 博客积分: 2541
  • 博客等级: 少校
  • 技术积分: 756
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-20 16:08
文章分类

全部博文(72)

文章存档

2013年(13)

2009年(1)

2008年(7)

2007年(45)

2006年(6)

我的朋友

分类: Python/Ruby

2013-06-20 11:01:51

一、函数的定义:使用def或者“函数定义”语句即可:

点击(此处)折叠或打开

  1. def hello(name):
  2.     return 'Hello, ' + name + '!'
  3. print hello('world')
    print hello('Gumby')
运行这段程序就会得到一个名为hello的新函数,它可以返回一个将输入的参数作为名字的问候语。运行结果如下:
    Hello, world!
    Hello, Gumby!

例:返回斐波那契数列列表的函数的定义:

点击(此处)折叠或打开

  1. def fibs(num):
  2.     result = [0,1]
  3.     for i in range(num-2):
  4.         result.append(result[-2] + result[-1])
  5.     return result

  6. print fibs(10)
  7. print fibs(15)

运行结果如下:
    [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
    [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]

二、函数参数:写在def语句中函数名后面的变量通常叫做函数的形式参数,而调用函数的时候提供的值是实际参数,或者称为参数;参数存储在局部作用域(local scope)内。
1、参数的改变:在函数内为参数赋予新值不会改变外部任何变量的值。

点击(此处)折叠或打开

  1. def try_to_change(n):
  2.     n = 'Mr. Gumby'

  3. name = 'Mrs Entity'
  4. try_to_change(name)
  5. print name
运行结果打印"Mrs Entity“。在try_to_change内,参数n获得了新值,但是它没有影响到name变量。n实际上是个完全不同的变量。为了验证,代码修改如下:

点击(此处)折叠或打开

  1. def try_to_change(n):
  2.     n = 'Mr. Gumby'
  3.     print n

  4. name = 'Mrs Entity'
  5. try_to_change(name)
  6. print name
在try_to_change函数加上一条打印n值的语句,运行结果如下,第一行是函数try_to_change打印本身参数的值,第二行是打印外部变量name的值:
    Mr. Gumby
    Mrs Entity

2、关键字参数:通常我们所使用的参数都叫做位置参数,因为它们的位置很重要——事实上比它们的名字更重要。因此python引入了使用参数名来提供参数,这类使用参数名提供参数就叫做关键字参数。
考虑下面的两个函数:

点击(此处)折叠或打开

  1. def hello_1(greeting,name):
  2.     print '%s, %s!' %(greeting,name)
  3.     
  4. def hello_2(name,greeting):
  5.     print '%s, %s!' %(name,greeting)
  6.     

  7. print hello_1('hello','world')
  8. print hello_2('hello','world')
运行结果:

点击(此处)折叠或打开

  1. hello, world
  2. None
  3. hello, world
  4. None
可以发现两个函数实现的是一样的功能,只是参数名字反过来了。也许你可能会发现,怎么多了2个None呢?请往下看并非真正函数的函数的解释。

有很多时候(尤其是多个参数的时候),参数的顺序是很难记住的。为了让事情简单些,可以提供参数的名字:

点击(此处)折叠或打开

  1. def hello_1(greeting,name):
  2.     print '%s, %s!' %(greeting,name)
  3.     
  4. def hello_2(name,greeting):
  5.     print '%s, %s!' %(name,greeting)
  6.     

  7. hello_1(greeting='hello',name='world')
  8. hello_1(name='world',greeting='hello')
运行结果如下,可以发现顺序完全没有影响了:

点击(此处)折叠或打开

  1. hello, world
  2. hello, world
但是需要注意的是,参数名和值一定要对应:

点击(此处)折叠或打开

  1. def hello_1(greeting,name):
  2.     print '%s, %s!' %(greeting,name)
  3.     
  4. def hello_2(name,greeting):
  5.     print '%s, %s!' %(name,greeting)
  6.     

  7. hello_2(greeting='hello',name='world')
这段代码运行将打印"world, hello",并非预期结果。

3、参数的默认值:前面提到了关键字参数的一些作用,但关键字参数最厉害的地方在于可以在函数中给参数提供默认值:

点击(此处)折叠或打开

  1. def hello_3(greeting='Hello',name='world'):
  2.     print '%s, %s!' %(greeting,name)
  3.     
  4. hello_3()
  5. hello_3('greeting')
  6. hello_3('greeting','universe')
当参数具有默认值的时候,调用的时候就可以不用提供参数了!上面代码运行结果如下:

点击(此处)折叠或打开

  1. Hello, world!
  2. greeting, world!
  3. greeting, universe!
如果只想提供name参数,而让greeting使用默认值该怎么办?

点击(此处)折叠或打开

  1. hello_3(name='Gumby')
4、并非真正函数的函数:数学意义上的函数,总在计算其参数后返回点什么。python的有些函数却并不返回任何东西。

点击(此处)折叠或打开

  1. def test():
  2.     print 'This is printed'
  3.     return
  4.     print 'This is not'

  5. x = test()
  6. print x
运行结果:

点击(此处)折叠或打开

  1. This is printed
  2. None
这里的return语句只起到结束函数的作用,第二个print语句被跳过了。return语句不返回任何值,那么x又引用什么呢?对,就是第二行的None。所以,所有的函数其实都返回了东西:当不需要它们返回值的时候,它们就返回None。
注:如果在if语句内返回值,那么要确保其他分支也有返回值,这样一来当调用者期待一个序列的时候,就不会意外的返回None。





 










 



 

阅读(3695) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~