当一个程序需要多次执行时,我们不需要反复重写程序,只需要将该程序封装成函数即可。
定义函数
例:定义一个打印问候的函数
def get_hello():#定义函数使用def + 函数名+ 所需的参数+:
print('hello')
get_hello()#d调用
通过以上代码我们可知,使用关键字 def 定义函数,然后定义函数的函数名为get_hello,后面跟着(),括号中还可以添加参数(如果不需要参数,括号内可以为空),最后以:结尾。
调用函数,我们需要使用函数名+()+所需的参数进行调用,此时函数打印hello
向函数中添加参数
我们只需要做一些修改,就可以使用函数不仅仅打印hello。
例:我们向函数添加一个用户名参数,这时调用函数,可以打印向谁问候的内容
def get_hello(username ):
print('hello'+" " + username +'!')
get_hello('张三')
实参和形参
上面事例中,我们定义函数时,要求给usename指定一个值,函数才能调用。这个username是一个形参。而我们调用函数get_hello中"张三"是实参,这个实参在调用时被存储到形参username中。
注意:有时候大家可能会形参,实参不分,所以还是多注意
传递实参
函数中可能会包含多个实参,因此调用函数中也可能包含多个实参。这时我们可以使用位置实参,这要求实参的顺序与形参的顺序一致,也可以使用关键字实参,其中每个实参都是由变量名和值组成。
位置实参
调用函数时,我们需要将实参全部关联到函数中定义的形参中,最简单的关联方式是按照实参的顺序。
例:根据函数的形参位置顺序,我们传递实参进行关联
def get_hello(name,age):
print(name + age +"欢迎你")
get_hello('张三','12')
多次调用函数
我们定义后的函数,可以多次调用,我们只需要传递不同的值,函数就可以打印结果
例:
def get_hello(name,age):
print(name + age +"欢迎你")
get_hello('张三','12')
get_hello('李四','15')
注意:位置实参的顺序很重要,如果将顺序输入错误,结果会出乎意料
例:
def get_hello(name,age):
print(name + age +"欢迎你")
get_hello('12','赵六')#将年龄和姓名位置放错,打印出的结果也是错的
关键字实参
关键字实参是传递给函数关键字名称和值。直接可以在实参中将名称和值关联。因此不用考虑实参的顺序。
例:
def get_hello(name,age):
print(name + age +"欢迎你")
get_hello(age='12',name='王五')
注意:使用关键字实参时,务必准确的指定函数定义中的形参名
默认值
编写函数时,可以给每个形参指定默认值。如果函数调用时,指定了实参则使用新的指定实参,未指定实参则使用默认值。
例:
def get_hello(age,name='张三'):
print(name + age +"欢迎你")
get_hello('12')
get_hello('12','赵')#有默认值得参数需要放在最后
get_hello('赵','12')#如果位置放错了,打印结果也是错的
注意:使用默认值时,在形参列表中必须先列出没有默认值的形参,再列出有默认值的参数。这样python依然能够正确地解读位置参数。
返回值
函数并非总是直接显示输出,相反,函数可以处理一些数据,并返回一个或一组值。这个函数返的值被称为返回值。在函数中,return语句将值返回调用函数的代码行。
例:
def sum(num1,num2):#定义一个求和函数
num3 = num1+num2#结果存储到num3中
return num3#返回求取的值
a= sum(1,2)#调用函数将返回结果存储到a中
print(a)
注意:又返回值得函数需要用变量接收返回值
有时候需要将实参变为可选参数,这样使用函数的人可以提供额外的信息。
例:我们定义了一个函数,可以接收开始名称,结束名称,中间名称,我们将中间名称设置为默认名称,如果需要赋新的实参,在调用函数时给出新实参。有默认实参的形参放在最后。
def get_hello(first_name,last_name,middle_name=''):#
print(first_name+ last_name+ middle_name +'欢迎你')
get_hello('张','三')#没有赋值新的实参的情况下,默认形参为空
get_hello('张','三','老') #有赋值新的实参的情况下,打印为新的实参
返回字典
函数可以返回任何类型的值,包括列表和字典等较为复杂的数据结构。
例:
def build_name(first_name,last_name):
name = {'first_name':first_name,'last_name':last_name}
return name
a = build_name('张','三')
print(a)
使用函数和while循环结合
例:我们创建一个函数,函数将返回完整的姓名,再使用while循环进行问候
def build_name(first_name,last_name):
name = first_name + last_name
return name.title()
while True:
first_name =input('first_name')
last_name =input('last_name')
name1 = build_name(first_name,last_name)
print(name1 +'欢迎')
传递列表
向函数传递列表很有用,列表可以包含名字,数字或者更加复杂的对象(如:字典)
例:假设有一个用户列表,我们要问候其中的每一位用户。
users = ['george','lili','jack']
def get_hello(name):
for iin name:
print(i +'你好')
get_hello(users)
在函数中修改列表
将列表传递给函数后,函数就可以对其进行修改。在函数中对这个列表进行的修改就是永久的。
例:有一英雄池列表, 移动到另一个我的英雄池列表中,然后打印出我的英雄池
heros = ['亚瑟','安琪拉','李白']
my_heros = []
while heros:
hero = heros.pop()
my_heros.append(hero)
print(my_heros)
for iin my_heros:
print(i)
改为函数:创建两个函数,一个函数用来转换新列表,一个函数用来打印英雄
def zhuan_hero(heros,my_heros):
while heros:
hero = heros.pop()
my_heros.append(hero)
def print_hero(my_heros):
print(my_heros)
for iin my_heros:
print(i)
heros = ['亚瑟','安琪拉','李白']
my_heros = []
zhuan_hero(heros,my_heros)
print_hero(my_heros)
禁止函数修改列表
如果我们不希望函数改变原始的列表内容。我能可以使用切片进行操作,因为切片会将列表创建一个副本进行操作
例:
def zhuan_hero(heros,my_heros):
while heros:
hero = heros.pop()
my_heros.append(hero)
def print_hero(heros,my_heros):
print(my_heros)
print(heros)
for iin my_heros:
print(i)
heros = ['亚瑟','安琪拉','李白']
my_heros = []
zhuan_hero(heros[:],my_heros)
print_hero(heros[:],my_heros)
传递任意数量的实参
有时候,我们预先不知道函数需要接受多少个实参,Python语句提供了可以收集任意数量的实参。
例:
英雄有很多装备,这时候我们不知道所选的英雄装备,所以我们可以使用*参数,进行接收实参
def get_equ(*name):
print(name)
get_equ('无尽','饮血','红叉')
结合使用位置实参和任意数量实参
例:此操作会把位置实参传递,剩下的所有参数被任意参数实参接收。
def get_equ(size,*name):
print(size,name)
get_equ(6,'无尽','饮血','红叉')
注意:位置实参需要在任意实参之前。
使用任意数量的关键字实参
如果我们不知道需要接收的实参数量。这种情况下可以将函数编写成能够接收任意数量的键值对,调用语句提供了多少就可以接收多少。
例:
def get_name(first_name,last_name,**name):
full_name ={}
full_name['first_name'] = first_name
full_name['last_name'] =last_name
for key,valuein name.items():
full_name[key] = value
return full_name
a= get_name('张','3',first_name1='李',last_name1='四')
print(a)
将函数存储到模块中
函数的优点之一就是他们可以将代码块与主程序分离。通过给函数指定描述性名称。将函数存储在被称为模块的独立文件中。再将模块导入到主程序中,import语句允许在当前运行的程序文件中使用模块代码。
导入整个模块
先创建模块,模块是扩展名为.py的文件,包含要导入到程序中的代码。
导入方式一:直接import 文件名,会将该文件中的所有函数全部导入到当前程序中
导入方式二:使用from 文件名 import 函数名,会将指定函数导入到当前程序中
导入方式三:使用from 文件名 import 函数名 as 别名,将指定函数重新起名在当前程序中使用
导入方式四:使用from 文件名 import *,会将该文件中的所有函数全部导入到当前程序中
顶顶顶