1楼:育知同创教育
刚学用python的时候,特别是看一些库的源码时,经常会看到func(*args, **kwargs)这样的函数定义,这个*和**让人有点费解。其实只要把函数参数定义搞清楚了,就不难理解了。
先说说函数定义,我们都知道,下面的**定义了一个函数funca
def funca():
pass
显然,函数funca没有参数(同时啥也不干:d)。
下面这个函数funcb就有两个参数了,
def funcb(a, b):
print a
print b
调用的时候,我们需要使用函数名,加上圆括号扩起来的参数列表,比如 funcb(100, 99),执行结果是:
10099
很明显,参数的顺序和个数要和函数定义中一致,如果执行funcb(100),python会报错的:
typeerror: funcb() takes exactly 2 arguments (1 given)
我们可以在函数定义中使用参数默认值,比如
def funcc(a, b=0):
print a
print b
在函数funcc的定义中,参数b有默认值,是一个可选参数,如果我们调用funcc(100),b会自动赋值为0。
ok,目前为止,我们要定义一个函数的时候,必须要预先定义这个函数需要多少个参数(或者说可以接受多少个参数)。一般情况下这是没问题的,但是也有在定义函数的时候,不能知道参数个数的情况(想一想c语言里的printf函数),在python里,带*的参数就是用来接受可变数量参数的。看一个例子
def funcd(a, b, *c):
print a
print b
print "length of c is: %d " % len(c)
print c
调用funcd(1, 2, 3, 4, 5, 6)结果是12
length of c is: 4
(3, 4, 5, 6)
我们看到,前面两个参数被a、b接受了,剩下的4个参数,全部被c接受了,c在这里是一个tuple。我们在调用funcd的时候,至少要传递2个参数,2个以上的参数,都放到c里了,如果只有两个参数,那么c就是一个empty tuple。
好了,一颗星我们弄清楚了,下面轮到两颗星。
上面的例子里,调用函数的时候,传递的参数都是根据位置来跟函数定义里的参数表匹配的,比如funcb(100, 99)和funcb(99, 100)的执行结果是不一样的。在python里,还支持一种用关键字参数(keyword argument)调用函数的办法,也就是在调用函数的时候,明确指定参数值付给那个形参。比如还是上面的funcb(a, b),我们通过这两种方式调用
funcb(a=100, b=99)
和funcb(b=99, a=100)
结果跟funcb(100, 99)都是一样的,因为我们在使用关键字参数调用的时候,指定了把100赋值给a,99赋值给b。也就是说,关键字参数可以让我们在调用函数的时候打乱参数传递的顺序!
另外,在函数调用中,可以混合使用基于位置匹配的参数和关键字参数,前题是先给出固定位置的参数,比如
def funce(a, b, c):
print a
print b
print c
调用funce(100, 99, 98)和调用funce(100, c=98, b=99)的结果是一样的。
好了,经过以上铺垫,两颗星总算可以出场了:
如果一个函数定义中的最后一个形参有 ** (双星号)前缀,所有正常形参之外的其他的关键字参数都将被放置在一个字典中传递给函数,比如:
def funcf(a, **b):
print a
for x in b:
print x + ": " + str(b[x])
调用funcf(100, c='你好', b=200),执行结果
100c: 你好
b: 200
大家可以看到,b是一个dict对象实例,它接受了关键字参数b和c。
python 一个函数怎么使用另一个函数内的变量
2楼:一猪之哀伤一
例如一个函数内有一个变量i,怎么在函数外或另一个函数中调用或更改它。新手学习,谢谢。
******************************
不能在函数外更改某函数里的局部变量,因为每当你实例化那个函数的时候,那个函数里面的局部变量也会被重新赋值,重新定义,谈何更改呢?
这一个全部变量和局部变量的问题,如果要实现楼主说的,必须使用全局变量(类中的self):
***************=bianliang.py**********=
#coding: utf-8
i = 0 #定义一个全局变量i
def a():
'''打印出i的值
'''print i
def b():
global i
a() #调用a方法
print i #打印i
i = 1000 #重新赋值i
print i #打印i
a() #再次调用a方法
b()******************************===
%python bianliang.py00
1000
1000
这个py文件里面使用了一个全局变量i,实现了a方法和b方法共用参数i
3楼:细雨摇琴
用闭包再来看看专业的解释:闭包(closure)是词法闭包(lexical closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。
所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。
defmake_adder(addend):
defadder(augend):
returnaugend+addendreturnadder
p=make_adder(23)
q=make_adder(44)printp(100)printq(100)
运行结果:
123144
python中怎么在自定义函数调用另外一个函数中的参数
4楼:匿名用户
>>>defa():
globalq
q=1+2
returnq
>>>defb():
a()c=2+q
print(c)
>>>b()
5>>>q
3函数中的变量在外面调用,需要申明为全局变量
python问题 我想创建一个一个参数的函数:引用一个全局变量作为参数,然后在这个函数里面这个全局 20
5楼:bella_鑫
全局变量 不可以作为形参。也就是说 他不能被函数引用
可以参考一下这个**的回答:网页链接
6楼:匿名用户
给你写一小段**。
importos,sys,time,tracebackglobalsomething_count_as_global#something_count_as_global=3#initthevalue
defcall_many_times():
globalsomething_count_as_global#thisdeclareisimportant
something_count_as_global+=1deftest():
globalsomething_count_as_globalforiinrange(10):
call_many_times()
printsomething_count_as_global#expected,3,4,5,...12
if __name__=="__main__":
test()
python中怎么把一个函数定义为另一个函数的变量
7楼:可靠的我心我在
defa(n):
printn
defb(c):
printc
b(a(2))
可以这样子用,只是不知道你的应用场景是什么?有这样的要求因为你可以直接在b函数调用a函数
defb():
a(2)
8楼:匿名用户
可以,然后在adc2里面直接adc1()就可以调用adc1这个函数了
9楼:
题主要表达的是这样意思吧?
defabc1(x):
...defabc2(x,y):
z=x(y)
...if__name__=='__main__':
abc2(abc1,1)
10楼:戢玉花恭午
例如一个函数内有一个变量i,怎么在函数外或另一个函数中调用或更改它。新手学习,谢谢。
******************************
不能在函数外更改某函数里的局部变量,因为每当你实例化那个函数的时候,那个函数里面的局部变量也会被重新赋值,重新定义,谈何更改呢?
这一个全部变量和局部变量的问题,如果要实现楼主说的,必须使用全局变量(类中的self):
***************=bianliang.py**********=
#coding:
utf-8i=
0#定义一个全局变量i
defa():
'''打印出i的值
idef
b():
global
ia()
#调用a方法
i#打印ii=
1000
#重新赋值i
i#打印i
a()#再次调用a方法
b()******************************===
%python
bianliang.py00
1000
1000
这个py文件里面使用了一个全局变量i,实现了a方法和b方法共用参数i
python里面的函数怎么按引用传递参数
11楼:福喜
如果你用c给matlab写过mex程序,那
么这个问题是很容易理解的(好像每次讨论python问题时我总是把matlab搬了出来…… 《在matlab中把struct当成python中的dictionary使用》《matlab和python的几种数据类型的比较》)。
既然提到了mex,就简单说一下:
一个matlab可能形如
function ret=add3(a,b,c)
如果在c的层面实现这个函数,就会看到另一种景象:
void mexfunction(int nlhs,mxarray * plhs,int nrhs,const mxarray * prhs)
a,b,c三个参数的地址放在一个指针数组里,然后把这个指针数组的首地址作为参数prhs传递给函数,这说明matlab函数的参数是传递指针的,而不是值传递。
纵然是传递的指针,但是却不能在函数里改变实参的值,因为标记为“const”了。
python是开放源码的,我没有看。所以下面很多东西是猜的。
python在函数的参数传递时用的什么手法?实验一下(使用activepython2.5):
首先介绍一个重要的函数:
>>> help(id)
help on built-in function id in module __builtin__:
id(...)
id(object) -> integer
return the identity of an object. this is guaranteed to be unique among
simultaneously existing objects. (hint: it's the object's memory address.)
看最后括号里那句:hint:it's the object's address.(它是对象的地址)
有了这个函数,下面的事情就方便多了。
>>> a=0
>>> id(a)
3630228
>>> a=1
>>> id(a)
3630216
可以看出,给a赋一次值,a的address就改变了。在c的层面看,(也许真实情况不是下面的样子,但作为一个类比应该还是可以的):
void * pa;
pa=malloc(sizeof(int));
*(int *)pa=0;
free(pa);
pa=malloc(sizeof(int));
*(int *)pa=1;
python中每次赋值会改变变量的address,分配新的内存空间,所以python中对于类型不像c那样严格要求。
下面看看python函数参数传递时到底传的什么:
有一个函数:
>>> def changea(a):
... print id(a)
... a=100
... print id(a)
设定一个变量var1:
>>> var1=10
>>> id(var1)
3630108
>>> changea(var1)
3630108
3631012
>>> var1
10调用函数后,从两次print的结果可以看出,传递确实是地址。但是即便如此,在函数内对形参的修改不会对实参造成任何实质的影响,因为对形参的重新赋值,只是改变了形参所指向的内存单元(changea里两次调用print id(a)得到不同的结果),却没有改变实参的指向。在c的层面看也许类似下面的情节:
void changea(void * pa)
精通c的你一眼就看出这个函数永远也改变不了它外面的世界。
也就是说虽然传递的是地址,但像changea这样的函数改变不了实参的值。
也许会感到困扰?不,我已经在matlab中习惯了。
一个最典型的例子就是matlab中删除结构体成员的rmfield函数(参见《matlab笔记三则》),
(matlab版本7.0.1)
如果想删除结构体patient的name成员,用
rmfield(patient, 'name');
是永远达不到目的的(就像试图用双手抓住自己的领子,把自己提到空中);
迷途知返的做法是:
patient = rmfield(patient, 'name');
如何定义不定参数函数,C++定义栈怎么定义,该有什么函数
1楼 匿名用户 举个例子 ,传入不定参数函数printf typedef int fun const char void func fun fp int main c 定义栈怎么定义,该有什么函数 2楼 千锋教育 1 进栈 push 算法 若top n时,则给出溢出信息,作出错处理 进栈前首先检查栈...
EXCEL中怎么使用函数进行按条件统计人数
1楼 匿名用户 假设数据在a2 b999这个 bai区域,在d1根据实du际需要输入日期d2数组zhi公式,输入完成后不dao要直接回车,内要按三键 ctrl shift 回车 结束容。 count 0 match a2 a999 b2 b999 a2 a999 b2 b999 row 1 998 ...
Excel if函数的使用嵌套超过7层怎么办
1楼 阳光上的桥 改用别的函数,例如vlookup,或者使用临时变量。 具体处理请粘贴你的公式,或者分享文件帮你做好。 2楼 天雨下凡 用别的公式代替,比如用lookup公式 excel的if函数嵌套超过七层怎么办,一共有18个范围,具体公式如下 3楼 匿名用户 首先你的公式表述就是错误的,0 f2...