189 8069 5689

python传入函数参数 python通过命令行传入参数

Python的函数和参数

parameter 是函数定义的参数形式

成都创新互联公司专业为企业提供龙华网站建设、龙华做网站、龙华网站设计、龙华网站制作等企业网站建设、网页设计与制作、龙华企业网站模板建站服务,10余年龙华做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。

argument 是函数调用时传入的参数实体。

对于函数调用的传参模式,一般有两种:

此外,

也是关键字传参

python的函数参数定义一般来说有五种: 位置和关键字参数混合 , 仅位置参数 , 仅关键字参数 , 可变位置参数 , 可变关键字参数 。其中仅位置参数的方式仅仅是一个概念,python语法中暂时没有这样的设计。

通常我们见到的函数是位置和关键字混合的方式。

既可以用关键字又可以用位置调用

这种方式的定义只能使用关键字传参的模式

f(*some_list) 与 f(arg1, arg2, ...) (其中some_list = [arg1, arg2, ...])是等价的

网络模块request的request方法的设计

多数的可选参数被设计成可变关键字参数

有多种方法能够为函数定义输出:

非常晦涩

如果使用可变对象作为函数的默认参数,会导致默认参数在所有的函数调用中被共享。

例子1:

addItem方法的data设计了一个默认参数,使用不当会造成默认参数被共享。

python里面,函数的默认参数被存在__default__属性中,这是一个元组类型

例子2:

在例子1中,默认参数是一个列表,它是mutable的数据类型,当它写进 __defauts__属性中时,函数addItem的操作并不会改变它的id,相当于 __defauts__只是保存了data的引用,对于它的内存数据并不关心,每次调用addItem,都可以修改 addItem.__defauts__中的数据,它是一个共享数据。

如果默认参数是一个imutable类型,情况将会不一样,你无法改变默认参数第一次存入的值。

例子1中,连续调用addItem('world') 的结果会是

而不是期望的

Python函数的参数类型

Python函数的参数类型主要包括必选参数、可选参数、可变参数、位置参数和关键字参数,本文介绍一下他们的定义以及可变数据类型参数传递需要注意的地方。

必选参数(Required arguments)是必须输入的参数,比如下面的代码,必须输入2个参数,否则就会报错:

其实上面例子中的参数 num1和num2也属于关键字参数,比如可以通过如下方式调用:

执行结果:

可选参数(Optional arguments)可以不用传入函数,有一个默认值,如果没有传入会使用默认值,不会报错。

位置参数(positional arguments)根据其在函数定义中的位置调用,下面是pow()函数的帮助信息:

x,y,z三个参数的的顺序是固定的,并且不能使用关键字:

输出:

在上面的pow()函数帮助信息中可以看到位置参数后面加了一个反斜杠 / ,这是python内置函数的语法定义,Python开发人员不能在python3.8版本之前的代码中使用此语法。但python3.0到3.7版本可以使用如下方式定义位置参数:

星号前面的参数为位置参数或者关键字参数,星号后面是强制关键字参数,具体介绍见强制关键字参数。

python3.8版本引入了强制位置参数(Positional-Only Parameters),也就是我们可以使用反斜杠 / 语法来定义位置参数了,可以写成如下形式:

来看下面的例子:

python3.8运行:

不能使用关键字参数形式赋值了。

可变参数 (varargs argument) 就是传入的参数个数是可变的,可以是0-n个,使用星号( * )将输入参数自动组装为一个元组(tuple):

执行结果:

关键字参数(keyword argument)允许将任意个含参数名的参数导入到python函数中,使用双星号( ** ),在函数内部自动组装为一个字典。

执行结果:

上面介绍的参数可以混合使用:

结果:

注意:由于传入的参数个数不定,所以当与普通参数一同使用时,必须把带星号的参数放在最后。

强制关键字参数(Keyword-Only Arguments)是python3引入的特性,可参考:。 使用一个星号隔开:

在位置参数一节介绍过星号前面的参数可以是位置参数和关键字参数。星号后面的参数都是强制关键字参数,必须以指定参数名的方式传参,如果强制关键字参数没有设置默认参数,调用函数时必须传参。

执行结果:

也可以在可变参数后面命名关键字参数,这样就不需要星号分隔符了:

执行结果:

在Python对象及内存管理机制中介绍了python中的参数传递属于对象的 引用传递 (pass by object reference),在编写函数的时候需要特别注意。

先来看个例子:

执行结果:

l1 和 l2指向相同的地址,由于列表可变,l1改变时,l2也跟着变了。

接着看下面的例子:

结果:

l1没有变化!为什么不是[1, 2, 3, 4]呢?

l = l + [4]表示创建一个“末尾加入元素 4“的新列表,并让 l 指向这个新的对象,l1没有进行任何操作,因此 l1 的值不变。如果要改变l1的值,需要加一个返回值:

结果:

下面的代码执行结果又是什么呢?

执行结果:

和第一个例子一样,l1 和 l2指向相同的地址,所以会一起改变。这个问题怎么解决呢?

可以使用下面的方式:

也可以使用浅拷贝或者深度拷贝,具体使用方法可参考Python对象及内存管理机制。这个问题在Python编程时需要特别注意。

本文主要介绍了python函数的几种参数类型:必选参数、可选参数、可变参数、位置参数、强制位置参数、关键字参数、强制关键字参数,注意他们不是完全独立的,比如必选参数、可选参数也可以是关键字参数,位置参数可以是必选参数或者可选参数。

另外,python中的参数传递属于对象的 引用传递 ,在对可变数据类型进行参数传递时需要特别注意,如有必要,使用python的拷贝方法。

参考文档:

--THE END--

python怎么给函数传参

函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题。基本的参数传递机制有两

种:值传递和引用传递。

推荐:Python教程

值传递(passl-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间以存放由主调函数放

进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函

数的实参变量的值。

引用传递(pass-by-reference)过程中,被调函数的形式参数虽然也作为局部变量在堆栈中开辟了内存空间,但是这时存放的是由主调函

数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过堆栈中存放的地址访问主调函数中的实参变量。正

因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。

更多技术请关注Python视频教程。

Python 的函数是怎么传递参数的

首先你要明白,Python的函数传递方式是赋值,而赋值是通过建立变量与对象的关联实现的。

对于你的代码:

执行 d = 2时,你在__main__里创建了d,并让它指向2这个整型对象。

执行函数add(d)过程中:

d被传递给add()函数后,在函数内部,num也指向了__main__中的2

但执行num = num + 10之后,新建了对象12,并让num指向了这个新对象——12。

如果你明白函数中的局部变量与__main__中变量的区别,那么很显然,在__main__中,d仍在指着2这个对象,它没有改变。因此,你打印d时得到了2。

如果你想让输出为12,最简洁的办法是:

在函数add()里增加return num

调用函数时使用d = add(d)

代码如下:

def add(num):

num += 10

return num

d = 2

d = add(d)

print d

python函数调用的参数传递

python的函数参数传递是"引用传递(地址传递)"。

python中赋值语句的过程(x = 1):先申请一段内存分配给一个整型对象来存储数据1,然后让变量x去指向这个对象,实际上就是指向这段内存(这里有点和C语言中的指针类似)。

在Python中,会为每个层次生成一个符号表,里层能调用外层中的变量,而外层不能调用里层中的变量,并且当外层和里层有同名变量时,外层变量会被里层变量屏蔽掉。函数  调用  会为函数局部变量生成一个新的符号表。

局部变量:作用于该函数内部,一旦函数执行完成,该变量就被回收。

全局变量:它是在函数外部定义的,作用域是整个文件。全局变量可以直接在函数里面应用,但是如果要在函数内部改变全局变量,必须使用global关键字进行声明。

注意 :默认值在函数  定义  作用域被解析

在定义函数时,就已经执行力它的局部变量

python中不可变类型是共享内存地址的:把相同的两个不可变类型数据赋给两个不同变量a,b,a,b在内存中的地址是一样的。

python怎么向类中的函数传递参数

Python中函数参数的传递是通过“赋值”来传递的。但这条规则只回答了函数参数传递的“战略问题”,并没有回答“战术问题”,也就说没有回答怎么赋值的问题。函数参数的使用可以分为两个方面,一是函数参数如何定义,二是函数在调用时的参数如何解析的。而后者又是由前者决定的。函数参数的定义有四种形式:

1. F(arg1,arg2,...)

2. F(arg2=value,arg3=value...)

3. F(*arg1)

4. F(**arg1)

第1 种方式是最“传统”的方式:一个函数可以定义不限个数参数,参数(形式参数)放在跟在函数名后面的小括号中,各个参数之间以逗号隔开。用这种方式定义的函数在调用的时候也必须在函数名后的小括号中提供相等个数的值(实际参数),不能多也不能少,而且顺序还必须相同。也就是说形参和实参的个数必须一致,而且想给形参1的值必须是实参中的第一位,形参与实参之间是一一对应的关系,即“形参1=实参1 形参2=实参2...”。很明显这是一种非常不灵活的形式。比如:"def addOn(x,y): return x + y",这里定义的函数addOn,可以用addOn(1,2)的形式调用,意味着形参x将取值1,主将取值2。addOn(1,2,3)和addOn (1)都是错误的形式。

第2种方式比第1种方式,在定义的时候已经给各个形参定义了默认值。因此,在调用这种函数时,如果没有给对应的形式参数传递实参,那么这个形参就将使用默认值。比如:“def addOn(x=3,y=5): return x + y”,那么addOn(6,5)的调用形式表示形参x取值6,y取值5。此外,addOn(7)这个形式也是可以的,表示形参x取值7,y取默认值5。这时候会出现一个问题,如果想让x取默认值,用实参给y赋值怎么办?前面两种调用形式明显就不行了,这时就要用到Python中函数调用方法的另一大绝招 ──关健字赋值法。可以用addOn(y=6),这时表示x取默认值3,而y取值6。这种方式通过指定形式参数可以实现可以对形式参数进行“精确攻击”,一个副带的功能是可以不必遵守形式参数的前后顺序,比如:addOn(y=4,x=6),这也是可以的。这种通过形式参数进行定点赋值的方式对于用第1种方式定义的函数也是适用的。

上面两种方式定义的形式参数的个数都是固定的,比如定义函数的时候如果定义了5个形参,那么在调用的时候最多也只能给它传递5个实参。但是在实际编程中并不能总是确定一个函数会有多少个参数。第3种方式就是用来应对这种情况的。它以一个*加上形参名的方式表示,这个函数实际参数是不一定的,可以是零个,也可以是N个。不管是多少个,在函数内部都被存放在以形参名为标识符的tuple中。比如:

对这个函数的调用addOn() addOn(2) addOn(3,4,5,6)等等都是可以的。

与第3种方式类似,形参名前面加了两个*表示,参数在函数内部将被存放在以形式名为标识符的dictionary中。这时候调用函数必须采用key1=value1、key2=value2...的形式。比如:

1. def addOn(**arg):

2. sum = 0

3. if len(arg) == 0: return 0

4. else:

5. for x in arg.itervalues():

6. sum += x

7. return sum

那么对这个函数的调用可以用addOn()或诸如addOn(x=4,y=5,k=6)等的方式调用。

上面说了四种函数形式定义的方式以及他们的调用方式,是分开说的,其实这四种方式可以组合在一起形成复杂多样的形参定义形式。在定义或调用这种函数时,要遵循以下规则:

1. arg=value必须在arg后

2. *arg必须在arg=value后

3. **arg必须在*arg后

在函数调用过程中,形参赋值的过程是这样的:

首先按顺序把“arg”这种形式的实参给对应的形参

第二,把“arg=value”这种形式的实参赋值给形式

第三,把多出来的“arg”这种形式的实参组成一个tuple给带一个星号的形参

第四,把多出来的“key=value”这种形式的实参转为一个dictionary给带两个星号的形参。

例子:

1. def test(x,y=5,*a,**b):

2. print x,y,a,b

就这么一个简单函数,来看看下面对这个函数调用会产生什么结果:

test(1) === 1 5 () {}

test(1,2) === 1 2 () {}

test(1,2,3) === 1 2 (3,) {}

test(1,2,3,4) === 1 2 (3,4)

test(x=1) === 1 5 () {}

test(x=1,y=1) === 1 1 () {}

test(x=1,y=1,a=1) === 1 1 () {'a':1}

test(x=1,y=1,a=1,b=1) === 1 1 () {'a':1,'b':1}

test(1,y=1) === 1 1 () {}

test(1,2,y=1) === 出错,说y给赋了多个值

test(1,2,3,4,a=1) === 1 2 (3,4) {'a':1}

test(1,2,3,4,k=1,t=2,o=3) === 1 2 (3,4) {'k':1,'t':2,'o':3}


网页题目:python传入函数参数 python通过命令行传入参数
分享链接:http://cdxtjz.com/article/hjhesi.html

其他资讯