定义函数 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 *
使用并非自己写的大型模块时,最好不要使用这种导入方法
如果有重名函数,可能导致意想不到的结果