1、基础格式
定义一个python函数,需要def、函数名、带有函数参数的圆括号、最后紧跟冒号
先举一个基础的例子
def no_thing():#没有参数的函数
pass
2、参数&返回值
一个python函数可以接受任何数量(包括0)的任何类型的值作为输入变量,0即无参函数,如上面的代码块
一个python函数可以返回任何数量(包括0)的任何类型的结果,如果函数不显示地调用return函数,那么会默认返回None
注意❗:在其他语言中(如C、C++),一个函数只能有一个返回值
3、有用的None
None是Python中的一个特殊值,虽然他不表示任何数据,但仍然具有重要作用。
①None作为布尔值时和False一样
thing = None
if things:
print("It's some thing")
else:
print("It's no thing")
代码运行结果如下:
②None与False的区别
读者在学习时,需要把None和不含任何数值的数据结构区分开来。
0值的整型/浮点型、空字符串(’ ')、空列表([ ])、空元组( (,) )、
空字典({ })、空集合(set())都等价于False,但是不等价于None
③区分None和False
为了区分None和布尔值False 的区别,使用Python 的is操作符:
thing = None
if thing is None:
print("It's nothing")
else:
print("It's somrthing")
练习:
写一个函数,判断他的参数是否是None
def is_none(thing):
if thing is None:
print("It's None")
elif thing:
print("It's Ture")
else:
print("It's False")
4、位置参数
Python处理参数的方式要比其他语言更加灵活。其中,最熟悉的参数类型是位置参数,传入参数的值是按照顺序依次复制过去的。
创建一个带有位置参数的函数:
def menu(wine,entree,dessert):
#返回一个字典
return{'wine':wine,'entree':entree,'dessert':dessert}
print(menu('红酒,'begel','牛肉'))
尽管这种方式很常见,但是位置参数的一个弊端是必须熟记每个位置参数的含义。在调用menu()函数时,如果误把最后一个参数当作是第一个参数,会得到完全不同的结果
print(menu('牛肉','begel','红酒'))
5、关键字参数
为了避免位置参数带来的混乱,调用参数时可以指定对应参数的名字,甚至可以采用与函数定义不同顺序的调用:
print(menu(entree='begel',dessert='牛肉',wine='红酒')
当然,也可以把位置参数和关键字参数混合起来。首先,实例化参数wine,然后对参数entree和dessert使用关键字参数的方式
print(menu('红酒',dessert='牛肉',entree='begel'))
6、指定默认参数值
当调用方没有提供对应的参数值,可以指定默认参数值。这个听起来很普通的特性实际上很有用,以之前的例子为例:
def menu(wine,entree,dessert='牛肉'):
return('wine':wine,'entree':entree,'dessert':dessert)
print(menu('红酒','begel'))
如果提供了参数,则会代替默认值。
注意:默认值一定是从右开始,因为函数参数从左开始结合
默认参数值在函数被定义时已经计算出来了,而不是在程序运行时。
千万不能把一个可变的数据类型(例如列表或字典)当作默认参数值。
def buggy(arg,result=[]):
result.append(arg)
print(result)
buggy('a')
buggy('b') #expect ['b']
buggy('c') #expect ['c']
函函数buggy()在每次调用时,添加参数arg到一个空的列表result中,然后打印出一个单值列表。但是存在一个问题,函数只有在第一次调用时列表是空的,第二次调用时,就会存在之前调用的返回值
如果写成下面的样子就可以解决刚才的问题:
def works(arg):
result = []
result.append(arg)
print(result)
works('a')
works('b')
works('c')
7、使用*收集位置参数
如果读者之前了解过C/C++编程,可能会认为*和指针有关,然而,Python中是没有指针概念的。
当参数被用在函数内部时,星号(*)将一组可变数量的位置参数集合成参数值的元组
def print_args(*args):
print('Positional argument tuple:',args)
print_args(3,2,1,'wait!','uh!')
#给函数传入的所有参数都会以元组形式返回
如果函数同时有限定的位置参数,那么*arg会收集剩下的参数
def print_more(required1,required2,*args):
print('required1:',required1)
print('required2:',required2)
print('All the rest:',args)
print_more('cap','flowers','scarf','wax','gloves')
8、使用**收集关键字参数
使用两个星号(**)可以将参数收集到一个字典中,参数的名字是参数的键,对应参数的值是字典的值。
def print_kwargs(**kwargs):
print('keyword argument:',kwargs)
print_kwargs(wine="红酒",dessert="牛肉")