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:如果参数中既有列表型参数或元组型参数(带*的参数)也有字典型参数(带**号的参数),则带*的参数应该写在带**号的参数的前面