函数就是解决一个具体问题的方法,就像一个工厂,给他原料(参数),经过一系列的加工操作后,它给你产品(返回值)。可以说一个程序中绝大多数代码都是在写在函数中的,然后按需求互相调用。下面介绍下Python的中的函数。
函数的定义
def say_hi():
"""一个来自python的问候"""
print("Hi!")
say_hi()
这就是一个最简单的函数定义。def用来告诉python你准备定义一个函数了,紧跟在后面的SayHi是给函数取的名字,后面的小括号里是用来放参数的(这里不需要参数所以为空),最后的冒号是告诉编译器紧跟在后面的缩进一个tab或4个空格的代码都是属于这个函数的函数体。
函数传参
现在增加一个参数用以输出名字。
def say_hi(name):
"""一个来自python的问候"""
print("Hi " + name + "!")
say_hi("Owen")
增加一个参数后又引出了另一个问题,实参与形参。其中实参就是实际的参数,出现在函数调用时,在上面的代码中表现为调用 SayHi 函数时传入的字符串”Owen“。形参就是形式上的参数,出现在函数定义的小括号中,在上面的代码中表现为 def SayHi(name) 里的 name。
位置实参
位置实参的特点是调用时的位置必须一一对应,请看代码:
def user_info(name,age,sex):
print("name: " + name)
print("age:" + str(age))
print("sex:" + sex)
user_info(("Owen",20,"male")
user_info((20,"Owen","male") #出错
这个例子表现出了位置实参的特性,使用位置实参时Python会将传入的实参按形参定义的顺序依次赋值给形参,这就导致了第一次调用成功,第二次调用失败的情况。那如果想要随意按自己的顺序传递参数行不行呢?这也是可以的,这时候就用到了关键字实参。
关键字实参
关键字实参的特点是会将参数按照名字一一对应到相应名字的形参上,还是类似的代码:
def user_info(name,age,sex):
print("name: " + name)
print("age:" + str(age))
print("sex:" + sex)
user_info("Owen",20,"male")
user_info(age = 20,name = "Owen",sex = "male") #正确
只要在调用时告诉Python同学这个参数我是要传给谁的,那么Python就会去用名字找到相应的形参然后赋值,这样以来第二次调用也正确了。
忽然发现传入的sex参数大多数都是male,有没有办法偷个懒,不想每次都传一遍啊!
也有办法,可以使用默认参数。
默认参数
默认参数经常用在大多数情况会传入相同参数时,比如上面的代码就能改成:
def user_info(name,age,sex = "male"):
print("name: " + name)
print("age:" + str(age))
print("sex:" + sex)
user_info("Owen",20)
user_info(age = 20,name = "Owen")
在函数定义时赋予形参的值称为默认值,在调用函数时默认值参数是可传可不传的,如果传入的默认值参数则按照实际传入参数代入函数体运行,不传则以默认值代入函数体运行。
传递列表
有的时候需要传递的参数数量是不定的,可能多,可能少,这时候就可以将参数存到一个列表中然后传递给函数。
比如:
def show_names(names):
for name in names:
print(name)
names = ['Zhagnsan','Lisi','WangWu']
show_names(names)
这里需要注意的是如果直接传入列表本身,那么函数中如果有对列表的修改操作,那么这种修改会永久的改变列表。如果不想要函数中对列表的修改影响到列表在外部的使用,那么可以传入一个列表的副本,比如在上述代码中将ShowNames(names) 改为ShowNames(names[:])
传递字典
既然可以传递列表,那么推测很可能也可以传入字典。
def ShowUserInfo(UserInfo):
for key,value in UserInfo.items():
print(key + ":" + value)
UserInfo = {"Name":"ZhangSan","Age":"18","Sex":"male"}
ShowUserInfo(UserInfo)
程序正常运行,说明传入字典也OK
传递任意数量的实参
def show_names(*names):
print(names)
for name in names:
print(name)
show_names("ZhangSan","LiSi","WangWu")
结果输出:
(‘ZhangSan’, ‘LiSi’, ‘WangWu’)
ZhangSan
LiSi
WangWu
def show_info(**info):
print(info)
for key,value in info.items():
print(key + ":" + value)
show_info(Name='ZhangSan',Age="18",Sex="male")
结果输出:
{‘Name’: ‘ZhangSan’, ‘Age’: ‘18’, ‘Sex’: ‘male’}
Name:ZhangSan
Age:18
Sex:male
通过观察就能发现形参前面一个星号就是把多个实参打包成一个元组给形参,如果形参前面是两个星号则是把多个实参打包成一个字典传递给形参。
函数返回值
其实严格来讲在Python里每个函数都有返回值,如果函数体里没有return XXX这一类的语句,那么默认返回None。另外Python可以返回任何类型的数据,数字,字符串,列表,字典等等都可以。只要在想要返回的变量前加个return就好了。
def test():
pass
temp = test()
print(temp)
结果输出 None