首页 > 编程语言 >Python高级之函数的参数

Python高级之函数的参数

时间:2024-05-09 15:05:32浏览次数:20  
标签:123 函数 Python ligo tag 参数 print password name

【一】形参和实参

  • 函数的参数分为形参和实参,形参就是定义在函数名后面括号里的参数(用来接收外部传来的值),实参就是调用函数时,括号里传进去的值(值可以是常量、变量、表达式)
def add(x, y):
    return x + y


#实参是常量
print(add(3, 4)) #输出 7
#实参是变量
x = 3
y = 4
print(add(x, y)) #输出 7
#实参是表达式
print(add(x * y, x + y)) #输出 19
#变量、常量、表达式的随机组合
print(add(x, 10 * (x+y))) #输出 73
#在调用有参函数时,实参(值)会赋值给形参(变量名)

【二】位置参数

  • 位置参数指按照顺序定义的参数
  • 在定义函数时,位置形参是按照从左到右的顺序依次定义形参,所以在调用函数时,位置实参也得按照从左到右的顺序依次定义实参
  • 只要是按照上面的形式定义的形参都必须被传值,并且实参要和形参的顺序保持一致

【1】有位置参数不传值会报错

#没有给位置参数传值给传值会报错
def login(name, password, tag):
    print(f"name:{name}|password:{password}|tag:{tag}")
    
    
login()
'''
Traceback (most recent call last):
  File "D:\Python\pythonProject\pythonProject1\demo7.py", line 82, in <module>
    login()
TypeError: login() missing 3 required positional arguments: 'name', 'password', and 'tag'
'''

【2】不按照位置传参数导致变量错误

#不按照位置传值,值与变量不对应,但不会报错
def login(name, password, tag):
    print(f"name:{name}|password:{password}|tag:{tag}")
    
    
login(123, True, 'ligo')
# name:123|password:True|tag:ligo

【3】对应位置形参

#要按照形参的位置传值
def login(name, password, tag):
    print(f"name:{name}|password:{password}|tag:{tag}")
    
    
login('ligo', 123, True)
# name:ligo|password:123|tag:True

【三】关键字参数

  • 关键字参数的实参是key = value的形式,而且可以不按顺序传参

【1】按顺序传参

#按照关键字传参数一定不能少参数,也不能多参数
def login(name, password, tag):
    print(f"name:{name}|password:{password}|tag:{tag}")
    
    
login(name='ligo', password=123, tag=True)
# name:ligo|password:123|tag:True

【2】不按顺序传参

#关键字传参不像位置传参,它可以不按顺序传参
def login(name, password, tag):
    print(f"name:{name}|password:{password}|tag:{tag}")
    
    
login(password=123, tag=True ,name='ligo')
# name:ligo|password:123|tag:True

【3】位置和关键字混合使用

#关键字传参也可以和位置传参一起用
#要注意的是,关键字参数必须在位置参数后面,并且不能对同一个形参赋值
def login(name, password, tag):
    print(f"name:{name}|password:{password}|tag:{tag}")
    
    
login( 'ligo',password=123, tag=True)
# name:ligo|password:123|tag:True

【四】默认参数

  • 在定义函数时,就已经为形参赋值,这类形参叫做默认参数
  • 默认参数一般设为不可变类型,并且设置参数时,位置参数一定在前,关键字参数在后

【1】默认参数不传值

#在形参中tag已经设置默认值为True了,所以在实参中可以不用传值
def login(name, password, tag=True):
    print(f"name:{name}|password:{password}|tag:{tag}")
    
    
login(name='ligo', password=123)
# name:ligo|password:123|tag:True

【2】默认参数传值

(1)默认参数初始化

#在实参中再次传值,会覆盖掉形参中的默认值
def login(name, password, tag=True):
    print(f"name:{name}|password:{password}|tag:{tag}")
    
    
login(name='ligo', password=123,tag=False)
# name:ligo|password:123|tag:False

(2)默认参数为可变数据类型

#可变类型的每一次调用会在上一次的基础上增加一个值到同一个列表中
def append_list(num,num_list=[]):
    num_list.append(num)
    return num_list
print(append_list(1)) # [1]
print(append_list(2)) # [1, 2]
print(append_list(3)) # [1, 2, 3]

(3)默认参数为空

#将参数中的列表拿到函数中,再去调用它,它每一次调用,都会覆盖上一个值
def append_list(num):
    num_list = []
    num_list.append(num)
    return num_list
print(append_list(1)) # [1]
print(append_list(2)) # [2]
print(append_list(3)) # [3]

【五】可变长参数

【1】可变长位置参数(*args)

(1)任意类型参数

  • 如果在最后一个形参名前加 * 号,那么在调用函数时,溢出的位置实参,都会被 * 接收,以元组的形式保存下来赋值给该形参
#【1】
def num(x, y, z, *args):
    print(x)
    print(y)
    print(z)
    print(args)


num(1, 2, 3, 4, 5, 6)
# 1
# 2
# 3
# (4, 5, 6)
#1,2,3被xyz取得,剩下的4、5、6被*接收到,以元祖的形式赋给args

#【2】如果形参为常规的参数(位置或默认),实参仍可以是*的形式
def num(x, y, z):
    print(x)
    print(y)
    print(z)


num(*[1, 2, 3])
# 1
# 2
# 3

#用*args求多个值的和
def num(*args):
    num = 0
    for i in args:
        num += i
    return num


print(num(1, 2, 3))  # 6

(2)解包

#如果我们事先生成了一个列表,仍然是可以传值给*args的
def num(x, y, *args):
    print(x)
    print(y)
    print(args)


num_list = [1, 2, 3]
num(1, 2, *num_list)
# 1
# 2
# (1, 2, 3)
#如果在传入列表时没有加*,那列表就只是一个普通的位置参数了

【2】可变长关键字参数(*kwargs)

  • 如果在最后一个形参名前加**号,那么在调用函数时,溢出的关键字参数,都会被 ** 接收,以字典的形式保存下来赋值给该形参
#【1】
def user(name, **kwargs):
     print(name)
     print(kwargs)


user(name='ligo', password=123, tag=True)
# ligo
# {'password': 123, 'tag': True}
#姓名后面的值会被**接受到,然后以字典的形式赋给kwargs

#【2】事先生成了一个字典,仍然是可以给**kwargs传值
def user(name, **kwargs):
     print(name)
     print(kwargs)

data_dict = {'password': 123, 'tag': True}
user(name='ligo', **data_dict)
# ligo
# {'password': 123, 'tag': True}
#如果在传入字典时没有加**,那字典就只是一个普通的位置参数了

#【3】如果形参为常规参数(位置或默认),实参仍可以是**的形式
def user(name, password, tag=True):
    print(name)
    print(password)
    print(tag)


user(**{'name': 'ligo', 'password': '123'})
# ligo
# 123
# True

【3】组合使用

def login(name, password, *args, **kwargs):
    print(f"name:{name}|password:{password}|{args}|{kwargs}")
    
    
login('ligo', 123, 1, 1, 11, 1, x=3)
# name:ligo|password:123|(1, 1, 11, 1)|{'x': 3}

【六】命名关键字参数

【1】函数内判断

  • 如果函数体代码的执行需要依赖某个key,必须在函数内进行判断
def login(name, password,**kwargs):
    if 'tag' in kwargs:
        pass

【2】命名关键字参数

  • 想要限定函数的调用者必须以key=value的形式传值
    • Python3提供了专门的语法:
      • 需要在定义形参时,用 * 作为一个分隔符号,* 号之后的形参称为命名关键字参数。
    • 对于这类参数,在函数调用时,必须按照key=value的形式为其传值,且必须被传值
def login(name, password, *, tag):
    print(f"name:{name}|password:{password}|tag:{tag}")
    
    
login(name='ligo', password=123, tag=True)
# name:ligo|password:123|tag:True


login('ligo', 123, 'True') #没有用关键字传参给tag传值会报错
'''
Traceback (most recent call last):
  File "D:\Python\pythonProject\pythonProject1\demo7.py", line 159, in <module>
    login('ligo', 123, 'True')
TypeError: login() takes 2 positional arguments but 3 were given
'''

【3】命名关键字参数默认值

#命名关键字参数也可以有默认值
def login(name, password, *, tag=True):
    print(f"name:{name}|password:{password}|tag:{tag}")
    
    
login(name='ligo', password=123)
# name:ligo|password:123|tag:True

#如果形参中已经有一个*args了,命名关键字参数就不再需要一个单独的 * 作为分隔符号了
def login(name, password, *args, tag=True):
    print(f"name:{name}|password:{password}|{args}|tag:{tag}")
    
    
login('ligo', 123, 1, 2, 3, 4, 5)
#name:ligo|password:123|(1, 2, 3, 4, 5)|tag:True

【七】混合使用

  • 综上所述所有参数可任意组合使用,但定义顺序必须是:位置参数、默认参数、*args 、**kwargs
  • 混合使用时不能使用关键字参数,并且*args 必须要在**kwargs的前面
def login(name, password, *args, **kwargs):
    print(f"name:{name}|password:{password}|{args}|{kwargs}")
    
    
login('ligo', 123, 1, 1, 11, 1, x=3)
# name:ligo|password:123|(1, 1, 11, 1)|{'x': 3}
  • 在该函数内部还可以把接收到的参数传给另外一个函数(这在装饰器的实现中大有用处)
def func(x, y, z):
    print(x, y, z)


def wrapper(*args, **kwargs):
    func(*args, **kwargs)


wrapper(1, z=3, y=2)
# 1 2 3

标签:123,函数,Python,ligo,tag,参数,print,password,name
From: https://www.cnblogs.com/ligo6/p/18179998

相关文章

  • Python高级之函数
    【一】函数的基本使用我们在前面的学习中,所有的功能代码都集中在一块,需要使用同一功能时,需重复编写该功能的代码,这样比较麻烦,当我们到后面代码变得越来越长,也不利于我们修改其中一个小功能的代码我们完全可以从现实生活中找到简化程序设计的方案:比如一个修理工会事先准备好螺......
  • MindSpore反向传播配置关键字参数
    技术背景在MindSpore深度学习框架中,我们可以向construct函数传输必备参数或者关键字参数,这跟普通的Python函数没有什么区别。但是对于MindSpore中的自定义反向传播bprop函数,因为标准化格式决定了最后的两位函数输入必须是必备参数out和dout用于接收函数值和导数值。那么对于一个......
  • xlwings:在Excel中集成Python
    Github地址:https://github.com/xlwings/xlwings在现代数据分析和报表生成中,MicrosoftExcel仍然是一款非常流行和强大的工具。与此同时,Python作为一种高级编程语言,具备出色的数据处理和分析能力。那么,有没有一种方法可以将Excel和Python完美结合,以发挥它们各自的优势?答案是肯定的......
  • pybuilder:Python项目构建、测试、文档、发布
    Github地址:https://github.com/pybuilder/pybuilder在Python项目开发中,良好的构建和自动化流程是非常重要的。PyBuilder是一个用于构建Python项目的工具,它提供了简单易用的方式来定义和管理项目的构建过程,包括依赖管理、测试、代码质量检查等。本文将深入探讨PyBuilder库的使用......
  • Python 如何优雅的操作 PyMySQL
    一、PyMysql在使用Python操作MySQL数据过的过程中,基本的增删改查操作如何更加高效优雅的执行。这里将以PyMySQL为例,介绍一下如何使用Python操作数据库。Python对MySQL数据库进行操作,基本思路是先连接数据库Connection对象,建立游标Cursor对象,然后执行SQL语句对数据库进行操作......
  • 7个鲜为人知的 Python 好库!
    https://mp.weixin.qq.com/s/eY1QXpwbTNSOd08Wfpg4sQ①-PivotTableJS无需任何代码就可以在JupyterNotebook中交互式地分析数据。https://pypi.org/project/pivottablejs/②-PyTube只需5行代码就可以下载油管视频。可能这个是国内用户最用不到的Python库了。https://pytu......
  • 四款强大的 Python 可视化库
    ......
  • nicegui:Python 图形界面库,简单好用
    前言在现代计算机应用程序开发中,图形用户界面(GUI)是用户与程序交互的重要组成部分。然而,GUI开发往往需要大量的代码和复杂的布局,给开发者带来了一定的挑战。在本篇博文中,将介绍nicegui,它是一个简单易用的图形用户界面库,提供了一种简化GUI开发的方式,使开发者能够更快速地构建吸......
  • locust:Python 分布式压力测试(带WebUI)
    Locust介绍它采用纯Python实现,是一个分布式用户负载测试的工具。使用基于Requests库的客户端发起请求,使编写脚本大大简化;在模拟并发方面摒弃进程和线程,完全基于时间驱动,采用协程(gevent)提供的非阻塞IO和coroutine来实现网络层的并发请求。因此单台压力机也能产生数千......
  • python 集合类型 set
    set定义集合(Set)是一种无序且不重复的数据结构,用于存储一组唯一的元素。时间复杂度O(1)。集合是由一对花括号{}构成,其中每个元素之间用逗号分隔。集合中的元素必须是不可变的(不可修改),可以包含数字、字符串、元组等不可变类型。集合中的元素不重复,即集合中每个元素是唯一的。......