自学Python:第8篇——函数

定义函数 def
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 35def 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+" "+x3else:m=x1+" "+x3return 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 xm=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_listdef 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_listdef 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']=x1pro['second']=x2for k,v in x3.items():pro[k]=vreturn 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']=x1pro['second']=x2for k,v in x3.items():pro[k]=vreturn 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 *

使用并非自己写的大型模块时,最好不要使用这种导入方法

如果有重名函数,可能导致意想不到的结果