定义函数 def
eg:
实参和形参的用法无需多言
关键字实参
关键字实参是传递给函数的名称-值对,让你无需考虑函数调用中的实参顺序,
还清楚地指出了函数调用中各个值的用途
eg:以下两个函数调用是等效的
默认值
编写函数时,可以给每个形参指定默认值
在调用函数时,如果给形参提供了实参,则不用默认值;否则,将使用默认值
返回值
让实参变成可选择的(可以不输入实参):
注意:可选择的实参要放在最后一个参数,否则会报错
结果fer tor
若x=name('fer','sanz','tor')
则结果为x=name('fer','sanz','tor')
返回字典
函数可以返回任何类型的值,包括列表和字典等较复杂的数据结构
传递列表
应用一:在函数中修改列表(再返回一个列表)
应用二:禁止函数修改列表
修改列表-例子:
禁止函数修改列表:
调用函数后,也许列表会变成空的,即原来的列表没有了
为解决这个问题,可以向函数传递列表的副本而不是原件,这样的话
函数所做的任何修改都只影响副本,而丝毫不影响原件
要将列表的副本传递给函数,使用切片表示法:
fun(list[:])
eg:
可见,a并没有被改变
传递任意数量的实参:
有时候,你预先不知道函数需要接收多少个实参,
好在python允许函数从调用语句中收集任意数量的实参
python将实参封装到一个元组(tuple)中
结合使用位置参数和任意数量实参
如果要让函数接收不同类型的实参,必须在函数定义中将接纳任意数量实参的形参放在最后
python先匹配位置参数和关键字参数,再将余下的实参都收集到最后一个形参中
使用任意数量的关键字实参:
输入一些数据,返回一个字典,故属于关键字实参
eg:
将函数存储在模块中:
进阶操作:将函数存储在模块这种独立文件中,再将模块导入到主程序中
import语句允许在当前运行的程序文件中使用模块中的代码
import语句应放在程序开头
模块的扩展名是.py的文件
pizza.py (作为一个模块):
run.py (在这里调用模块的函数):
还可以这样,导入模块中的特定函数:
from pizza import build_people (注意:函数没有加括号噢)
后面调用就无需说明函数来源于哪个模块了
使用as给函数指定别名(不常用):
from hello import build_people as bd
bd(......)
导入模块中的所有函数
from pizza import *
使用并非自己写的大型模块时,最好不要使用这种导入方法
如果有重名函数,可能导致意想不到的结果
eg:
def greet():
print("hello!")
greet()
实参和形参的用法无需多言
关键字实参
关键字实参是传递给函数的名称-值对,让你无需考虑函数调用中的实参顺序,
还清楚地指出了函数调用中各个值的用途
eg:以下两个函数调用是等效的
fun(age=30,name='messi')
fun(name='messi',age=30)
默认值
编写函数时,可以给每个形参指定默认值
在调用函数时,如果给形参提供了实参,则不用默认值;否则,将使用默认值
def people(name,age=20):
print(name,age)
people('kaka',35)
kaka 35
def people(name,age=20):
print(name,age)
people('kaka')
kaka 20
返回值
def people(name,age=20):
x=name+","+str(age)
return x
m=people('liu')
print(m)
liu,20
让实参变成可选择的(可以不输入实参):
def name(x1,x3,x2=''):
if x2:
m=x1+" "+x2+" "+x3
else:
m=x1+" "+x3
return m
x=name('fer','tor')
print(x)
注意:可选择的实参要放在最后一个参数,否则会报错
结果fer tor
若x=name('fer','sanz','tor')
则结果为x=name('fer','sanz','tor')
返回字典
函数可以返回任何类型的值,包括列表和字典等较复杂的数据结构
def people(x1,x2):
x={'name':x1,'age':x2}
return x
m=people('toni',18)
print(m)
>>>{'age': 18, 'name': 'toni'}
传递列表
应用一:在函数中修改列表(再返回一个列表)
应用二:禁止函数修改列表
修改列表-例子:
def new(a,new_list):
while a:
x=a.pop()
new_list.append(x)
return new_list
def show(a):
for x in a:
print(x)
a=[1,2,3,4,5]
b=[0]
new(a,b)
show(b)
0
5
4
3
2
1
禁止函数修改列表:
调用函数后,也许列表会变成空的,即原来的列表没有了
为解决这个问题,可以向函数传递列表的副本而不是原件,这样的话
函数所做的任何修改都只影响副本,而丝毫不影响原件
要将列表的副本传递给函数,使用切片表示法:
fun(list[:])
eg:
def new(a,new_list):
while a:
x=a.pop()
new_list.append(x)
return new_list
def show(a):
for x in a:
print(x)
a=[1,2,3,4,5]
b=[0]
new(a[:],b) #就在这里,使用切片表示法,传入一个a的副本
show(a)
>>>
0
5
4
3
2
1
可见,a并没有被改变
传递任意数量的实参:
有时候,你预先不知道函数需要接收多少个实参,
好在python允许函数从调用语句中收集任意数量的实参
def make_pizza(*toppings):
print(toppings)
make_pizza('a','b')
>>>('a', 'b')
python将实参封装到一个元组(tuple)中
def make_pizza(*toppings):
for x in toppings:
print(x)
make_pizza('a','b','c')
>>>
a
b
c
结合使用位置参数和任意数量实参
如果要让函数接收不同类型的实参,必须在函数定义中将接纳任意数量实参的形参放在最后
python先匹配位置参数和关键字参数,再将余下的实参都收集到最后一个形参中
def make_pizza(size,*toppings):
print("To make a "+size+" pizza")
print("you need these:")
for x in toppings:
print(x)
make_pizza('large','a','b')
>>>
To make a large pizza
you need these:
a
b
使用任意数量的关键字实参:
输入一些数据,返回一个字典,故属于关键字实参
eg:
def build_people(x1,x2,**x3):
pro={}
pro['first']=x1
pro['second']=x2
for k,v in x3.items():
pro[k]=v
return pro
x=build_people('Albert','Einstein',location='USA',field='physics') #lucation是key,USA是value
print(x)
>>>
{'second': 'Einstein', 'location': 'USA', 'first': 'Albert', 'field': 'physics'}
将函数存储在模块中:
进阶操作:将函数存储在模块这种独立文件中,再将模块导入到主程序中
import语句允许在当前运行的程序文件中使用模块中的代码
import语句应放在程序开头
模块的扩展名是.py的文件
pizza.py (作为一个模块):
def build_people(x1,x2,**x3):
pro={}
pro['first']=x1
pro['second']=x2
for k,v in x3.items():
pro[k]=v
return pro
run.py (在这里调用模块的函数):
import pizza
x=pizza.build_people('Albert','Einstein',location='USA',field='physics') #调用时注明模块
print(x)
还可以这样,导入模块中的特定函数:
from pizza import build_people (注意:函数没有加括号噢)
后面调用就无需说明函数来源于哪个模块了
使用as给函数指定别名(不常用):
from hello import build_people as bd
bd(......)
导入模块中的所有函数
from pizza import *
使用并非自己写的大型模块时,最好不要使用这种导入方法
如果有重名函数,可能导致意想不到的结果