7. 函数
吼吼吼,终于熬到函数了,什么是函数?就是把一坨代码放在一起,然后起个名字,通过这个名字来使用者坨代码,这就是函数。有没有一种心动的感觉?管你有没有,继续做笔记。
先来看看怎么定义函数,就行之前说的,把一坨代码放在一起,然后起个名字,不过还要在这个名字之前加上关键字def,在名字后面加上括号,在口号里加上参数列表,如果有参数的话,看例子:
#!/usr/bin/python
def sayHi():
print 'Hello!'
def greeting(name):
print 'Hello ', name, '!'
sayHi()
greeting('L')
显示:
Hello!
Hello L!
看到了怎么定义函数了吧,还看到了怎么调用函数了吧,调用方法就像我之前说的:通过这个名字来使用者坨代码。名字后面加上括号,有参数就加上参数。怎么如此简单呢?
不过,如果这两个函数要是能写成一个该多好啊,不都是用来打招呼的吗。那么,天灵灵地灵灵,实现我的愿望吧。好吧,我们的愿望其实已经被实现了。是时候该默认参数登场了。其实默认函数就是在参数后面加上一个等号和一个常量,当没有给这个变量赋值的时候就会使用这个常量。那么来实现我们的愿望吧:
#!/usr/bin/python
def sayHi(name = ''):
print 'Hello', name
sayHi()
sayHi('L')
显示:
Hello
Hello L
对于默认参数来说有一点非常重要,我们不能在已经使用了默认参数的参数后面的参数不使用默认参数。多么纠结的一句话啊,还是看例子吧:def fun(a, b = 3)是对的,def fun(a = 3, b)是错的。
在python中有些函数有好多参数,大部分都有默认值,有些我们并不需要传值,但是有些必须传值,尤其是当这个需要传的值是在不需要传的参数后面,这是我们就需要用到python中的另一个技巧——关键参数。指定参数并为其赋值,这便是关键参数。例子例子,别以为你逃得了:
#!/usr/bin/python
def fun(a, b = 3, c = 19):
print 'a is', a, 'b is', b, 'c is', c
fun(2, 5)
fun(c = 3, a = 23)
fun(3, c = 345)
显示:
a is 2 b is 5 c is 19
a is 23 b is 3 c is 3
a is 3 b is 3 c is 345
看到了吧,这就是关键参数,关键参数是可以不在乎顺序的,因为这是指定了参数的。
关于函数的参数,这些参数是独立于函数外的,即使与函数之外的变量名相同也无所谓,因此不要以为变量名相同在函数中使用的变量就是函数外使用的变量。如果你想要在函数内使用函数外的参数就必须使用global语句:
#!/usr/bin/python
def func(x):
print 'x is', x
x = 2
print 'Changed local x to', x
x = 50
func(x)
print 'x isstill', x
#!/usr/bin/python
def func():
global x
print 'x is', x
x = 2
print 'Changed local xto', x
x = 50
func()
print 'Value of x is', x
我觉得这不是什么好习惯,可以忽略了。
那么继续往下看吧,下面是函数的返回值。因为调用函数就是调用一段代码块,很有可能使用来处理数据,因此你也很有可能希望能够从函数获取数据,从函数获取的数据就是返回值。使用return语句即可得到返回值。
#!/usr/bin/python
defmaximum(a, b):
if x > y:
return x
else:
return y
printmaximum(2, 3)
显示:
3
不要以为函数只能返回一个值,那是在别的语言中,在python中是可以返回多个值的,只要用逗号分隔多个值就行了,也就是返回tuple。在接受返回值的时候给出对应的变量就行了。在看一个高级例子吧。
#!/usr/bin/python
li= [1, 2, 3, 4, 5]
forindex, value in enumerate(li):
print ‘indexis’,index , ‘value is’, value
显示:
index is 0 value is 1
index is 1 value is 2
index is 2 value is 3
index is 3 value is 4
index is 4 value is 5
enumerate是内建的函数,将一个序列作为参数,返回这个序列的下标和其对应的值。
Python有一个很奇妙的特性,称为 文档字符串,它通常被简称为 docstrings 。DocStrings是一个重要的工具,由于它帮助你的程序文档更加简单易懂,你应该尽量使用它。你甚至可以在程序运行的时候,从函数恢复文档字符串!
#!/usr/bin/python
# Filename:func_doc.py
def printMax(x, y):
'''Printsthe maximum of two numbers.
Thetwo values must be integers.'''
x= int(x) # convert to integers, if possible
y= int(y)
ifx > y:
printx, 'is maximum'
else:
printy, 'is maximum'
printMax(3, 5)
printprintMax.__doc__
显示:
5is maximum
Prints the maximum of two numbers.
The two values must beintegers.
在函数的第一个逻辑行的字符串是这个函数的 文档字符串 。注意,DocStrings也适用于模块和类,在之后的章节中会学习。
文档字符串的惯例是一个多行字符串,它的首行以大写字母开始,句号结尾。第二行是空行,从第三行开始是详细的描述。强烈建议 你在你的函数中使用文档字符串时遵循这个惯例。
你可以使用__doc__(注意双下划线)调用printMax函数的文档字符串属性(属于函数的名称)。请记住Python把每一样东西 都作为对象,包括这个函数。我们会在后面的类一章学习更多关于对象的知识。
如果你已经在Python中使用过help(),那么你已经看到过DocStings的使用了!它所做的只是抓取函数的__doc__属性,然后整洁地展示给你。你可以对上面这个函数尝试一下——只是在你的程序中包括help(printMax)。记住按q退出help。
自动化工具也可以以同样的方式从你的程序中提取文档。因此,我 强烈建议 你对你所写的任何正式函数编写文档字符串。