您的位置:首页 > 编程语言 > Python开发

python 函数

2016-05-11 09:17 423 查看
定义函数

#定义函数
def instructions():
"""Display game instructions."""
print("game instruction")
#主程序
instructions()</span>
输出:



编制函数的文档说明

函数有一个比较特别的机制:它允许你通过一种叫作文档字符串的东西来编制其文档说明。文档字符串是一段三重引号字符串。如果要使用文档字符串的话,必须将其写在函数的第一行。在IDLE中调用某个函数时,该函数的文档字符串就会以交互式文档的形式显示出来。



带参数和返回值

def ask_yes_no(question):
"""Ask a yes or no question."""
response=None
while response not in ("y","n"):
response=input(question).lower()
return response
#程序主体
answer=ask_yes_no("\nPlease enter 'y' or 'n': ")
print("Thanks for entering:",answer)</span>


输出:



函数可以有多个返回值:只要把需要返回的值都列出来,并以逗号隔开即可。务必要确保有足够多的变量来捕获函数的返回值。如果数量不对的话,就会出错。

使用位置形参和实参

使用位置形参和实参的意思是说,参数是根据值的发送顺序来获取值得。第一个参数获取第一个值,第二个参数获取第二个值,依次类推。

使用位置形参和关键字实参

位置形参是根据顺序获取值得,关键字参数允许以任意顺序传递值,它们最大的好处就是清晰易懂。如果用了一个关键字实参,那么这个调用中

def是可执行的代码。Python的函数是由一个新的语句编写的,即def。不像C这样的编译语言,def是一个可执行的语句-函数并不存在,直到Python运行了def后才存在。在典型的操作中,def语句在模块文件中编写,并自然而然地在模块文件第一次被导入的时候生成定义的函数。

 

def 创建了一个对象并将其赋值给某一变量名。当Python运行到def语句时,它将会生成一个新的函数对象并将其赋值给这个函数名。就像所有的赋值一样,函数名变成了某一个函数的引用。函数名其实并没有什么神奇—函数对象可以赋值给其它的变量名,保存在列表之中。函数也可以通过lamada表达式来创建。

 

def <name> (arg1, arg2, … argN):

         <statements>

就像所有的多行Python语句一样,def包含了首行并有一个代码块跟随在后边,这个代码块通常都会缩进(或者就是在冒号后边简单的一句)。

 

def语句是实时执行的

Python的def语句实际上是一个可执行的语句:当它运行的时候,它创建一个新的函数对象并将其赋值给一个变量名。(请记住,Python中所有的语句都是实时运行的,没有像独立的编译时间这样的流程)因为它是一个语句,一个def可以出现在任一语句可以出现的地方-甚至是嵌套在其他的语句中。

与C这样的编译语言不同,Python函数在程序运行之前并不需要全部定义。更确切地讲,def在运行时才进行评估,而在def之中的代码在函数调用后才会评估。

 

因为函数定义是实时发生的,所以对于函数名来说并没有什么特别之处。关键之处在于函数名所引用的那个对象。

othername=func

othername()

这里,将函数赋值给一个不同的变量名,并通过新的变量名进行了调用。就像Python中其他语句一样,函数仅仅是对象,在程序执行时它清楚地记录在了内存之中。实际上,除了调用以外,函数允许任意的属性附加到记录信息以供随后使用:

def func():

func()

func.attr=value

Python中的多态

#encoding=utf-8
def times(x,y):
return x*y
print(times(2,3))
print(times("Ni",4))



就像我们看到的那样,times函数中表达式x*y的意义完全取决于x和y的对象类型,同样的函数,在一个实例下执行的是乘法,在另一个实例下执行的却是赋值。Python将对某一对象在某种语法的合理性交友对象自身来判断。实际上,“*”在针对被处理的对象进行了随机应变。

这种依赖类型的行为称为多态,其含义就是一个操作的意义取决于被操作对象的类型。因为Python是动态类型语言,所以多态在Python中随处可见。实际上,在Python中每个操作都是多态的操作:print、index、*操作符,还有很多。

寻找序列的交集

#encoding=utf-8
def intersect(seq1, seq2):
res=[]
for x in seq1:
if x in seq2:
res.append(x)
return res
s1="SPAM"
s2="SCAM"
print(intersect(s1,s2))
print(intersect([1,2,3],(1,4)))





对于intersect函数,这意味着第一个参数必须支持for循环,并且第二个参数支持成员测试。所有满足这两点的对象都能够正常工作,与它们的类型无关-这包括另外物理存储的序列,例如,字符串和列表。

默认参数

#!/usr/bin/env python
# coding=utf-8

def power(x,n=2):
s=1
while n>0:
n=n-1
s=s*x
return s

print power(5)
print power(5,2)




从上面的例子可以看出,默认参数可以简化函数的调用。设置默认参数时,注意:

一是必选参数在前,默认参数在后,否则Python解释器会报错。

二是如何设置默认参数

当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。

使用默认参数最大的好处就是能降低调用函数的难度。

我们写个一年级小学生注册的函数,需要传入name和gender两个参数:

#!/usr/bin/env python
# coding=utf-8

def enroll(name,gender):
print 'name:', name
print 'gender:', gender

enroll('Tom','F')




如果要继续传入年龄、城市等信息怎么办?这样会使得调用函数的复杂度大大增加。

我们可以把年龄和城市设置为默认参数

#!/usr/bin/env python
# coding=utf-8

def enroll(name,gender,age=5, city='Beijing'):
print 'name:', name
print 'gender:', gender
print 'age:', age
print 'city:', city

enroll('Tom','F')




这样,大多数学生注册时不需要提供年龄和城市,只提供必须的两个参数

enroll('yhk','M',7)
enroll('lym','M',city='Tianjin')



有多个默认参数时,调用的时候,既可以按顺序提供默认参数,比如调用enroll('yhk','M',7) ,意思是除了name, gender 这两个参数外,最后1个参数应用在参数age上,city参数由于没有提供,仍然使用默认值。

也可以不按顺序提供部分默认参数。当不按顺序提供部分默认参数时,需要把参数名写上。比如调用enroll('lym','M',city='Tianjin') ,意思是,city参数用传进去的值,其他默认参数继续使用默认值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: