详解Python函数参数定义及传参(必备参数、关键字参数、默认可省略参数、可变不定长参数、*args、**kwargs)

131 阅读4分钟

Python函数参数传参的种类

 Python中函数参数定义及调用函数时传参大体可分

  • 必备参数
  • 关键字参数
  • 默认可省略参数
  • 不定长元组参数
  • 不定长关键字参数 等,下面通过函数定义及调用上的不同情况深入解析这些中参数的不同及应用场景。

  为了更好的理解不同参数的具体意义,所以下面演示代码中,使用的参数数量较多。具体是一个调用MySQL数据库配置参数的函数所需要的参数,我们用这个来演示不同类型的特点及适用方法,了解每种类型的应用场景及优缺点。

必备参数__仅赋值传参

必备参数,就是在调用函数的时候,定义的参数要全部都有赋值,否则执行的时候代码会报错。

#!/usr/bin/env python
# -*- coding: utf-8 -*-


# 演示获得数据库配置参数,使用必备参数
def demo_get_conf1(user, pw, host, port, db, charset):
    "打印得到的数据库配置"
    print('host: ', host)
    print('port: ', port)
    print('user: ', user)
    print('pw: ', pw)
    print('db: ', db)
    print('charset: ', charset)


demo_get_conf1('root', '1234', '127.0.0.1', '3306', 'tests', 'utf8')

必备参数__键值对传参(关键字参数)

#!/usr/bin/env python
# -*- coding: utf-8 -*-


# 演示获得数据库配置参数,使用必备参数
def demo_get_conf1(user, pw, host, port, db, charset):
    "打印得到的数据库配置"
    print('host: ', host)
    print('port: ', port)
    print('user: ', user)
    print('pw: ', pw)
    print('db: ', db)
    print('charset: ', charset)


demo_get_conf1(
    charset='utf8',
    pw='1234',
    user='root',
    host='127.0.0.1',
    port='3306',
    db='tests')

默认可省略参数

#!/usr/bin/env python
# -*- coding: utf-8 -*-


# 演示获得数据库配置参数,使用默认可省略参数
def demo_get_conf2(user, pw, host, port, db, charset='utf8'):
    "打印得到的数据库配置"
    print('host: ', host)
    print('port: ', port)
    print('user: ', user)
    print('pw: ', pw)
    print('db: ', db)
    print('charset: ', charset)


demo_get_conf2('root', '1234', '127.0.0.1', '3306', 'tests')

不定长元组参数(*args)

#!/usr/bin/env python
# -*- coding: utf-8 -*-


# 演示获得数据库配置参数,使用可变长元组参数
def demo_get_conf3(host, port, *cnf):
    "打印得到的数据库配置"
    print('host: ', host)
    print('port: ', port)
    print('user: ', cnf[0])
    print('pw: ', cnf[1])
    print('db: ', cnf[2])
    print('charset: ', cnf[3])


demo_get_conf3('127.0.0.1', '3306', 'root', '1234', 'tests', 'utf8')

优化配置

# 演示获得数据库配置参数,使用可变长元组参数
def demo_get_conf6(host, port, *cnf):
    "打印得到的数据库配置"
    arr = ['root', '1234', 'tests', 'utf8']     # 可变参数的默认值
    len_arr = len(arr)
    len_cnf = len(cnf)
    if len_cnf > len_arr:
        len_cnf = len_arr                       # 取变长参数最多不超过默认列表中的数量,多余的忽略

    for i in range(len_cnf):
        arr[i] = cnf[i]

    print('host: ', host)
    print('port: ', port)
    print('user: ', arr[0])
    print('pw: ', arr[1])
    print('db: ', arr[2])
    print('charset: ', arr[3])


print('\n', '传递5个变长参数')
demo_get_conf6('127.0.0.1', '3306', 'new_user', '5678', 'tests', 'utf8mb4', 'abc')
print('\n', '传递4个变长参数')
demo_get_conf6('127.0.0.1', '3306', 'new_user', '5678', 'tests', 'utf8mb4')
print('\n', '传递2个变长参数')
demo_get_conf6('127.0.0.1', '3306', 'new_user', '5678')
print('\n', '不传递变长参数')
demo_get_conf6('127.0.0.1', '3306')

累加的例子

# 演示获得数据库配置参数,使用可变长元组参数
def demo_get_conf5(x, y, *nums):
    "得到累加和"
    res = x + y
    for i in nums:
        res += i
    return res


print(demo_get_conf5(10, 20,))
print(demo_get_conf5(10, 20, 15, 25, 30))
print(demo_get_conf5(10, 20, 15, 25, 30, 50, 30))

不定长字典参数(**kwargs)

# 演示获得数据库配置参数,使用可变长字典参数
def demo_get_conf7(host, port, **cnf):
    "打印得到的数据库配置"
    print('host: ', host)
    print('port: ', port)
    print('user: ', cnf['user'])
    print('pw: ', cnf['pw'])
    print('db: ', cnf['db'])
    print('charset: ', cnf['charset'])


demo_get_conf7('127.0.0.1', '3306', user='new_user', pw='5678', db='tests', charset='utf8mb4')

优化配置

#!/usr/bin/env python
# -*- coding: utf-8 -*-


# 演示获得数据库配置参数,使用字典参数
def demo_get_conf7(host, port, **cnf):
    "打印得到的数据库配置"
    arr = {'user': 'root', 'pw': '1234', 'db': 'tests', 'charset': 'utf8'}     # 可变参数的默认值

    for key, val in cnf.items():
        if key in arr:
            arr[key] = val                       # 取变长参数传递过来的键,如果在预置里面存在就更改,不存在的忽略

    print('host: ', host)
    print('port: ', port)
    print('user: ', arr['user'])
    print('pw: ', arr['pw'])
    print('db: ', arr['db'])
    print('charset: ', arr['charset'])


print('----------参数完整传递:')
demo_get_conf7('127.0.0.1', '3306', user='new_user', pw='5678', db='tests', charset='utf8mb4')
print('----------参数多余传递:')
demo_get_conf7('127.0.0.1', '3306', user='new_user', pw='5678', db='tests', charset='utf8mb4', abc='123')
print('----------参数减少传递:')
demo_get_conf7('127.0.0.1', '3306', user='new_user', pw='5678')
print('----------变参没有传递:')
demo_get_conf7('127.0.0.1', '3306')