一:函数的定义
函数(Functions)是指可重复使用的程序片段。它封装了能实现一定功能的代码块。
#python中定义一个函数的语法如下
def function_name(参数): #函数名也是一个变量,它是一个指向函数的变量;函数本身也可以赋值给一个变量,这样该变量即成为了函数的一个别名,同样可以指向函数
'''
文档字符串:用来描述函数的功能
'''
#function code block
函数体内部可以用 return 随时返回函数结果,但要注意的是,一旦执行到return时,函数就执行完毕,并将结果返回,return后面的语句永远不会执行!如果没有return语句,函数执行完毕后也会返回结果,此时结果为None
#定义一个空函数
def nop():
pass #pass语句什么都不做,pass实际上是用来作为占位符的,比如现在还没想好怎么写函数的代码,就可以先放一个pass,让代码能运行起来。pass也可以用在其他语句里
函数可以同时返回多个值,但其实返回值就是一个tuple
解释器执行到函数的定义时,会有两个动作:1,检查语法,语法有错误时会报错;2,向os发出请求将该函数读入内存
二:函数的参数
1,位置参数
位置参数是必选参数,调用函数时,传入的值按照位置顺序依次赋给位置参数。
def my_sum(a,b):
s=0
s = a + b
return s
s1=my_sum(1,2) #调用my_sum函数时必须传入两个值,且这两个值是按位置顺序依次赋给参数a和b的
print(s1)
2,默认参数
def say(message,times=1): #times=1,即设置默认参数times,其默认值为1
print(message*times)
say('hello') #只传一个值时,times参数取默认值1
say('hello',5) #传两个值时,传进来的值5会覆盖默认值,此时times取值5
设置默认参数时需注意:
一:位置参数(必选参数)在前,默认参数在后,不能颠倒它们的顺序,因为值是按参数位置依次分配的。
二:变化小的参数可以使用默认参数
三:默认参数必须指向不可变对象,即默认参数值必须是不可变类型!!!
3,可变参数
可变参数就是传入的参数数量是可变的,可以是1个,2个到任意个,或者0个。
def calc(*args): #在参数前面加一个 * 来定义可变参数;在函数内部,参数args接收到的是一个tuple,即传入的任意个值会汇集成一个tuple再赋值给参数args
sum = 0
for n in numbers:
sum = sum + n * n
return sum
如果要传入的值是一个list或tuple或set,python允许你在list或tuple或set前面加一个 * 号,把list或tuple或set的元素变成可变参数传进去;如果传入一个str,python也允许你在str 前面加一个 * 号,把str的每个字符变成可变参数传进去;如果传入一个dict,python允许你在dict前面加一个 * 号,把dict的key变成可变参数传进去
4,关键字参数
关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装成一个dict再传给参数kw
关键字参数不能在位置参数前面,即位置参数应写在关键字参数前面;可变参数接收的也是任意个位置参数,所以可变参数也应在关键字参数前面
def person(name, age, **kwargs): #通过使用两个 * 号来定义关键字参数,kwargs参数接收到的是一个dict
print('name:', name, 'age:', age, 'other:', kw)
关键字参数有什么用呢?它可以扩展函数的功能!
如果要传入的值是一个dict,python允许你在dict前面加两个 * 号,把dict的元素变成关键字参数传进去
5,命名关键字参数
命名关键字参数可以用来限制传入关键字参数的名字,即只能传入指定关键字参数
def person(name, age, *, city, job): #命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数;只接收city和job作为关键字参数
print(name, age, city, job)
# person('rock',18,hooby='read',job='coding') #当传入其他关键字参数时会报错
person('rock',18,job='coding') #在没有设置默认值的情况下,命名关键字参数不能省略
注意:如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符 * 了
def person(name, age, *args, city, job): #可变参数后面的city 和 job 是命名关键字参数,这里就不再需要一个分隔符* 了
print(name, age, args, city, job)
def foo(*kwargs,x,y): #因为参数x,y在可变参数后面定义,所以这里的x和y是命名关键字参数
print(kwargs)
print(x,y)
foo(1,2,x=3,y=4)
三:函数的调用
要调用一个函数,需要知道函数的名称和参数。调用一个函数时,解释器会先找到该函数,然后执行该函数中的代码
mylist = [1,2,'a','b']
print(mylist) #在这调用了print()函数,调用一个函数,1,函数名需要写对;2,传入的参数个数和参数数据类型需要满足函数要求