python中使⽤def保留字来进⾏函数定义_Python程序设计5
——函数
本章介绍Python中模块和函数的概念。
Python程序是由包、模块和函数三者组成,包是由⼀系列模块组成的集合,模块是处理某⼀类问题的函数和类的集合。Python提供的许多⼯具包和模块安装在Python的安装⽬录下的lib⼦⽬录中。例如,在Python安装⽬录下lib⽬录下,有⼀个sqlite3⽂件夹,该⽂件夹就是⼀个包,这个包⽤于完成连接sqlite3数据库的基本操作。在sqlite3⽂件夹下有⼀个test的⼦包,还有⼀个_init_.py⽂件,该⽂件是sqlite3包的注册⽂件,如果没有该⽂件,Python将不能识别sqlite3包。包必须⾄少包含⼀个_init_.py⽂件,该⽂件的内容可以为空。_init_.py⽤于标识当前⽂件夹是⼀个包。
1 函数
对于⼀个函数来说,包括三个⽅⾯,函数的定义、函数的调⽤和函数的执⾏,函数的定义使⽤def来定义⼀个函数,光有函数的定义是不⾏的,函数还必须得到有效的调⽤,否则这个函数是没有⽤的,调⽤函数后,系统就会⼀条条执⾏函数的语句。
1.1 函数的定义
函数定义⾮常简单,使⽤保留字def声明即可,在定义函数时候需要定义返回值类型.语法如下:
deffunction_name(参数列表):
statement
[return value]
例如:
defhello():print 'Hello World'
python允许返回多个参数,但是本质上还是只有⼀个参数,只是将这些参数进⾏了打包,以元组、列表形式返回。
其中,返回值不少必须的,如果没有return语句,则Python默认返回值为None。注意函数列表后⾯有⼀个冒号,和循环语句⼀样。
下⾯定义⼀个函数
deflogin(username, password):if(username == 'admin') and (password == 'admin'):print 'login succee
d'
else:print 'login failed'username= raw_input('Please enter your name:')
password= raw_input('Please enter your password:')
login(username, password)
1.2 函数形参与默认参数值
参数的传递有两种⽅式:值传递和引⽤传递。⽆论是实际参数还是形式参数在函数定义的圆括号内指定,⽤逗号隔开,当调⽤函数的时候,也需要⽤同样的⽅式提供值。形参是函数定义时候,在函数签名⾥⾯的,调⽤时候赋予函数调⽤时的值叫实参。Python通过名字绑定机制,把实际参数的值和形式参数的值绑定在⼀起,即把形式参数传递到函数所在的局部命名空间中,形式参数和实际参数指向内存中的同⼀个存储空间。
1.默认参数值
函数的参数⽀持默认值。当某个参数没有传递实际值时,函数将使⽤默认参数计算,例如可以向login()函数的username参数和password 参数分别提供⼀个默认值。
def login(username = 'aq', password = 'aq'):if(username == 'admin') and (password == 'admin'):print 'login succeed'
else:print 'login failed'
#提供⼏个参数
login('admin', 'admin')
login('admin')
login(password= 'admin')
login()
运⾏结果:
login succeed
login failed
login failed
login failed
分析:第⼀次调⽤时候,分别提供了两个实际参数,这两个参数会覆盖掉定义函数时候提供的默认值。也就是username和password的值均为admin,因此符合条件,可以通过。第⼆次调⽤时候只提供了⼀个参数,这个参数会被当作提供给第⼀个形参,也就是username值为admin,⽽password依然采⽤默认值,也就是aq,因此不通过。第三次调⽤时候提供了password的实参,但username依然采⽤默认的,所以不通过。第四次调⽤没有提供参数,所以都采⽤默认值,因此也不会通过。
2.列表作形参
参数可以是变量,也可以是元组、列表等内置数据结构,例如:
def login(usernames = [], password = "admin"):
username=usernames[0]if(username == 'admin') and (password == 'admin'):print 'Login success'
else:print 'Login failed'login(['admin', 'aq'])
输出结果:Login success
3.可变长度参数值
在程序开发中,常常需要传递可变长度的参数。在函数的参数前使⽤标识符*,可以实现这个要求,*可以引⽤元组,将多个参数组合在⼀个元组中。
def login(*userpwds):
username=userpwds[0]
password= userpwds[1]if(username == 'admin') and (password == 'admin'):print 'Login success'
else:print 'Login failed'login('admin','admin')
运⾏结果:Login success
在该函数中,⽤*标识符定义了可变长度的参数userpwds,通过它可以引⽤⼀个元组,并索引参数进⾏赋值。
4.字典作形参
Python还提供了另⼀个标识符**,在形式参数前⾯加上**,可以引⽤⼀个字典作为参数。下⾯这段代码实现了在⼀个字典中匹配元组的元素。
#传递字典类型的参数
def login(**userpwds):
keys=userpwds.keys()
username= ''password= ''
for key inuserpwds:if 'username' ==key:
username=userpwds[key]if 'password' ==key:
password=userpwds[key]if(username == 'admin') and (password == 'admin'):print 'Login success'
else:print 'Login failed'login(username= 'admin',password = 'admin')
View Code
在该段代码中,定义了login函数的参数为字典类型,形参是**userpwds与实际参数username='admin'、password='admin'对应,⽣成⼀个结构为{username:'admin',password:'admin'}的字典。
注意:如果函数的参数类型既有元组(形式参数前加*),⼜有字典(形式参数前加**),那么*必须写在**的前⾯,也就是元组形参必须在字典形参前⾯。
使⽤实例:
下⾯这个程序实现了对⽤户名称检验、是否是数字以及号码位数进⾏校验。
def registerUser(username = 'py', idcard = 'python', tel = '123'):
userName= raw_input('Please input username:')#check length of username
if(len(userName) > 3 and len(userName) < 20):
idcard= raw_input('Please input your account:')if(idcard.isdigit()):
tel= raw_input('Please input your telephone number:')if(tel.isdigit() and (7 < len(tel) < 20)):print 'congratulations!regeister success!'
else:print 'Tel format is wrong!'
else:print 'Account format is wrong!'
else:print 'length of username shoud be between 3 and 20'
printuserName,idcard,tel
registerUser()
输出结果:
Please input username: erseresd
Please input your account:23234234234Please input your telephone number:22432432congratulations!regeister success!
erseresd23234234234 22432432
import语句View Code
1.3 函数的调⽤
python进⾏函数调⽤时候传递参数两种形式,⼀种是标准调⽤,这种调⽤⽅式和其他语⾔⽐如C、Java没有什么区别,⼀种是python特有的关键字赋值⽅式。
假定现在有⼀个函数
defhello():print 'Hello World'
进⾏调⽤的时候,⼀种是标准的,⽐如:
net_conn('','8080')
另⼀种就是关键字赋值
net_conn(host = '',port = 8080)
1.4 函数的返回值
使⽤return语句来返回需要的值。
deflogin(username,password):
msg= ''
if(username == 'admin') and (password == 'admin'):
msg= 'Login Successfully'
else:
msg= 'Login Failed'
returnmsgprint login('admin','admin')
输出结果:Login Successfully
上⾯使⽤了print函数将返回值输出,如果只使⽤return语句返回,系统将不会输出。
如果需要返回多个值,可以将需要返回的值全部打包到元组中,调⽤时,对返回的元组解包即可。
defoperat(x,y,z):
x= x + 5y= y + 5z= z + 5oper=[x,y,z]
numbers=tuple(oper)returnnumbers
x,y,z= operat(1,2,3)printx,y,z
输出结果:6,7,8
2 模块
Python程序由⼀个个模块组成,⼀个Python⽂件就是⼀个模块。
2.1 模块的创建
模块是把⼀组相关的函数或代码组织到⼀个⽂件中,即⼀个⽂件就是⼀个模块。模块由代码、类和函数组成,其中类和函数可以有0个或多个。例如创建⼀个myFirstModule.py⽂件,即定义了⼀个名称未myFirstModule的模块,在该模块中定义两个函数和⼀个类,并在该类中定义⼀个⽅法。
在编辑Python程序时,当使⽤import关键字导⼊⼀个模块时,系统⾸先会查当前路径,然后查lib⽬录、site-packages⽬录和环境变量PYTHON PATH设置的⽬录。
实例应⽤:
第⼀个模块
'''Created on 2013-8-5
@author: Landau'''
classPerson:defaddPer(self):
userName= raw_input('Please enter your name:')printuserNameif userName != '':print 'person add success'
else:print 'person add failed'
View Code
另⼀个模块:
'''Created on 2013-8-5
@author: Landau'''
importaddPerson
person=addPerson.Person()
person.addPer()
运⾏测试:
Please enter your name:ew
ew
person add success
2.2 模块的导⼊
如前所述,模块的导⼊需要使⽤import语句,模块导⼊的格式如下:
import 模块名
也可以直接导⼊所需要的函数名
import 模块名.函数名
这种⽅式⽐较⿇烦,每次调⽤模块中的函数或类时,都需要使⽤模块名作为前缀来调⽤。为了解决这个问题,Python提供了import 语句可以讲模块中的类或函数导⼊,从⽽不需要使⽤模块名作为前缀。语法如下
from 模块名 import 函数名或者from 模块名 import *
2.3 模块属性
模块有⼀些内置的属性,⽤于完成特定的任务。
python中每个模块都有⼀些特定的属性,⽤于完成某项任务。下⾯介绍最常⽤的两个模块属性:_name_和_doc_
1.__name__属性
__name__属性⽤于判断当前模块是不是程序的⼊⼝,如果当前程序正在被使⽤,__name__的值为__main__。在编写程序时候,通常需要给每个模块添加条件语句,⽤于单独测试该模块的功能,例如创建⼀个模块myThirdModule
if __name__ == '__main__':print 'myThirdModule is main module'
else:print 'myThirdModule is called by another module'运⾏结果:myThirdModuleis main module
注意:__name__的name两边各有两个下划线,不是_name_
2.__doc__属性
Python中的模块是⼀个对象,每个对象都有__doc__属性,该属性⽤于描述该对象的作⽤,下⾯创建另⼀个模块call_myThirdModule,这个模块很简单,只需要导⼊myThirdModule
'''Created on 2013-8-5
@author: Landau'''
importphone_numberprint __doc__运⾏结果:
myThirdModuleiscalled by another module
Created on2013-8-5@author: Landau
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论