函数
基本在每一个编程语言中都会涉及到。而且你会发现,所有语言的函数都大同小异,基本由三个部分组成:
1.函数名
函数名顾名思义,就是给函数定义一个名字,需要注意的就是命名规范问题
如:
def loveRan(): #这里需要说明一下,def是用来标注这是一个函数, 有些语言并没有
return 3 #这里在啰嗦几句,在函数的声明里面并没有写明返回值是什么类型,这也是我一开始不习惯python的地方,总感觉少点什么。
2.返回值
这里有点意思,很多语言函数一般都只能放回一个返回值,但是由于Python中有元组Tuple的使用,导致在函数中可以直接返回一个Tuple,从而实现返回多个值。
如:
def loveRan():
return 'this is a','dream' #当你想要返回多个值的时候,只需要用','隔开就行
使用
loveRan()
('this is a','dream') #你会发现返回的是一个元组
3.参数
参数是函数中使用起来最麻烦的一个地方,在Python中也不例外下面我们一一来说。
3.1 位置参数
什么是位置参数,也就是我们最常用的一种参数
如:
def loveRan(name,age,gender):
print 'name is %s ,age is %d ,gender is %s' % (name ,age,gender)
使用
loveRan('1Ran',18,'W')
name is 1Ran age is 18 gender is W
参数的位置将会决定你输入的位置这就是位置参数,当你输入的顺序与位置参数不匹配的时候输出就会有问题。
3.2 关键字参数
关键字参数,一开始看到这个词的时候我都吓了一跳,其实这跟之后的可变参数有一定的联系,这个后续再说。
同时要说明的是:关键字参数主要是给使用函数的人设定的
如: 还是刚才的那个函数loveRan()
loveRan(gender = 'W',name = '1Ran',age = 18)
name is 1Ran age is 18 gender is W
很明显我们在使用这个函数的时候,并没有按照参数的位置输入,但是我们在输入的时候必须明确变量名。
假如你尝试过这样写:
loveRan(name = '1Ran',age = 18,'W')
loveRan(name = '1Ran',age = 18,'W')
SyntaxError: non-keyword arg after keyword arg
你会发现这里会报错,说在关键字参数后并不认识'W'是给那个参数的,也就是说,如果我们使用关键字参数就意味着,一定要全部都要用,仔细一想,好鸡肋哦,其实,很多时候关键字参数都会与可变参数一起使用。
3.3 默认参数
其实默认参数也是关键字参数的一种,但是又有点区别。
最主要的区别:默认参数是提供给写函数的人使用的
如: 重写一下 loveRan函数
def loveRan(name,gender,age = 18):
print 'name is %s age is %d gender is %s' % (name ,age,gender)
#注意,我们需要将默认参数写在参数的最后
这里你会发现在我们定义函数的时候跟之前有点区别,我们给age赋予了一个默认值.
使用:
loveRan('1Ran','W')
name is 1Ran age is 18 gender is W
what happen , 虽然你没有写age的值,但是依然会给予你一个18岁,这样会让函数使用者更加灵活。
如果你需要的不是18岁 ,也可以按照以上两种参数使用方式给予其赋值即可
loveRan('1Ran','W',20)
name is 1Ran age is 20 gender is W
3.4 可变参数
为什么会有可变参数的使用,我们来设想下面一个场景,你需要计算两个数的数值综合,很简单。
def sum(num1 ,num2):
return num1 + num2
但是假如我们升级,想要计算任意多个数的总和,那我们怎么办呢。我们就需要使用可变参数了。
如:
def sum(*arg):
sum = 0
for num in arg:
sum += num
return sum
使用
sum(1,2,3,45,)
51
这时候你只需要填写你想要计算的数字即可
也许你会问arg是什么
让我们来看一下
def sum(*arg):
print arg
sum = 0
for num in arg:
sum += num
return sum
sum(1,2,3)
(1, 2, 3)
6
我们很明显会发现,arg是一个元组,所以我们可以用for对其遍历
前面不是说关键字参数跟可变参数有联系么
让我们来试一下下面的情况,同样适用上面的sum函数
sum(1,num2 = 2,num3 = 3)
TypeError: sum() got an unexpected keyword argument 'num2'
你会发现适用刚才的可变参数,我们并不能输入任意多个关键字参数,但是,假如我们又需要写入多个关键字参数怎么办呢。
我们可以使用下面的方法来定义:这里为了方便就不适用sum函数了
def printYouInput(**kw):
print kw
for value,key in kw.items():
print '%s %s' % (key,value)
printYouInput(name = '1Ran',feel = 'love')
{'feel': 'love', 'name': '1Ran'}
love feel
1Ran name
这样你就可以发现我们可以使用多个关键字参数了,同时我们打印了kw,我们会发现kw是一个字典,到这里我们也就不难解释为什么要叫关键字参数了。
同时我们还可以这样来定义一个函数:
def print_params(x,y,z = 3, *arg,**kw):
print x,y,z
print arg
print kw
print_params(1,2,3,4,5,6,liuzi = 'doubi')
1 2 3
(4, 5, 6)
{'liuzi': 'doubi'}
当这几种参数一起使用的时候你就会发现其实参数还是很有意思的。
4.参数传递
首先要说一下,这个地方,我现在还处于一个迷茫状态,可以不看这部分。
4.1关于值传递(一般是不可变类型)
什么是值传递,就是只是将变量的值穿过去,而不是将变量本身传过去。
例子:
def print_num(num):
num += 1
print num
a = 10
print_num(a)
a
输出结果
11
10
这意味着什么,虽然你传递了a,同时在函数中改变了num的值,但是a的值并没有改变。这就是值传递,函数内部改变外部变量的值并不会起作用。
这里除了数值类型,还包括:字符串、布尔、浮点类型、元组等(这几个是我知道的)。
4.2引用传递(一般是可变类型)
什么是引用传递呢,就是当你传递并不是参数的值,而是参数的引用,确切来说传递的是参数的地址。
如:
def print_arr(arr):
arr += [4]
print arr
a = [1,2,3]
print_arr(a)
a
输出结果:
[1,2,3,4]
[1,2,3,4]
仔细观察你会发现,当你在函数内部改变arr的时候,连同外面的a也改变了。这里其实a传入的是a的地址,所以arr与a指向同一片内存,执行arr += [4]时,改变的是内存,你会发现a也改变了。
网友评论