python 函数
2016-05-11 09:17
423 查看
定义函数
编制函数的文档说明
函数有一个比较特别的机制:它允许你通过一种叫作文档字符串的东西来编制其文档说明。文档字符串是一段三重引号字符串。如果要使用文档字符串的话,必须将其写在函数的第一行。在IDLE中调用某个函数时,该函数的文档字符串就会以交互式文档的形式显示出来。
带参数和返回值
输出:
函数可以有多个返回值:只要把需要返回的值都列出来,并以逗号隔开即可。务必要确保有足够多的变量来捕获函数的返回值。如果数量不对的话,就会出错。
使用位置形参和实参
使用位置形参和实参的意思是说,参数是根据值的发送顺序来获取值得。第一个参数获取第一个值,第二个参数获取第二个值,依次类推。
使用位置形参和关键字实参
位置形参是根据顺序获取值得,关键字参数允许以任意顺序传递值,它们最大的好处就是清晰易懂。如果用了一个关键字实参,那么这个调用中
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中的多态
就像我们看到的那样,times函数中表达式x*y的意义完全取决于x和y的对象类型,同样的函数,在一个实例下执行的是乘法,在另一个实例下执行的却是赋值。Python将对某一对象在某种语法的合理性交友对象自身来判断。实际上,“*”在针对被处理的对象进行了随机应变。
这种依赖类型的行为称为多态,其含义就是一个操作的意义取决于被操作对象的类型。因为Python是动态类型语言,所以多态在Python中随处可见。实际上,在Python中每个操作都是多态的操作:print、index、*操作符,还有很多。
寻找序列的交集
对于intersect函数,这意味着第一个参数必须支持for循环,并且第二个参数支持成员测试。所有满足这两点的对象都能够正常工作,与它们的类型无关-这包括另外物理存储的序列,例如,字符串和列表。
默认参数
从上面的例子可以看出,默认参数可以简化函数的调用。设置默认参数时,注意:
一是必选参数在前,默认参数在后,否则Python解释器会报错。
二是如何设置默认参数
当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。
使用默认参数最大的好处就是能降低调用函数的难度。
我们写个一年级小学生注册的函数,需要传入name和gender两个参数:
如果要继续传入年龄、城市等信息怎么办?这样会使得调用函数的复杂度大大增加。
我们可以把年龄和城市设置为默认参数
这样,大多数学生注册时不需要提供年龄和城市,只提供必须的两个参数
enroll('yhk','M',7)
enroll('lym','M',city='Tianjin')
有多个默认参数时,调用的时候,既可以按顺序提供默认参数,比如调用enroll('yhk','M',7) ,意思是除了name, gender 这两个参数外,最后1个参数应用在参数age上,city参数由于没有提供,仍然使用默认值。
也可以不按顺序提供部分默认参数。当不按顺序提供部分默认参数时,需要把参数名写上。比如调用enroll('lym','M',city='Tianjin') ,意思是,city参数用传进去的值,其他默认参数继续使用默认值。
#定义函数 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参数用传进去的值,其他默认参数继续使用默认值。
相关文章推荐
- setup pip, PyMySQL,Jupyter in python 3.3
- python中的对象
- python中的协程(协同程序)
- Python 正则表达式
- 《Python核心编程》第6章 习题
- 科学计算工具-ipython
- python socket理论知识
- python解析XML之ElementTree
- python(一)读取外包txt文档,并创建数据
- Python3控制路由器――使用requests重启极路由.py
- Python3使用requests发闪存的方法
- Python匹配中文的正则表达式
- python数据持久存储:pickle
- 为什么在Python里推荐使用多进程而不是多线程?
- Python的GIL是什么鬼,多线程性能究竟如何
- spark分布式平台下python环境的搭建
- Jieba分词Python简单实现
- python设计模式(二)--策略模式(上)
- python设计模式(二)--策略模式(中)
- tornado总结5-登录与cookies