函数的基本概述

在学习函数之前,一直遵循:面向过程编程,即:根据业务逻辑从上到下实现功能,可以思考一下如果有某个功能的代码是在多个地方使用的是否可以只写一次?此时的代码该如何定义。先观察以下的案例:

while True:
    if cpu利用率 > 90%:
        #发送邮件提醒
        连接邮箱服务器
        发送邮件
        关闭连接
    
    if 硬盘使用空间 > 90%:
        #发送邮件提醒
        连接邮箱服务器
        发送邮件
        关闭连接
    
    if 内存占用 > 80%:
        #发送邮件提醒
        连接邮箱服务器
        发送邮件
        关闭连接

以上代码中每个if条件语句下内容可以被提取出来公用 例:

def 发送邮件(内容)
    #发送邮件提醒
    连接邮箱服务器
    发送邮件
    关闭连接
    
while True:
    
    if cpu利用率 > 90%:
        发送邮件('CPU报警')
    
    if 硬盘使用空间 > 90%:
        发送邮件('硬盘报警')
    
    if 内存占用 > 80%:
        发送邮件('内存报警')

对于上述的两种实现方式,第二次必然比第一次的重用性和可读性要好,可以减少大量的代码量,减少开发时间,一处定义,多处调用,其实这就是函数式编程

函数式编程的概念:
开发程序时,需要某块代码多次使用,但是为了提高编写的效率以及代码的重用,所以把具有独立功能的代码块组织为一个小模块,这就是函数

函数的定义和调用

<1>定义函数
  定义函数的格式如下:

    def 函数名():
      代码

  demo:

  # 定义一个函数,能够完成打印信息的功能
    def printInfo():
      print '------------------------------------'
      print ' 人生苦短,我用Python'
      print '------------------------------------'

函数的定义主要有如下要点:

  • def:表示函数的关键字 • 函数名:函数的名称,调用时根据函数名调用函数
  • 函数体:函数中进行一系列的逻辑计算或是该函数的功能内容。
  • 参数:为函数体提供数据
  • 返回值:当函数执行完毕后,可以给调用者返回数据。

<2>调用函数
定义了函数之后,就相当于有了一个具有某些功能的代码,想要让这些代码能够执行,需要调用它(注意在定义函数时里面的内容不会执行)
调用函数很简单的,通过 函数名() 即可完成调用

demo:

  # 定义完函数后,函数是不会自动执行的,需要调用它才可以
  printInfo()

<3>函数的文档说明
例:
>>> def test(a,b):
... "用来完成对2个数求和"
... print("%d"%(a+b))
... 
>>> 
>>> test(11,22)
33
执行,以下代码
>>> help(test)

能够看到test函数的相关说明

==============================================

Help on function test in module __main__:

test(a, b)
用来完成对2个数求和
(END)

=============================================

函数的参数-返回值

<1> 定义带有参数的函数
  示例如下:
  def addnum(a, b):
    c = a+b
    print c
<2> 调用带有参数的函数
  以调用上面的add2num(a, b)函数为例:

  def addnum(a, b):
    c = a+b
    print c

  add2num(11, 22) #调用带有参数的函数时,需要在小括号中,传递数据

  小总结:
  • 定义时小括号中的参数,用来接收参数用的,称为 “形参”
  • 调用时小括号中的参数,用来传递给函数用的,称为 “实参”

  ps:后面会有单独一篇详解函数参数的博客

<3> 带有返回值的函数
  如下示例:
   def add2num(a, b):
    c = a+b
    return c
  
  保存函数的返回值示例如下:
  #定义函数

  def add2num(a, b):
    return a+b

   #调用函数,顺便保存函数的返回值
   result = add2num(100,98)

 

在python中我们可以返回多个值
  >>> def divid(a, b):
  ... shang = a//b
  ... yushu = a%b 
  ... return shang, yushu
  ...
  >>> sh, yu = divid(5, 2)
  >>> sh
  5
  >>> yu
  1

本质是利用了元组

函数根据有没有参数,有没有返回值,可以相互组合,一共有4种
  • 无参数,无返回值
  • 无参数,无返回值
  • 有参数,无返回值
  • 有参数,有返回值

  <1>无参数,无返回值的函数
    此类函数,不能接收参数,也没有返回值,一般情况下,打印提示灯类似的功能,使用这类的函数
  <2>无参数,有返回值的函数
    此类函数,不能接收参数,但是可以返回某个数据,一般情况下,像采集数据,用此类函数
  <3>有参数,无返回值的函数
    此类函数,能接收参数,但不可以返回数据,一般情况下,对某些变量设置数据而不需结果时,用此类函数
  <4>有参数,有返回值的函数
    此类函数,不仅能接收参数,还可以返回某个数据,一般情况下,像数据处理并需要结果的应用,用此类函数
小总结

 • 函数根据有没有参数,有没有返回值可以相互组合
  • 定义函数时,是根据实际的功能需求来设计的,所以不同开发人员编写的函数类型各不相同
  • 一个函数到底有没有返回值,就看有没有return,因为只有return才可以返回数据
  • 在开发中往往根据需求来设计函数需不需要返回值
  • 函数中,可以有多个return语句,但是只要执行到一个return语句,那么就意味着这个函数的调用完成
  • 一个程序当中函数的名字尽量不要重复,当函数名字重复时后面的会把前面的覆盖掉(注意:也不要与变量名重复同样会被覆盖)

函数的嵌套

def testB():
  print('---- testB start----')
  print('这里是testB函数执行的代码...(省略)...')
  print('---- testB end----')

def testA():

  print('---- testA start----')

  testB()

  print('---- testA end----')

调用

testA()

结果:
---- testA start----
---- testB start----
这里是testB函数执行的代码...(省略)...
---- testB end----
---- testA end----

小总结
  • 一个函数里面又调用了另外一个函数,这就是所谓的函数嵌套调用 
  • 如果函数A中,调用了另外一个函数B,那么先把函数B中的任务都执行完毕之后才会回到上次 函数A执行的位置

函数嵌套的案例:

  1. 写一个函数求三个数的和
  2. 写一个函数求三个数的平均值

  # 求3个数的和
  def sum3Number(a,b,c):
    return a+b+c # return 的后面可以是数值,也可是一个表达式

  # 完成对3个数求平均值
  def average3Number(a,b,c):

    # 因为sum3Number函数已经完成了3个数的就和,所以只需调用即可
    # 即把接收到的3个数,当做实参传递即可
    sumResult = sum3Number(a,b,c)
    aveResult = sumResult/3.0
    return aveResult

  # 调用函数,完成对3个数求平均值

  result = average3Number(11,2,55)

  print("average is %d"%result)

函数的局部变量、全局变量

局部变量

  示例:
    In [8]: def text1():
    ...:     a = 200
    ...:     print("text1----%d" %a)
    ...:        print("修改后")
    ...:     a = 300
    ...:     print("text1----%d" %a)
    ...:

    In [9]: def text2():
    ...:    a = 400
    ...:        print("text2-----%d" %a)
    ...:

    In [10]: text1()
    text1----200
    修改后
    text1----300

    In [11]: text2()
    text2-----400

  总结
    • 局部变量,就是在函数内部定义的变量
    • 不同的函数,可以定义相同的名字的局部变量,但是各用个的不会产生影响
    • 局部变量的作用,为了临时保存数据需要在函数中定义变量来进行存储,这就是它的作用

全局变量

  概念:如果一个变量,既能在一个函数中使用,也能在其他的函数中使用,这样的变量就是全局变量

  

  示例:
    # 定义全局变量
    In [12]: a = 250

    In [13]: def text1():
    ...:      print("----text1----%d" %a)
    ...:

    In [14]: def text2():
    ...:      print("----text2----%d" %a)

    ...:

    In [15]: text1()
    ----text1----250

    In [16]: text2()
    ----text2----250

  

  当局部变量和全局变量重名的时候:
    In [23]: a = 250 # 全局变量

    In [24]: def text1():
    ...:     # 局部变量
    ...:      a = 521
    ...:      print("----text1----%d" %a)
    ...:      # 局部变量
    ...:      a = 666
    ...:      print("----text1----%d" %a)
    ...:

    In [25]: def text2():
    ...:     print("----text2----%d" %a)
    ...:

    In [26]: text1()
    ----text1----521
    ----text1----666

    In [27]: text2()
    ----text2----250

    In [28]:

    总结:
      • 在函数外边定义的变量叫做全局变量
      • 全局变量能够在所有的函数中进行访问
      • 如果全局变量的名字和局部变量的名字相同,那么使用的是局部变量的,小技巧强龙不压地头蛇

  在函数内部修改全局变量:
    In [31]: a = 250

    In [32]: def text1():
    ...:      a = 520
    ...:      print("----text1----%d" %a)

    In [33]:

    In [33]: def text2():
    ...:      global a
    ...:      a = 666
    ...:      print("----text2----%d" %a)
    ...:

    In [34]: # 没有调用任何函数

    In [35]: print(a)
    250

    In [36]: # 调用text1

    In [37]: text1()
    ----text1----520

    In [38]: # 再次打印---->

    In [39]: print(a)
    250

    In [40]: # 发现值并没有修改

    In [41]: # 调用text2

    In [42]: text2()
    ----text2----666

    In [43]: # 再次打印a

    In [44]: print(a)
    666

    In [45]: # 值已修改
    总结:
      • 如果在函数中修改全局变量,那么就需要使用global进行声明,否则相当于在(在没有传参数的情况)在函数内部重新定义了一个相同变量的对象

  对于 --可变类型的全局变量-和-不可变类型的全局变量-在函数内部修改的区别

    ps:后面会有博客详细说明可变类型与不可变类型的概念
    示例:------->不可变类型:
      In [46]: a = 6

      In [47]: def demo():
      ...:     a += 1
      ...:      print(a)
      ...:

      In [48]: demo()

      错误信息:
      ---------------------------------------------------------------------------
      UnboundLocalError Traceback (most recent call last)
      <ipython-input-48-00cf94af4371> in <module>()
      ----> 1 demo()

      <ipython-input-47-6e1d5ad81f64> in demo()
      1 def demo():
      ----> 2 a += 1
      3 print(a)
      4

      UnboundLocalError: local variable 'a' referenced before assignment

      --------------------------------------------------------------------------
      注:显然是不可以修改

     ------->可变类型:

      In [49]: a = [1,]

      In [50]:

      In [50]: def demo():
      ...:      a.append(2)
      ...:      print(a)
      ...:

      In [51]: demo()
      [1, 2]

      In [52]: a
      Out[52]: [1, 2]

      当调用函数时,在执行函数时在函数内部修改了列表的值--同时外部打印时也发生了变化。
  总结:

    ○ 如果在函数中修改全局变量,那么就需要使用global进行声明,否则出错
    ○ 在函数中不使用global声明全局变量时不能修改全局变量的本质是不能修改全局变量的指向,即不能将全局变量指向新的数据。
    ○ 对于不可变类型的全局变量来说,因其指向的数据不能修改,所以不使用global时无法修改全局变量。
    ○ 对于可变类型的全局变量来说,因其指向的数据可以修改,所以不使用global时也可修改全局变量。

python中函数的定义,调用,全局变量,局部变量,函数的嵌套使用-初级篇的更多相关文章

  1. [转]关于python中带下划线的变量和函数的意义

    Python 的代码风格由 PEP 8 描述.这个文档描述了 Python 编程风格的方方面面.在遵守这个文档的条件下,不同程序员编写的 Python 代码可以保持最大程度的相似风格.这样就易于阅读, ...

  2. Python中字符串String的基本内置函数与过滤字符模块函数的基本用法

    Python中字符串String的基本内置函数与用法 首先我们要明白在python中当字符编码为:UTF-8时,中文在字符串中的占位为3个字节,其余字符为一个字节 下面就直接介绍几种python中字符 ...

  3. 关于Python中的类普通继承与super函数继承

    关于Python中的类普通继承与super函数继承 1.super只能用于新式类 2.多重继承super可以保公共父类仅被执行一次 一.首先看下普通继承的写法 二.再看看super继承的写法 参考链接 ...

  4. Lua的函数的定义、math数学函数、lua字符串的处理、lua支持的字符串类、模式串中的特殊字符_学习笔记04

    Lua的函数的定义.math数学函数 定义函数 function [function name] (param1,param2) [function code] --定义一个函数用来求的两个数字的和 ...

  5. JS的一些总结(函数声明和函数表达式的区别,函数中的this指向的问题,函数不同的调用方式,函数也是对象,数组中的函数调用)

    一.函数声明和函数表达式的区别: 函数声明放在if——else语句中,在IE8中会出现问题 函数表达式则不会 <script> if(true){ function f1(){ conso ...

  6. 实验 7 : OpenDaylight 实验 —— Python 中的 REST API 调用

    实验 7 : OpenDaylight 实验 -- Python 中的 REST API 调用 一.实验 目的 对 Python 调用 OpenDaylight 的 REST API 方法有初步了解. ...

  7. 转-C++之虚函数不能定义成内联函数的原因

    转自:https://blog.csdn.net/flydreamforever/article/details/61429140 在C++中,inline关键字和virtual关键字分别用来定义c+ ...

  8. Python中sorted(iterable, *, key=None, reverse=False)函数参数定义中的独立星号(*)的含义

    老猿在 <Python中函数的参数带星号是什么意思?>中介绍了Python函数中参数带星号的含义,而在实际使用和Python的标准文档中,会看到某写函数(如sorted(iterable, ...

  9. python函数基础:调用内置函数&定义函数

    调用内置函数 有很多内置函数,在使用中需要积累.这里只举两个例子: 分别调用abs和数据类型转换,注意当入参类型错误时候会报错 ''' print('abs(-100)') abs(-100) pri ...

随机推荐

  1. kafka 0.10.2 cetos6.5 集群部署

    安装 zookeeper http://www.cnblogs.com/xiaojf/p/6572351.html安装 scala http://www.cnblogs.com/xiaojf/p/65 ...

  2. 搭建Elasticsearch集群常见问题

    一.ES安装方法: Linux用户登录(bae),我们用的是5.3版本的包.从官网下载: curl -L -O https://artifacts.elastic.co/downloads/elast ...

  3. Python教程(2.3)——运算符和类型转换

    Python里有很多运算符(operator),这节就让我们来详细学一学. 注意:本文没有特别说明的地方,只考虑bool.int.float三种类型.例如"两边操作数类型相同时,得到的结果为 ...

  4. php+mysql 除了设置主键防止表单提交内容重复外的另一种方法

    感觉好久没有更新博客了,一直在做网站及后台,也没有遇到让我觉得可以整理的内容,之前做的一个系统,已经完成了,后来客户又要求加一个功能,大概就是表单提交的时候,约束有一项不能和以前的内容重复,如图 比如 ...

  5. 让Chrome看不了WWDC直播的HLS技术详解

    Requirements: Live streaming uses Apple's HTTP Live Streaming (HLS) technology. HLS requires an iPho ...

  6. pc网页到移动端怎么自动加载适应移动端的css。

    1.通过link标签判断加入 以前听说过在link标签中加media = "handheld",但这个用到安卓或苹果都不管用,后来尝试以下方法,是管用的. <link hre ...

  7. vscode中使用markdown

    vscode中使用markdown vscode 是微软推出一款轻量级的文本编辑工具,类似于sublime,由于其拥有丰富的插件,安装使用也非常简单,所以深受广大程序员的喜爱. markdown 是一 ...

  8. HTML5 客户端存储数据的两种方式

    HTML5 提供了两种在客户端存储数据的新方法: localStorage - 没有时间限制的数据存储 sessionStorage - 针对一个 session 的数据存储 之前,这些都是由 coo ...

  9. Elasticsearch文档查询

    简单数据集 到目前为止,已经了解了基本知识,现在我们尝试用更逼真的数据集,这儿已经准备好了一份虚构的JSON,关于客户银行账户信息的.每个文档的结构如下: { , , "firstname& ...

  10. Vulkan Tutorial 18 重构交换链

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 Introduction 现在我们已经成功的在屏幕上绘制出三角形,但是在某些情况下, ...