一、函数的定义:使用def或者“函数定义”语句即可:
-
def hello(name):
-
return 'Hello, ' + name + '!'
-
print hello('world')
print hello('Gumby')
运行这段程序就会得到一个名为hello的新函数,它可以返回一个将输入的参数作为名字的问候语。运行结果如下:
Hello, world!
Hello, Gumby!
例:返回斐波那契数列列表的函数的定义:
-
def fibs(num):
-
result = [0,1]
-
for i in range(num-2):
-
result.append(result[-2] + result[-1])
-
return result
-
-
print fibs(10)
-
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、参数的改变:在函数内为参数赋予新值不会改变外部任何变量的值。
-
def try_to_change(n):
-
n = 'Mr. Gumby'
-
-
name = 'Mrs Entity'
-
try_to_change(name)
-
print name
运行结果打印"Mrs Entity“。在try_to_change内,参数n获得了新值,但是它没有影响到name变量。n实际上是个完全不同的变量。为了验证,代码修改如下:
-
def try_to_change(n):
-
n = 'Mr. Gumby'
-
print n
-
-
name = 'Mrs Entity'
-
try_to_change(name)
-
print name
在try_to_change函数加上一条打印n值的语句,运行结果如下,第一行是函数try_to_change打印本身参数的值,第二行是打印外部变量name的值:
Mr. Gumby
Mrs Entity
2、关键字参数:通常我们所使用的参数都叫做位置参数,因为它们的位置很重要——事实上比它们的名字更重要。因此python引入了使用参数名来提供参数,这类使用参数名提供参数就叫做关键字参数。
考虑下面的两个函数:
-
def hello_1(greeting,name):
-
print '%s, %s!' %(greeting,name)
-
-
def hello_2(name,greeting):
-
print '%s, %s!' %(name,greeting)
-
-
-
print hello_1('hello','world')
-
print hello_2('hello','world')
运行结果:
-
hello, world
-
None
-
hello, world
-
None
可以发现两个函数实现的是一样的功能,只是参数名字反过来了。也许你可能会发现,怎么多了2个None呢?请往下看并非真正函数的函数的解释。
有很多时候(尤其是多个参数的时候),参数的顺序是很难记住的。为了让事情简单些,可以提供参数的名字:
-
def hello_1(greeting,name):
-
print '%s, %s!' %(greeting,name)
-
-
def hello_2(name,greeting):
-
print '%s, %s!' %(name,greeting)
-
-
-
hello_1(greeting='hello',name='world')
-
hello_1(name='world',greeting='hello')
运行结果如下,可以发现顺序完全没有影响了:
-
hello, world
-
hello, world
但是需要注意的是,参数名和值一定要对应:
-
def hello_1(greeting,name):
-
print '%s, %s!' %(greeting,name)
-
-
def hello_2(name,greeting):
-
print '%s, %s!' %(name,greeting)
-
-
-
hello_2(greeting='hello',name='world')
这段代码运行将打印"world, hello",并非预期结果。
3、参数的默认值:前面提到了关键字参数的一些作用,但关键字参数最厉害的地方在于可以在函数中给参数提供默认值:
-
def hello_3(greeting='Hello',name='world'):
-
print '%s, %s!' %(greeting,name)
-
-
hello_3()
-
hello_3('greeting')
-
hello_3('greeting','universe')
当参数具有默认值的时候,调用的时候就可以不用提供参数了!上面代码运行结果如下:
-
Hello, world!
-
greeting, world!
-
greeting, universe!
如果只想提供name参数,而让greeting使用默认值该怎么办?
4、并非真正函数的函数:数学意义上的函数,总在计算其参数后返回点什么。python的有些函数却并不返回任何东西。
-
def test():
-
print 'This is printed'
-
return
-
print 'This is not'
-
-
x = test()
-
print x
运行结果:
这里的return语句只起到结束函数的作用,第二个print语句被跳过了。return语句不返回任何值,那么x又引用什么呢?对,就是第二行的None。所以,所有的函数其实都返回了东西:当不需要它们返回值的时候,它们就返回None。
注:如果在if语句内返回值,那么要确保其他分支也有返回值,这样一来当调用者期待一个序列的时候,就不会意外的返回None。
阅读(3702) | 评论(0) | 转发(1) |