本文共 4005 字,大约阅读时间需要 13 分钟。
5、参数
Python中的参数分如下几类:
5.1必备参数
必备参数在传入时,函数调时给的参数数量、顺序都必须和声明时一样,否则就会报错。如:
声明一个这样的函数:def info(name, age, tel) :
调用info函数时,必须传入三个参数,并且参数的顺序也必须是name, age, tel,如:
info('jack', 20,'13567867878')
以上函数调用后,参数按顺序匹配:
name=’jack’,age=20,tel=’13567867878’5.2命名参数
命名参数就是在调用函数时,通过参数的命名来确定传入的参数值。这样你不仅可以跳过不传的参数,还可以乱序传参,因为Python解释器能够用参数名来匹配参数值。
实例:#!/usr/bin/pythondef sum(x, y) : #求两个数之和 return x + y#调用sum函数sum(y = 10, x = 5)
执行结果:
15
函数会按参数名字去匹配形参,并把传入的值赋给它。
需要注意的是,传参时命名参数必须在非命名参数的后面,否则就会报SyntaxError: non-keyword arg after keyword arg的错误。如下例:def sum(x, y, z) : #求三个数之和 return x + y + z
调用sum函数
>>> sum(x=1,2,4) File "", line 1SyntaxError: non-keyword arg after keyword arg
上面调用就报错了。那如果下面这样调用又对不对呢?
>>> sum(2,4,x=1)Traceback (most recent call last): File "", line 1, in TypeError: sum() got multiple values for keyword argument 'x'
同样我们看到,还是报错了。这次的错误是说x参数被赋了多次值。按照顺序,2赋给x,4赋给y,但是后面又给了一个命名参数x=1,这样就导致x参数被多次赋值,这是不允许的。那怎样才是对的呢?
sum(2, 4, z=2) #这样调用是正确的
5.3缺省参数
在定义函数时,有时候会默认给某些参数赋一个初始值,这样的参数就叫缺省值。调用函数时,如果缺省参数的值没有传入,则直接调用默认值。
实例:#!/usr/bin/pythondef sum(x, y, z=100) : #求三个数之和 return x + y + z#调用sum函数,缺省z参数,z将使用默认值sum(y = 10, x = 5)
执行结果:
115
看下面的例子:
>>> def printInfo(name, age=20, sex) :... #求三个数之和... print name,... print age,... print sex... File "", line 1SyntaxError: non-default argument follows default argument
初看程序感觉写的没错啊,但是为什么就报错了呢?其实原因也很简单,看一下报错信息就知道了”语法错误“,仔细检查会发现,定义函数时缺省参数也必须放在非缺省参数的后面。所以下面函数的定义是正确的。
def printInfo(name, sex, age=20) : #求三个数之和 print name, print age, print sex
5.4不定长参数
你可能需要一个函数能处理比当初声明时更多的参数,这些参数叫不定长参数,和上述几种参数不同,不定长参数在声明时不会给命名。基本语法如下:
def functionName([formal_args,] *var_args_tuple) : "函数说明" function_suite return [expression]
声明函数时,前面加了星号(*)的变量名会存放所有未命名的变量参数,也可以不传这些参数,并且这些参数是存在变量名为var_args_tuple的元组中的。
实例:#!/usr/bin/pythondef printInfo(arg1, *vartuple) : print arg1 print "vartuple :",vartuple for i in vartuple : print i,
调用printInfo函数,查看执行结果
>>> printInfo(8)8vartuple : ()>>> printInfo(1,5,6,7,8,9)1vartuple : (5, 6, 7, 8, 9)5 6 7 8 9
不定长参数中除了使用元组,还可以使用字典,字典是用两个星号(**)表示的。
实例1:#!/usr/bin/pythondef printInfo(arg1, **varDict) : print arg1 print "varDict:" for key, value in varDict.items() : print key, value
调用函数,并查看执行结果:
>>> printInfo(8)8varDict:>>> printInfo(1,a=1,c=12,d=32)1varDict:a 1c 12d 32
实例2:
>>> def printInfo(a, c=4, *tup, **dic) :... print a... print c... print tup... print dic...
调用执行:
>>> printInfo(2,3,4,5, x=1, y=2)23(4, 5){ 'y': 2, 'x': 1}
按照参数赋值顺序,a=2,c=3,4和5存在元组tup中,x=1, y=2存在字典dic中。
由此可以看出,传参时元组和字典传参的区别,元组就跟传普通参数一样,而字典中的元素是由键值对组成,所以传参时就需要传键值表达式。6、return 语句
return语句的语法格式:
return [表达式]
return 语句表示退出函数,选择性地向调用方返回一个表达式或者是一个值或者由多个返回值组成的元组。不带参数值的return语句返回None。如果函数不需要返回值,也可以不用写return语句。
实例:def printInfo(arg1, arg2) : sum = arg1 + arg2 return sum
上面的函数表示返回两个数的和。
7、变量作用域
一个程序的所有变量并不是在哪个位置都可以访问的。访问权限决定于这个变量是在哪里赋值的。
变量的作用域决定了在哪一部分你可以访问哪个特定的变量名称。变量分为局部变量和全局变量。7.1 局部变量
定义在函数内部的变量就是局部变量,只能在其被声明的函数内部被访问。这样的变量只在函数运行时存在,一旦退出函数,这些局部变量就都被销毁。所有在函数内部声明的变量名称都将被加入作用域中。如下实例:def printInfo(arg1, arg2) : sum = arg1 + arg2 print "函数中的sum = ",sum#函数体外也定义了一个sum变量printInfo(5,6)sum = 1print "函数外的sum = ",sum
上述程序执行结果:
函数中的sum = 11函数外的sum = 1
函数中的sum变量就是局部变量,只能在所在的函数中访问,即使在外面改变了sum变量的值,也不会影响函数中的sum变量的值。
再看下一个例子:
def varTest(alist) : alist = 1 alist = [1,2,3]list1 = ['a',1]varTest(list1)print list1
稍等,先别着急执行这个程序,先猜一猜会是怎样的结果呢?[1,2,3]吗,还是说还有别的答案?好,带着心中的答案,我们来执行一下这个程序,看看结果到底是什么。。。
执行结果: 看着这个结果,是不是有点惊讶呢?what?你猜对了,很好,给你点个赞b( ̄▽ ̄)d 但是为什么会这样呢?因为虽然Python中传参传的都是引用,并且针对可变类型的参数(如list、dict)作为参数传入函数中后,可以被改变,但是这种改变也只针对内容上的改变,比如增加,删除元素等。如果像上面程序中直接给alist赋值,想把alist变成另一个引用,这种Python就会把这个alist当成局部变量来对待,所以在函数中怎么改变里面的内容,都不会影响函数外list1的内容。 7.2全局变量 全局变量是在函数外定义的,可以在整个程序范围内访问,但是必须在所要访问的函数中使用关键词 global 声明函数外的变量为全局变量,这样访问的才是在函数外定义的全局变量。 实例:def printInfo(y) : global x sum = x + y print "sum = ",sumx = 10printInfo(5)
执行结果:
sum = 15
一旦变量被定义为全局变量后,在程序任何地方都可以访问,也可以修改。所以我们不建议过多的使用全局变量(非必要不使用),因为这样可能会导致全局变量的不可预知性,并且全局变量也降低了函数或模块之间的通用性,同时也降低了代码的可读性,别人有可能不知道这个调用的是哪的变量。