首页 > 其他分享 >函数参数问题

函数参数问题

时间:2024-11-02 23:44:28浏览次数:4  
标签:city 关键字 args 问题 函数参数 job 参数 kw

  • 位置参数

必选参数,必须按照位置次序,依次传入参数。

def power(x, n):
    s = 1
    while n > 0:
        n -= 1
        s = s * x
    return s

 

  • 默认参数

给参数赋予值时,就是默认参数

1、是必选参数在前,默认参数在后,否则Python的解释器会报错

def power(x, n=2):
    s = 1
    while n > 0:
        n -= 1
        s = s * x
    return s

2、传入默认参数的必须是不可变参数,不然会影响后续调用

def func(x=[], y=[6, 7]):  # 默认参数一定要用不可变对象
    # Python 中,函数的默认参数在函数定义时被创建,并且在每次函数调用时都会重用相同的对象。
    # 因此,当对默认参数进行修改时,这些修改会影响到下一次对该函数的调用。
    print("此时默认值:", x, y)
    x.append(8)
    y.append(8)
    return x + y


a, b = [1, 2], [3, 4]
t = func(x=a)  # 运行结束时,默认参数x=[],y=[6,7,8],x被赋值,没有改变其默认值,y没有赋值,y.append语句改变的是y默认值的值。
func()  # 执行完该语句,默认参数x=[8],y=[6,7,8,8]
t = func(y=b)  # 默认参数x=[8,8],y=[6,7,8,8]
func()

func被定义时,列表[],[6, 7]在内存中被创建,当调用该func没有传入参数时,并且在func中改变了默认参数变量x,y值时,实际上改变的时内存地址中的列表的值,所以会影响下次默认参数的调用。若传入了参数,则进行操作的时传入的参数,原默认参数变量值不会改变。

 

  • 可变参数

1、可变,指的是传入参数是不确定个数的,0个或任意个,并且传入的参数被自动封装为一个tuple,并传入函数内的变量,定义时参数前加*

2、对于list 或tuple数据,传入函数时,可以变量前加*

def calc(*numbers):
    sum1 = 0
    for n in numbers:  # 允许传入0个或任意个参数,*number被自动封装一个元组
        sum1 += n * n
    return sum1


nums = [1, 2, 3, 4, 5, 6, 7, 8]
print(calc(*nums))  # list or tuple前加一个*表示其中元素变成可变参数传进去

 

  • 关键字参数

1、 允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict

2、传入参数为字典时,可以变量前面加**,此时函数中kw接受到一个该变量拷贝的字典

def person(name, age, **kw):
    print('name:', name, 'age:', age, 'other:', kw)、
person('Michael', 30)
person('Bob', 12, city='Beijing')
person('Jack', 14, gender='M', job='Engineer')
extra = {'city': 'Beijing', 'job': 'Engineer'}
person('Jack', 14, **extra) # **extra 表示把extra字典中的key-value用作关键字传入函数**kw,kw获得一个extra拷贝的字典

 

  • 命名关键字参数

当只想传入某几个关键字参数时,可以该参数对传入的参数进行限制

1、定义时采用 * 间隔的方式,命名关键字参数需要一个特殊分隔符**后面的参数被视为命名关键字参数

  当函数中有可变参数是,不需要分隔符*了,后面的参数默认是命名关键字参数

def person1(name, age, *, city, job):  # 表示只接受,关键字为city and job的参数
    print('name:', name, 'age:', age, 'city:', city, 'job:', job)
def person2(name, age, *args, city, job):
    print(name, age, args, city, job)

2、命名关键字参数必须传入参数名,不然会将传入的参数认为是*args。并且必须传入city和job值,不然也会报错

person1('Jack', 24, job='Engineer')
TypeError: person1() missing 1 required keyword-only argument: 'city'

3、当定义时,命名关键字参数有默认值时,则调用时可以缺省该变量

def person(name, age, *, city='Beijing', job):
    print(name, age, city, job)
person('Jack', 24, job='Engineer')

 

  • 参数组合

 1、参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数

def f1(a, b, c=0, *args, **kw):
    print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)

def f2(a, b, c=0, *, d, **kw):
    print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)
args = (1, 2, 3, 4)
kw = {'d': 99, 'x': '#'}
f1(*args, **kw)
a = 1 b = 2 c = 3 args = (4,) kw = {'d': 99, 'x': '#'}


args = (1, 2, 3)
kw = {'d': 88, 'x': '#'}
f2(*args, **kw)
a = 1 b = 2 c = 3 d = 88 kw = {'x': '#'}

2、对传入的*tuple 和 *kw 进行类似于“解包” 的操作,并依次将其中每一个元素,赋予位置参数、默认参数、可变参数、命名关键字参数、关键字参数

但此时命名关键字参数不能缺省,一定要在kw中以 dict 形式存在,不然会报错

f2(1, 2, d=99, ext=None)
args = (1, 2, 3)
kw = {'f': 88, 'x': '#'}
f2(*args, **kw)
TypeError: f2() missing 1 required keyword-only argument: 'd'

 

标签:city,关键字,args,问题,函数参数,job,参数,kw
From: https://www.cnblogs.com/serendipity-prayer/p/18522659

相关文章

  • 《上古卷轴3:晨风》遭遇dll丢失问题:ffmpeg.dll丢失的多种解决策略
    《上古卷轴3:晨风》(TheElderScrollsIII:Morrowind)是一款经典的RPG游戏,但在运行过程中可能会遇到各种DLL文件丢失的问题,例如ffmpeg.dll。以下是一些解决ffmpeg.dll缺失问题的多种策略:重新安装游戏最直接的方法是重新安装游戏,确保所有文件都完整无缺。•彻底卸载:•在控制......
  • 隧道视野 | 埃尔德·沙菲尔:当人们疲于应付诸多问题时,他们就不再试图解决所有的问题,而
    注:本文为几篇关于隧道视野的文章合辑。什么是“隧道视野(TunnelVision)”?如何应对?原创LouisaWW的神秘学笔记本2023年07月24日12:49湖南TunnelVision,隧道视野(视野狭窄)“我们看到的并不是事物本来的样子,而是我们自己本来的样子。”部分观点不太全面,请带着“批判性......
  • 设计Python函数参数的19个高级指南
    我们将深入探讨如何设计Python函数的参数,让你的代码更加灵活、高效和易用。我们会从基础开始,逐步引入更高级的概念和技术,确保你能够全面掌握这些技巧。包含编程资料、学习路线图、源代码、软件安装包等!【[点击这里]】领取!1.使用默认参数值理论知识:默认参数值允许你在......
  • 升级python版本后遇到的问题
    错误信息提示虚拟环境报错:删除venv文件后,重启pycharm,再次添加虚拟环境即可 升级python版本后MobileBy报错,python3.11升级为python3.12.3把 fromappium.webdriver.common.mobilebyimportMobileBy改为fromappium.webdriver.common.appiumbyimportAppiumBy即可 Fil......
  • 动态规划 —— 路径问题-地下城游戏
    1. 地下城游戏题目链接:174.地下城游戏-力扣(LeetCode)https://leetcode.cn/problems/dungeon-game/description/ 2. 算法原理 状态表示:以莫一个位置位置为结尾或者以莫一个位置为起点  dp[i,j]表示:到达[i,j]位置的时候,骑士所需要的最低初始健康点数(X),这个状......
  • 背包九讲——树形背包问题(有依赖的背包)
    目录树形背包问题问题引入:问题解读:算法例题:10.有依赖的背包问题-AcWing题库题目:算法实现:代码实现:背包问题第七讲——树形背包问题(有依赖的背包)背包问题是一类经典的组合优化问题,通常涉及在限定容量的背包中选择物品,以最大化某种价值或利益。问题的一般描述是:有一......
  • CPP学习 用栈容器解决问题示例,判断括号是否成对出现
    #include<string>#include<iostream>#include<stack>usingnamespacestd;boolisbalanced(conststring&str){intlen=str.size();stack<char>mystack;for(inti=0;i<len;i++){if(str[i]==&......
  • 分组背包问题
    分组背包问题问题有NNN组物品和一个容量是VVV的背包。每组物品有......
  • 关于Copilot出现:You don`t have access to Github Copilot .....的问题解决方案
    前面如何如何配置,以及如何如何上传学生证资料等我这里不赘述badendinghappyending出现这个界面这个问题就是set_up不是很完全,设置一下就行disable改为enable等这样再回去IDE,就可以正常使用了......
  • wait-notify代码(生产者-消费者问题)
    生产者-消费者问题是经典的多线程同步问题,可以使用Java中的wait()和notify()方法来解决。以下是一个简单的示例代码,展示了如何使用这些方法来处理生产者-消费者问题。在这个示例中,我们有一个共享的缓冲区(队列),生产者生产数据并将其放入缓冲区,消费者从缓冲区中取出数据进行处理......