对于初学者而言,感觉函数还是不是很好理解,尤其是当写一个脚本,或者是写一个算法,认为可能for循环就已经可以解决的问题为什么还要用函数来实现呢?

今天就来说一下函数的优点,其实函数的最大优点就是可重用,一个函数实现后可以被其他不同的脚本来调用,这也就是体现了代码的重用性。

  1. 函数的定义: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循环就能实现的哦,赶快学学函数吧,这也是后面写好代码的基础。

  

最新文章

  1. JavaScript闭包之“词法作用域”
  2. Effective C++ -----条款08: 别让异常逃离析构函数
  3. oracle使用pfile或者spfile启动
  4. unity3d学习笔记(十九)--ngui制作3d人物头顶的头像和血条
  5. chgrp命令
  6. 深入理解java垃圾回收算法
  7. linux的一点一滴---open
  8. springMvc学习笔记一
  9. 洛谷 P3038 [USACO11DEC]牧草种植Grass Planting(树链剖分)
  10. String放入运行时常量池的时机与String.intern()方法解惑
  11. 在虚拟机中搭建qduoj(一)——准备工作
  12. JDK源码分析(7)之 Reference 框架概览
  13. js库 - 浅拷贝 & 深拷贝
  14. 在web.xml中配置监听器来控制ioc容器生命周期
  15. 条件随机场之CRF++源码详解-预测
  16. 参考termux中包管理命令的伪装修改的arch版包管理命令
  17. Lab 3-1
  18. Hadoop 历史服务配置启动查看
  19. 剑指offer十之矩形覆盖
  20. 【Jupyter notebook】access remotly

热门文章

  1. 转 node.js里面的http模块深入理解
  2. VUE 源码学习01 源码入口
  3. CentOS设置系统时间、硬件时间、以及定时校对时间
  4. 一台服务部署多个tomcat注意事项
  5. Codeforces Round #383 (Div. 2) B. Arpa’s obvious problem and Mehrdad’s terrible solution
  6. 刘强1109 JavaScript基础二(分支与循环结构)
  7. Hadoop,master和slave简单的分布式搭建
  8. JS-类型转换
  9. jquery实现抽奖小游戏
  10. Centos下配置tomcat7的https证书