美文网首页
Python中的函数

Python中的函数

作者: Rokkia | 来源:发表于2016-10-06 00:19 被阅读37次

函数

基本在每一个编程语言中都会涉及到。而且你会发现,所有语言的函数都大同小异,基本由三个部分组成:

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也改变了。

同样有这个效果的还有字典类型(其他的还没有发现)
如果你问,我可不可以像数组(字典)一样,将数值等不可变类型也传入地址呢,不好意思,python中并不支持,如果是swift,貌似可以在参数前加&a代表传入的是a的地址,但是python并不支持,你只能设定一个返回值来改变a的值

本文只是对自己平时学习的总结,如有不对的地方,还望各位指出,一起交流学习

相关文章

网友评论

      本文标题:Python中的函数

      本文链接:https://www.haomeiwen.com/subject/duheyttx.html