1,默认参数值:
首先来上段代码:
def login(username='abc',password='123'):if username=='admin' and password=='admin123':print('登陆成功')else:print('登录失败')returnusername,passwordprint(login('admin','admin123'))print(login('admin'))print(login(password='ssssss'))print(login())
运行结果:
登陆成功
('admin', 'admin123')
登录失败
('admin', '123')
登录失败
('abc', 'ssssss')
登录失败
('abc', '123')
定义login函数的时候,有两个形参,一个是username,并赋予了一个默认值是abc,另一个形参是password,赋予的默认值是123,最后把调用login函数时传入的实参username和password一并返回。
if判断
username=='admin' 和 password=='admin123'
同时成立的时候打印登陆成功,接下来就是带不同参数时调用login函数产生的结果:
第一次调用login函数,并传入'admin','admin123'做为实参,满足if的判断条件,打印登陆成功,并且返回了('admin', 'admin123')
第二次调用login函数,只传入一个实参admin,这个时候会自动将这个实参放入函数中第一个形参,没有传入实参的password就会采用默认值123来参与函数的运算
所以这个时候相当于username的值是admin,但是password的值是123,不满足if的判断,所以打印登录失败,并且返回了('admin', '123')
第三次调用login函数,指定传入实参password='ssssss',没有传入实参的username就会自动采用默认值admin来参与函数的运算,所以这个时候相当于username的值是abc,
password的值是ssssss,不满足if的判读,打印登录失败并返回('abc', 'ssssss')
第四次调用login函数,没有传入任何参数,所以username和password都自动采用默认值参与函数的运算,所以这个时候相当于username的值是abc,password的值是123,
不满足if的判断,打印登录失败,并返回('abc', '123')
2,列表参数:
参数可以是变量,也可以是元组,列表等内置数据结构:
def login(username=[],password='admin123'):
username=username[0]if username=='admin' and password=='admin123':print('登陆成功')else:print('登录失败')returnusername,passwordprint(login(['admin','aaaaaa'])print(login(['bbbbbb','admin']))
运行结果:
登陆成功
('admin', 'admin123')
登录失败
('bbbbbb', 'admin123')
第一次调用login函数,传入了列表['admin','aaaaaa'],列表的第0个元素是admin,password没有传入参数,自动采用默认值admin123参与运算,所以满足if判断,打印登录成功,并返回('admin', 'admin123')
第二次调用login函数,传入了列表['bbbbbb','admin'],列表的第0个元素是bbbbbb,password没有传入参数,自动采用默认值admi123参与运算,所以不满足if判断,打印登录失败,并返回('bbbbbb', 'admin123')
3,可变长度参数
参数前加上*标识符,表示可变长度参数,*也可以引用元组,将多个参数组合在一个元组中。
def func(*n):
a=n[0]
b=n[1]if(a=='1111' and b=='2222'):print('yes')else:print('no')returnnprint(func('1111','2222','3333'))print(func('4444','5555','6666','7777','8888'))
运行结果:
yes
('1111', '2222', '3333')
no
('4444', '5555', '6666', '7777', '8888')
这里可以看到最后返回的结果n是一个不定长的元组
4,字典类型参数
**标识符表示一个字典类型的参数
def func(**n):
num=n.keys()for i innum:print(i,n)
func(a=1111,b=2222,c=3333)
func(d=4444,e=5555,f=6666,g=7777,h=8888)
运行结果:
a {'a': 1111, 'b': 2222, 'c': 3333}
b {'a': 1111, 'b': 2222, 'c': 3333}
c {'a': 1111, 'b': 2222, 'c': 3333}
d {'d': 4444, 'e': 5555, 'f': 6666, 'g': 7777, 'h': 8888}
e {'d': 4444, 'e': 5555, 'f': 6666, 'g': 7777, 'h': 8888}
f {'d': 4444, 'e': 5555, 'f': 6666, 'g': 7777, 'h': 8888}
g {'d': 4444, 'e': 5555, 'f': 6666, 'g': 7777, 'h': 8888}
h {'d': 4444, 'e': 5555, 'f': 6666, 'g': 7777, 'h': 8888}
这里可以看到,打印的参数n是一个不定长的字典
ps:如果参数中既有列表型参数或元组型参数(带*的参数)也有字典型参数(带**号的参数),则带*的参数应该写在带**号的参数的前面