python基础--函数的形参,默认参数值,列表参数,不定长参数,字典型参数

1,默认参数值:

  首先来上段代码:

def login(username='abc',password='123'):
    if username=='admin' and password=='admin123':
        print('登陆成功')
    else:
        print('登录失败')
    return username,password

print(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('登录失败')
    return username,password

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