初始python(四) 函数的定义

来源:互联网 发布:淘宝优惠券图片头像 编辑:程序博客网 时间:2024/06/04 04:17

回顾

然而貌似就只是学了学循环而已,所以就算了吧。。。
不过我发现了一个有趣的东西,如果你在终端输入

import this

就会弹出一段小诗
内容如下:

Beautiful is better than ugly.
优美胜于丑陋
Explicit is better than implicit.
明了胜于晦涩
Simple is better than complex.
简单胜过复杂
Complex is better than complicated.
复杂胜过凌乱
Flat is better than nested.      
扁平胜于嵌套
Sparse is better than dense.     
间隔胜于紧凑
Readability counts.          
可读性很重要
Special cases aren’t special enough to break the rules.
即使假借特例的实用性之名,也不违背这些规则
Although practicality beats purity.   
虽然实用性次于纯度
Errors should never pass silently.   
错误不应该被无声的忽略
Unless explicitly silenced.       
除非明确的沉默       
In the face of ambiguity, refuse the temptation to guess.
当存在多种可能时,不要尝试去猜测
There should be one– and preferably only one –obvious way to do it.
应该有一个,最好只有一个,明显能做到这一点
Although that way may not be obvious at first unless you’re Dutch.
虽然这种 方式可能不容易,除非你是python之父
Now is better than never.
现在做总比不做好
Although never is often better than right now.
虽然过去从未比现在好
If the implementation is hard to explain, it’s a bad idea.
如果这个实现不容易解释,那么它肯定是坏主意
If the implementation is easy to explain, it may be a good idea.
如果这个实现容易解释,那么它很可能是个好主意
Namespaces are one honking great idea – let’s do more of those!
命名空间是一种绝妙的理念,应当多加利用

关于这段圣经般的描述,我这里也不做过多解释了,随着编程经验的丰富,理解也会越来越深刻。此刻,你只需默默的读一遍,然后放到自己的收藏夹里。
下面我们开始正文

函数定义

函数通过def关键字定义。def关键字后跟一个函数的 标识符 名称,然后跟一对圆括号。圆括号之中可以包括一些变量名,该行以冒号结尾。接下来是一块语句,它们是函数体。下面是一个简单的示例:

def hellowWorld():    print "hello world"helloWorld()    

函数形参

从黑盒的角度看函数,盒子有两个管道,一个是输入,一个是输出,盒子内部是函数体。输出是返回值,输入就是函数的参数。
参数在函数定义的圆括号对内指定,用逗号分割。当我们调用函数的时候,我们以同样的方式提供值。注意我们使用过的术语——函数中的参数名称为 形参 而你提供给函数调用的值称为 实参 。
看下面的示例:

def printMax(a, b):    if a > b:        print a, 'is maximum'    else:        print b, 'is maximum'printMax(3, 4) x = 5y = 7printMax(x, y)

局部变量

当你在函数定义内声明变量的时候,它们与函数外具有相同名称的其他变量没有任何关系,即变量名称对于函数来说是 局部 的。这称为变量的 作用域 。所有变量的作用域是它们被定义的块,从它们的名称被定义的那点开始。
例如:

def func(x):    print 'x is', x    x = 2    print 'Changed local x to', xx = 50func(x)print 'x is still', x

在上面这段代码中,首先函数定义了形参x,相当于函数的局部变量。在函数调用的时候,传入了外部x,外部x值为50。在函数内部将x值改为2,改变的是局部变量x,外部x不受影响,从最后的输出结果可以验证。
如果你想要为一个定义在函数外的变量赋值,那么你就得告诉Python这个变量名不是局部的,而是 全局 的。我们使用global语句完成这一功能。没有global语句,是不可能为定义在函数外的变量赋值的。
例如:

def func():    global x    print 'x is', x    x = 2    print 'Changed local x to', xx = 50func()print 'Value of x is', x

global语句被用来声明x是全局的——因此,当我们在函数内把值赋给x的时候,这个变化也反映在我们在主块中使用x的值的时候。

默认参数值

这真的比较神奇,也就是说,你可以在函数形参定义的时候就给它赋值
对于一些函数,你可能希望它的一些参数是 可选 的,如果用户不想要为这些参数提供值的话,这些参数就使用默认值。这个功能借助于默认参数值完成。你可以在函数定义的形参名后加上赋值运算符(=)和默认值,从而给形参指定默认参数值。
如:

def say(message, times = 1):    print message * timessay('Hello')say('World', 5)

名为say的函数用来打印一个字符串任意所需的次数。如果我们不提供一个值,那么默认地,字符串将只被打印一遍。我们通过给形参times指定默认参数值1来实现这一功能。

在第一次使用say的时候,我们只提供一个字符串,函数只打印一次字符串。在第二次使用say的时候,我们提供了字符串和参数5,表明我们想要打印这个字符串消息5遍。
只有在形参表末尾的那些参数可以有默认参数值,即你不能在声明函数形参的时候,先声明有默认值的形参而后声明没有默认值的形参。

关键字传参

如果你的某个函数有许多参数,而你只想指定其中的一部分,那么你可以通过命名来为这些参数赋值——这被称作 关键参数 ——我们使用名字(关键字)而不是位置(我们前面所一直使用的方法)来给函数指定实参。
这样做有两个优势:
一、由于我们不必担心参数的顺序,使用函数变得更加简单了。
二、假设其他参数都有默认值,我们可以只给我们想要的那些参数赋值。
例如:

def func(a, b=5, c=10):    print 'a is', a, 'and b is', b, 'and c is', cfunc(3, 7)func(25, c=24)func(c=50, a=100)

在上面的代码中,名为func的函数有一个没有默认值的参数,和两个有默认值的参数。在第一次使用函数的时候, func(3, 7),参数a得到值3,参数b得到值7,而参数c使用默认值10。在第二次使用函数func(25, c=24)的时候,根据实参的位置变量a得到值25。根据命名,即关键参数,参数c得到值24。变量b根据默认值,为5。在第三次使用func(c=50, a=100)的时候,我们使用关键参数来完全指定参数值。注意,尽管函数定义中,a在c之前定义,我们仍然可以在a之前指定参数c的值。

return

于c++语法无异,在此就不赘述

DocStrings

Python有一个很奇妙的特性,称为 文档字符串 ,它通常被简称为 docstrings 。DocStrings是一个重要的工具,由于它帮助你的程序文档更加简单易懂,你应该尽量使用它。
先看下面的例子,之后在做解释:

def printMax(x, y):    '''Prints the maximum of two numbers.    The two values must be integers.'''    x = int(x) # convert to integers, if possible    y = int(y)    if x > y:        print x, 'is maximum'    else:        print y, 'is maximum'printMax(3, 5)print printMax.__doc__

在上面的代码中,在函数的第一个逻辑行的字符串是这个函数的文档字符串 。文档字符串的惯例是一个多行字符串,它的首行以大写字母开始,句号结尾。第二行是空行,从第三行开始是详细的描述。 强烈建议你在你的函数中使用文档字符串时遵循这个惯例。你可以使用doc(注意双下划线)调用printMax函数的文档字符串属性(属于函数的名称)。请记住Python把 每一样东西 都作为对象,包括这个函数。
如果你已经在Python中使用过help(),那么你已经看到过DocStings的使用了!它所做的只是抓取函数的doc属性,然后整洁地展示给你。
自动化工具也可以以同样的方式从你的程序中提取文档。因此,我强烈建议 你对你所写的任何正式函数编写文档字符串。

0 0
原创粉丝点击