一些例子:
①
def test1():
print('in the test1') 代表test1这个函数的主逻辑,如果执行,会先print,然后再return
return 0
print('test end') 不管写什么都不运行了,如果以后有程序需要写着3行代码,直接test1()即可
x = test1() return的那个值赋值给了x
print(x)
②
def test(x,y): 这里面的xy叫做形参
print(x)
print(y)
第一种:
test(1,2) 1 2叫做实参
第二种:
x=1 定义了一个内存对象x在引用他
y=2
test(y=y,x=x) 第一个y代表test里面的形参,后面那个y代表第上面行指定的内存对象
第三种:
test(y=1,x=2) 当时这种情况的时候,实参的顺序与形参的顺序是没有关系的
第四种:
test(1,y=2)
这种情况比较复杂,首先第一个非定义x=..or y=..的常数是定义给x的,如果既有关键字调用,又有位置调用,则按照位置的来,比如第一个是x=1,然后2,则他先赋给x=1,然后x=1又为2,就会报错,所以关键字调用不能写在位置调用的前面,也就是说比如关键字a b c d,如果想把d用关键字调用,则前面的a b c一定要是位置调用。
③默认参数
def test(x,y=2): 默认y=2,如果后面不赋值也可以print出来
print(x)
print(y)
test(1) 这一行其实是代表着给x赋值了1
所以最终的结果是print出来1,2
默认参数的特点:调用函数的时候,默认参数可有可无,并非必须传递的,如果没有传递,用默认值,如果有传递,则用传递值。
用途:下载,一键下载
⑤当实参个数不确定时:
def test(*args):
print(args)
test(1,2,3,4,5,5) 当你的实参不确定的时候,可以对形参前面加*号
test(*[1,2,4,5,5]) args=tuple[1,2,4,5,5] 将args变成一个元组
这两个的运行结果是一样的,结果都为一个元组(1, 2, 3, 4, 5, 5)
def test1(x,*args):
print(x)
print(args)
test1(1,2,3,4,5,6,7)
这个则会将1赋给x,然后后面的数作为一个元组
如果想输出一个字典怎么办:
**kwargs:把N个关键字参数,转换成字典的方式
def test2(**kwargs):
print(kwargs)
print(kwargs['name'])
print(kwargs['age'])
print(kwargs['sex'])
test2(name='alex',age=8,sex='F')
test2(**{'name':'alex','age':8,'sex':'F'}) 注意,这一行一定要跟上一一对应
输出结果:
{'name': 'alex', 'age': 8, 'sex': 'F'}
alex
8
F
倒数第二个例子-------分割线---------------
def test3(name,**kwargs):
print(name)
print(kwargs)
test3('alex',age=18,sex='m')
在这个例子中,alex会赋值给name,后面两个则形成字典。
最后一个例子-------分割线---------------
def test4(name,age=18,*args,**kwargs)
print(name)
print(age)
print(kwargs)
print(args)
test4('alex',2,3,4,sex='m',hobby='tesla')
在这里面需要注意的有:‘’alex'赋值给name,2赋值给age,3,4形成元组,后面两个形成字典,如果里面没有2,3,4则args输出为(),因为args不能接收字典的形式,如果后面加了一个age=18,则前面不能有2,3,4