Python传参一些疑问?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python传参一些疑问?相关的知识,希望对你有一定的参考价值。

date=datetime(year=1993,mouth=12,day=30),像这种往datetime函数里传实参,year=1993和直接写个1993有什么区别?甚至我看有些函数两种混用,如: return render(request,'1.html',context=context)

看datetime()函数的原型:

其中前三个参数year, month, day是位置参数,因此传参时可以写参数名,也可以不写参数名。

datetime(2020, 1, 1)

datetime(2020, month=1, day=1)

datetime(year=2020, month=1, day=1)

以上这些传参方式均合法。

参考技术A python的函数传参可以有很多种形式,取决于这函数在定义的时候,参数的声明是怎么写的
def a(x,y): #这叫位置参数,
使用的时候只需要a(1,2)就可以,就会把1和2按顺序赋给xy,而且调用这函数的时候也必须给两个参数
def a(x=1,y=2): #这是叫默认参数,调用这函数的的时候,可以给参数,也可以不给参数,
例如你在调用的时候直接写a(),这样也可以,a函数在运行的时候,x和y会默认被赋值为1和2。如果你调用的时候想要改变x和y的默认值,就需要a(x=3,y=4),写清楚要给哪个参数赋什么值
def a(*x): #这种叫可变参数,
可以传入0个或是无数个参数,在调用a的时候可以写a(1,2,3,4)或是a()

def a(**x): #这种叫关键字参数
也可以可以传入0个或是无数个参数,但在传参数的时候必须指定关键字(相当于传了个字典进来)。例如a('name'='zhangsan','age'=17)追问

所以render函数的context因为定义时候给了默认值,传参时不传也就算了,写的话就必须用键值对方式,不能省略context=是吗

本回答被提问者采纳
参考技术B 直接写值的情况下按参数顺序对应填充,带参数名的情况下可以不按照顺序。如date=datetime(month=12,year=1993,day=30)和date=datetime(day=30,month=12,year=1993)都是等价的书写方式,但是不带参数名就只能写成date=datetime(1993,12,30)。有时候第一个参数用的多经常省略,而后面的为了避免记错位置就会加上参数名。还有一种情况是使用了不定长参数,因为不确定会不会有这个参数,所以必须指定才能使用。追问

函数参数可以不按顺序写,是因为函数定义时,定义的实际是字典类型是吗?嗯,就类似ajax传参是键值对,可以不按顺序,是吗

追答

原理我不太清楚,效果确实是像你说的这样

追问

多谢

参考技术C 甚至我看有些函数两种混用,如: return render(request,'1.html',context=contex 参考技术D 正确的去理解就可以啦。血法完往前,用心去思考。

大爽Python入门教程 4-3 函数传参 形参实参 default*args**kwargs

大爽Python入门公开课教案 点击查看教程总目录

1 回顾参数

先来熟悉下参数,参数在函数头定义。
回顾一下,前两节定义了一些函数的函数头,
例如

  • def calculate_sum(n):
  • def show_course_average(course_name)

这些函数是需要传参的,
n是函数calculate_sum需要的参数。
course_name是函数show_course_average需要的参数。

再例如

  • def simple_func():
    这个函数是不需要传参的。

简而言之,就是定义函数时,
函数头的括号里,定义的就是参数。

2 实参形参 parameter、argument

其实,参数对应的英文有两个
parameter、 argument

很多地方这两个说法是混用的,大多数时候其实也不讲究。
不过这里做教程,严谨的谈论下这两个。

  • parameter 是定义函数时使用的变量,
    也可以说是形式上的参数,形参(formal parameter)
  • argument 是调用函数时传入的变量名,
    也可以说是实际上的参数,实参(actual argument)

举例如下

def calculate_sum(n):  # n: parameter,形参,formal parameter
    k = 1
    s = 0
    for i in range(n):
        s += k / (i + 1)
        k = -k
    print("n=%s: S=%s" % (n, s))

a = 100
calculate_sum(a)  # a: argument,实参,actual argument

大多数时候,不产生混淆的话,都统称为参数就好。

3 参数默认值

一般来讲,parameter的数量和argument的数量需要是一样的。
即声明函数定义了多少个形参,
调用函数时就需要传多少个实参。

但是。。。
也有偷懒的办法。
如果一个形参,常常使用一个值,每次我们都传一遍实参就划不来了。
省事的办法是,在定义函数的地方,我们可以给这个参数一个默认参数值(Default Argument Values)。
如果调用时不写参数,就使用默认的,
写了参数就是用写了的参数。

比如,这是一个非常简单的打招呼的函数。

def greet(name, hello="Hello"):
    print("%s %s" % (hello, name))

greet("Lee")
greet("Lee", "Hi")
greet("Lee", "Welcome")

其输出为

Hello Lee
Hi Lee
Welcome Lee

即调用时,不指定hello变量的值,
则使用默认参数"hello"
指定了,就是用指定的值。

4 传参方式

调用函数时,传入的实参和形参是怎么匹配的呢?
之前的例子,都是通过位置来匹配的。
第一个实参匹配第一个形参,
第二个实参匹配第二个形参,
......

使用这样的匹配方式的参数,也叫做positional arguments
基于位置匹配的参数,简称位置参数。

除了通过位置来匹配,还可以在调用时,使用形参名来匹配。
示例如下

def func(a, b, c):
    print("a: %s" % a)
    print("b: %s" % b)
    print("c: %s" % c)


func(c=2, b=1, a=3)

其输出为

a: 3
b: 1
c: 2

上面这句代码func(c=2, b=1, a=3)
其中abc分别对应三个形参名。
等号后要传给这些形参的实参值。

使用这样的方式传递的参数,叫做keyword argument,
基于形参名匹配的参数,关键字参数。

这两种可以混用,但是注意:
positional arguments必须要在keyword argument之前。

示例如下

def func(a, b, c):
    print("a: %s" % a)
    print("b: %s" % b)
    print("c: %s" % c)

func(1, 2, c=5)

当然,初学者估计会有疑惑,
这两种传参方式哪个好,或者说什么时候用哪个。

这里个人的看法是,
一般能用positional arguments就用positional arguments,
发现这个不行了或者麻烦,再用keyword argument

5 *args

在形参中,*args用于接受不定数量的位置参数positional arguments
并会将这些参数打包放在元组中

具体见下

def func(*args):
    print(args)

func()
func(1)
func(1, 2)
func(1, 2, 5)

输出如下

()
(1,)
(1, 2)
(1, 2, 5)

注意,这里的核心是*符号,后面的args换成别的名字也可以。

6 **kwargs

在形参中,*args用于接受不定数量的关键词参数keyword argument
并会将这些参数打包放在字典中

具体见下

def func(**kwargs):
    print(kwargs)

func()
func(a=1)
func(a=1, bb=2)
func(a=1, b=2, value=5)

输出如下

{}
{\'a\': 1}
{\'a\': 1, \'bb\': 2}
{\'a\': 1, \'b\': 2, \'value\': 5}

注意,这里的核心是**符号,后面的kwargs换成别的名字也可以。

*args**kwargs暂时不需要会用,能看懂代码就行。

以上是关于Python传参一些疑问?的主要内容,如果未能解决你的问题,请参考以下文章

对于python中的方法find的一些疑问

python进程--传参,for循环创建,join方法

python 关于CNN的一些思考-2022

Python多线程传参

Python3脚本传参实战(2个方法3个传参列表的案例)

Python能做些什么及我的Python学习疑问