对于初学者而言,感觉函数还是不是很好理解,尤其是当写一个脚本,或者是写一个算法,认为可能for循环就已经可以解决的问题为什么还要用函数来实现呢?
今天就来说一下函数的优点,其实函数的最大优点就是可重用,一个函数实现后可以被其他不同的脚本来调用,这也就是体现了代码的重用性。
- 函数的定义:def 函数名():,在定义函数时,一定要用关键字def开头,然后紧接着是函数名,括号里是要传的的参数,当然也可不传,最后面是个冒号:
def add(x,y):
return x+y
这就是一个最简单的函数
2.函数的返回值:Python中自定义的函数如果有return,则返回实际的结果,如果没有返回值,则返回None,这是Python与其他语言的区别之一
3.函数的调用:在定义好一个函数后,如果要实现函数的功能,一定要对其进行引用,不然函数体是不会被执行的,调用的方法也很简单,就是函数名和需要的参数即可
例如上边add函数的调用: add(2,3)即可返回5
注意:此处如果传入两个字符串也是OK的,这也是Python的特殊之处,他会根据传入的值来进行相应操作,如果传入的是两个数字,则进行相加,如果是两个字符串则进行拼接,但是此处必须传入的类型一致,否则会报错,所以可以根据你的需要进行处理,如果要做特定的实现可以用isinstance来判断一下类型,来达到自己想要的效果。
4.函数的传参:函数的参数分为按值传递和按地址传递。按值传递是将不可变的参数传递给函数,按地址传递是将可变的参数传递给函数。此处的可变参数与不可变参数是相对内存地址而言的,如果传入的是字符串、元祖、数字,是不可变对象,就是按值传递,为什么说是不可变的,例如如果将a=1这样一个变量传递给函数,那么就是说将1的内存地址传给函数,那么计算机给1分配过内存地址后就不会在变化,所以说在函数体内对a做的任何操作都不会影响函数体外a的值,来看一个例子就会比较好理解了:
a =1
def print_sth(s):
s=s+1
return s
print print_sth(a)
print a
执行结果:
下面我们来看一下原理:
这就是按值传递的原理,当函数体内对a进行加1操作,实际是指向另一个内存地址了,用id()就可以查看内存地址
5.看了按值传递的原理,按引用传递应该就好理解了,按引用传递就是传递一些可变参数,例如list、dict等,先来看一下他们的内存地址的变化:
可以看到当你在对一个list进行操作时,它指向的内存地址实际是没有变化的,所以说当传递可变参数时,函数体内对变量的操作是会影响函数体外的变量的,看一个例子就更明白了:
现在对函数的按值传递和按引用传递参数应该非常了解了吧。
6.可变参数的表示:*args表示传入的是一个元祖,**args表示传入的是一个字典,在实际使用中当不确定要传入多少个参数时,就可以使用这种方法:
def func(a,*args):
for i in args:
a +=i
return a
你会发现,你传递几个参数都不会出问题,这就是可变参数的好处,然后看一下**args吧:
看完这些,你是否对函数有了很大理解,现在应该感觉函数可以实现很多你想要实现的功能吧,这可不仅仅是几个for循环就能实现的哦,赶快学学函数吧,这也是后面写好代码的基础。