函数
函数的语法
-
def: 定义函数的关键字;
-
函数名:函数名指向函数内存地址,是对函数体代码的引用。函数的命名应该反映出函数的功能;
-
括号:括号内定义参数,参数是可有可无的,且无需指定参数的类型;
-
冒号:括号后要加冒号,然后在下一行开始缩进编写函数体的代码;
-
“”“文档描述”"": 描述函数功能,参数介绍等信息的文档,非必要,但是建议加上,从而增强函数的可读性;与注释功能相同
-
函数体:由语句和表达式组成;
-
return 值:定义函数的返回值,return是可有可无的。
函数的参数
参数
有参数的函数被称为参函数
无参的函数被称为无参函数
ps:可以再函数的结尾加上pass,意思为什么都不做,再写程序前我们可以想好需要实现什么功能,然后写一些空函数,最后往其中添加功能
def qaq():
pass
实参与形参
实参:实际参数
#函数调用时实际往里面传入的参数为实参
login(1,2)#这个1,2即是实参
形参:形式参数
#函数括号中的参数,类似于注解的变量名
def login(user,password)#这个user和password即为形参
形参与实参的具体使用
1.根据形参的位置传值
调用方法时若直接往内部传值,且方法内部有形参,则必须传与其对应的值,且不能乱顺序
def a(name,sex):
return 0
a('姓名','性别')
2.关键字参数
调用方法时可以用key—value的方式往内部传值
key为形参,value对应的是实参
a(name = '姓名' ,sex = '性别')#可以打乱顺序
3.默认参数
定义函数时,可以为形参默认赋一个值,这样的话在之后调用函数的时候不赋值也没有关系
ps:默认参数必须在普通的形参之后,且只会在函数定义的时候被赋值一次(类似全局变量)
例如:def(name,sex='male')
默认参数的值通常需要设为不可变类型
def foo(n,arg=[]):
arg.append(n)
return arg
foo(1)
>>>[1]
foo(2)
>>>[1, 2]
foo(3)
>>>[1, 2, 3]
#原因是默认参数只会在函数定义的时候被赋值一次,所以调用该方法不会被重新定义
可变长参数
指的是参数的个数不固定
#一个*
#这样子是不行的因为arg这个参数是在*test前面,因此传值的时候会被重新赋值成int,必须把默认参数放最后
def qaq(n, arg=[], *test):
arg.append(n)
print(test)
return arg
qaq(1, 2, 3, 4, 56, 7, 8, 9)
#正确的
def qaq(n, *test, arg=[]):
arg.append(n)
print(test)
return arg
qaq('1, 2, 3, 4', 56, 7, 8, 9)
>>>(56, 7, 8, 9)
ps:*列表 等于列表中的所有值
a=[1,2,3]
print(*a)
>>>1 2 3#不是列表
#给函数传列表必须在形参旁边加*,传值的也需要加*
a=[1,2,3]
qaq(1,*a)
#2个**能接受多余的关键字参数,并保存成字典的形式
#1个*只能接受不是关键字参数的值,接受关键字参数会报错
def a(c,**b):
print(b)
a(c=1,b=1,a=1)
>>>{'b': 1, 'a': 1}
#可以直接传字典但必须在字典前加**
ps:argument有参数的意思
在实参前加*
#*会将其后的值打散成位置实参
nums = [1,2,3,]
func(*nums)
#**会将其后的值打散成关键字参数,只能跟字典
nums={1:2,2:3,3:4}
func(**nums)
命名关键字参数
若希望函数的调用者必须以key=value的方式传值,python3有专门提供的语法来限制传值
def register(user,*,name):
print(name)
register('qaq',name='sadnesspineapple')
ps:*后面的值必须传并且只能使用key=value(关键字传值)的方式
#*后面的参数被称为命名关键字参数
#*后面的值可以设置默认值,不过他是关键字参数,所以不会被覆盖,除非使用者调用此参数
def register(user,*,sex='男'):
print(name)
register('qaq')
上述参数可以任意组合,但是顺序的定义必须是
位置参数,默认参数,*args(多余的普通参数保存成元组形式)
,命名关键字参数(key=value),**kwargs(多余的key—value保存成字典形式)
ps:可以把一个函数接受到的值传给另外一个函数