参数
Python中的参数分如下几类:
- 必备参数
- 命名参数
- 缺省参数
- 不定长参数
必备参数
必备参数在传入时,函数调时给的参数数量、顺序都必须和声明时一样,否则就会报错。如:
声明一个这样的函数:
def info(name, age, tel) :
- 1
调用info函数时,必须传入三个参数,并且参数的顺序也必须是name, age, tel,如:
info('jack', 20,'13567867878')
- 1
以上函数调用后,参数按顺序匹配:
name=’jack’,age=20,tel=’13567867878’
命名参数
命名参数就是在调用函数时,通过参数的命名来确定传入的参数值。这样你不仅可以跳过不传的参数,还可以乱序传参,因为Python解释器能够用参数名来匹配参数值。
实例:
#!/usr/bin/python
def sum(x, y) :
#求两个数之和
return x + y
#调用sum函数
sum(y = 10, x = 5)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
执行结果:
15
- 1
函数会按参数名字去匹配形参,并把传入的值赋给它。
需要注意的是,传参时命名参数必须在非命名参数的后面,否则就会报SyntaxError: non-keyword arg after keyword arg的错误。如下例:
def sum(x, y, z) :
#求三个数之和
return x + y + z
- 1
- 2
- 3
调用sum函数
>>> sum(x=1,2,4)
File "<stdin>", line 1
SyntaxError: non-keyword arg after keyword arg
- 1
- 2
- 3
- 4
上面调用就报错了。那如果下面这样调用又对不对呢?
>>> sum(2,4,x=1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: sum() got multiple values for keyword argument 'x'
- 1
- 2
- 3
- 4
同样我们看到,还是报错了。这次的错误是说x参数被赋了多次值。按照顺序,2赋给x,4赋给y,但是后面又给了一个命名参数x=1,这样就导致x参数被多次赋值,这是不允许的。那怎样才是对的呢?
sum(2, 4, z=2) #这样调用是正确的
- 1
缺省参数
在定义函数时,有时候会默认给某些参数赋一个初始值,这样的参数就叫缺省值。调用函数时,如果缺省参数的值没有传入,则直接调用默认值。
实例:
#!/usr/bin/python
def sum(x, y, z=100) :
#求三个数之和
return x + y + z
#调用sum函数,缺省z参数,z将使用默认值
sum(y = 10, x = 5)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
执行结果:
115
- 1
看下面的例子:
>>> def printInfo(name, age=20, sex) :
... #求三个数之和
... print name,
... print age,
... print sex
...
File "<stdin>", line 1
SyntaxError: non-default argument follows default argument
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
初看程序感觉写的没错啊,但是为什么就报错了呢?其实原因也很简单,看一下报错信息就知道了”语法错误“,仔细检查会发现,定义函数时缺省参数也必须放在非缺省参数的后面。所以下面函数的定义是正确的。
def printInfo(name, sex, age=20) :
#求三个数之和
print name,
print age,
print sex
- 1
- 2
- 3
- 4
- 5
不定长参数
你可能需要一个函数能处理比当初声明时更多的参数,这些参数叫不定长参数,和上述几种参数不同,不定长参数在声明时不会给命名。基本语法如下:
def functionName([formal_args,] *var_args_tuple) :
"函数说明"
function_suite
return [expression]
- 1
- 2
- 3
- 4
声明函数时,前面加了星号(*)的变量名会存放所有未命名的变量参数,也可以不传这些参数,并且这些参数是存在变量名为var_args_tuple的元组中的。
实例:
#!/usr/bin/python
def printInfo(arg1, *vartuple) :
print arg1
print "vartuple :",vartuple
for i in vartuple :
print i,
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
调用printInfo函数,查看执行结果
>>> printInfo(8)
8
vartuple : ()
>>> printInfo(1,5,6,7,8,9)
1
vartuple : (5, 6, 7, 8, 9)
5 6 7 8 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
不定长参数中除了使用元组,还可以使用字典,字典是用两个星号(**)表示的。
实例1:
#!/usr/bin/python
def printInfo(arg1, **varDict) :
print arg1
print "varDict:"
for key, value in varDict.items() :
print key, value
- 1
- 2
- 3
- 4
- 5
- 6
- 7
调用函数,并查看执行结果:
>>> printInfo(8)
8
varDict:
>>> printInfo(1,a=1,c=12,d=32)
1
varDict:
a 1
c 12
d 32
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
实例2:
>>> def printInfo(a, c=4, *tup, **dic) :
... print a
... print c
... print tup
... print dic
...
- 1
- 2
- 3
- 4
- 5
- 6
调用执行:
>>> printInfo(2,3,4,5, x=1, y=2)
2
3
(4, 5)
{'y': 2, 'x': 1}
- 1
- 2
- 3
- 4
- 5
按照参数赋值顺序,a=2,c=3,4和5存在元组tup中,x=1, y=2存在字典dic中。
由此可以看出,传参时元组和字典传参的区别,元组就跟传普通参数一样,而字典中的元素是由键值对组成,所以传参时就需要传键值表达式。
return 语句
return语句的语法格式:
return [表达式]
- 1
return 语句表示退出函数,选择性地向调用方返回一个表达式或者是一个值或者由多个返回值组成的元组。不带参数值的return语句返回None。如果函数不需要返回值,也可以不用写return语句。
实例:
def printInfo(arg1, arg2) :
sum = arg1 + arg2
return sum
- 1
- 2
- 3
上面的函数表示返回两个数的和。
变量作用域
一个程序的所有变量并不是在哪个位置都可以访问的。访问权限决定于这个变量是在哪里赋值的。
变量的作用域决定了在哪一部分你可以访问哪个特定的变量名称。变量分为局部变量和全局变量。
局部变量
定义在函数内部的变量就是局部变量,只能在其被声明的函数内部被访问。这样的变量只在函数运行时存在,一旦退出函数,这些局部变量就都被销毁。所有在函数内部声明的变量名称都将被加入作用域中。如下实例:
def printInfo(arg1, arg2) :
sum = arg1 + arg2
print "函数中的sum = ",sum
#函数体外也定义了一个sum变量
printInfo(5,6)
sum = 1
print "函数外的sum = ",sum
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
上述程序执行结果:
函数中的sum = 11
函数外的sum = 1
- 1
- 2
函数