本节内容

  1. 函数背景介绍

  2. 函数是什么

  3. 参数与局部变量

  4. 返回值

  5. 递归函数

  6. 匿名函数

  7. 函数式编程介绍

  8. 高阶函数

一、函数背景介绍

老板让你写一个监控程序,监控服务器的系统状况,当cpu/memory/disk等指标的使用量超过阈值时即发邮件报警,如以下代码

while True:

  if cpu利用率 > 90%:

    # 发送邮件提醒

    连接邮箱服务器

    发送邮件

    关闭连接

  if memory占用 > 80%:

    # 发送邮件提醒

    连接邮箱服务器

    发送邮件

    关闭连接

  if disk使用空间 > 90%:

    # 发送邮件提醒

    连接邮箱服务器

    发送邮件

    关闭连接

以上代码存在两个问题

1、发邮件代码重复过多

2、发邮件代码不利于修改,如加入群发功能,需要所有用到邮件代码的地方都要修改

解决办法:把重复的代码提取出来,放在一个公共的地方,起个名字,以后谁想用这段代码,就通过这个名字调用就行

def 发送邮件(内容):

  # 发送邮件提醒

  连接邮箱服务器

  发送邮件

  关闭连接

while True:

  if cpu利用率 > 90%:

    发送邮件("cpu报警”)

  if memory占用 > 80%:

    发送邮件("内存报警")

  if disk使用空间 > 90%:

    发送邮件("硬盘报警")

二、函数是什么

在BASIC中叫做subroutine(子过程或子程序),在Pascal中叫做procedure(过程)和function,在C中为function,在Java中称作method

定义:函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可

特性:

1、减少重复代码

2、使程序变得可扩展

3、使程序变得易维护

语法定义:

def sayhi():       # 无参函数定义

  print("Hello, I'm nobody!")

sayhi()              # 无参函数调用

def calc(x, y):    # 有参函数定义

  res = x ** y

  return res     # return 返回值

a, b = 5, 8

c = calc(a, b)      # 有参函数调用

print(c)

三、参数与局部变量

形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。

因此,新参只在函数内部有效,函数调用结束返回主调函数后则不能再使用该形参变量。

实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们必须有确定的值,

以便把这些值传送给形参,因此应预先赋值、输入等办法使参数获得确定值

默认参数

def stu_register(name, age, country, course):

  print("------注册学生信息------")

  print("姓名", name)

  print("年龄", age)

  print("国籍", country)

  print("课程", course)

stu_register(, "CN", "Python")

stu_register(, "CN", "Linux")

stu_register(, "CN", "MySQL")

发现country这个参数基本都是"CN",注册时,如果不写,可以有一个默认值。定义默认参数可以实现该功能

def_register(name, age, course, country="CN")

country这个参数在调用时不指定,默认为"CN";指定了,就用指定值

注意country变成默认参数后,移到了最后面

关键参数

正常情况下,调用函数传递参数时要按照顺序,若不想按照顺序可以用关键参数实现,只需指定参数名即可。

注意 关键参数必须放在位置参数之后

stu_register(age=, name="alex", course="PyCharm")

非固定参数

若函数在定义时不确定用户传入多少个参数,就可以使用非固定参数

def stu_register(name, age, *args):   # *args 会把多传入的参数变成一个元组形式

  print(name, age, agrs)

stu_register()

Alex 18 ()                                       # 后面() 就是args,没有传值,所以为空

stu_register(, "CN", "Python")

Jonathan  20  ('CN', 'Python')

还有一个 **kwargs

def stu_register(name, age, *args, **kwargs):   # **kwargs 会把多传入的参数变成一个dict形式

  print(name, age, args, kwargs)

stu_register("Alex", 18)

Alex 18

stu_register(, "CN", "Python", sex="Male", province="JiangSu")

Jonathan  20  ('CN', 'Python')  {'sex':  'Male', 'province': 'JiangSu'}

局部变量

name = "Jonathan"

def change_name(name):

  print("before change:", name)

  name = "Tom"

  print("after change:", name)

change_name(name)

print("观察外面name是否更改:", name)

在子程序中定义的变量称为局部变量,在程序一开始定义的变量称为全局变量

全局变量作用域为整个程序,局部变量作用域是定义该变量的子程序

当局部变量和全局变量同名时:在定义局部变量的子程序内,局部变量有效;其他地方全局变量起作用

四、返回值

想要获取函数的执行结果,就可以用return语句把结果返回

注意:

1、函数在执行的过程中只要遇到return语句,就会停止执行并返回结果,这样可以理解为return语句代表函数的结束

2、如果未在函数中指定return,函数可以执行到函数体最后最后一条语句,且该函数返回值为None

五、递归函数

在函数内部,可以调用其他函数。如果一个函数在内部调用本身,这个函数就是递归函数

def calc(n):

  print(n)

  if int(n/2) == 0:

    return n

  return calc(int(n/2))

calc(10)

数据处理过程,如下图所示

递归特性:

1、必须有一个明确的结束条件

2、每次进入更深一层递归时,问题规模相比上次递归都应有所减少

3、递归效率不高,递归层次过多会导致栈溢出

六、匿名函数

匿名函数就是不需要显式的指定函数

def calc(n):

  return n**n

print(calc(10))

# 换成匿名函数

calc = lamda n:n**n

print(calc(n))

# 匿名函数主要和其他函数搭配使用

res  = map(lamda x:x**2, [1, 5, 7, 4, 8])

for i in res:

  print(i)

七、函数式编程介绍

函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂的任务分解成简单的任务,

这种分解可以称之为面向过程的程序设计。函数就是面向过程程序设计的基本单元。

函数式编程中的函数这个术语不是指计算机中的函数,而是指数学中的函数,即自变量的映射。

也就是说一个函数的值仅决定于函数参数的值,不依赖其他状态。

比如sqrt(x)函数计算x的平方根,只要x不变,不论什么时候调用,调用几次,值都是不变的。

Python对函数式编程提供部分支持。由于Python允许使用变量,因此,Python不是纯函数式编程语言。

八、高阶函数

变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数称之为高阶函数

def add(x, y, f):

  return f(x) + f(y)

res = add(3, -6, abs)

print (res)

Python自动化开发 - 函数的更多相关文章

  1. python自动化开发学习 进程, 线程, 协程

    python自动化开发学习 进程, 线程, 协程   前言 在过去单核CPU也可以执行多任务,操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换任务2,任务2执行0.01秒,在切换到任务3,这 ...

  2. python自动化开发学习 I/O多路复用

    python自动化开发学习 I/O多路复用   一. 简介 socketserver在内部是由I/O多路复用,多线程和多进程,实现了并发通信.IO多路复用的系统消耗很小. IO多路复用底层就是监听so ...

  3. python自动化开发-[第十四天]-javascript(续)

    今日概要: 1.数据类型 2.函数function 3.BOM 4.DOM 1.运算符 算术运算符: + - * / % ++ -- 比较运算符: > >= < <= != = ...

  4. python自动化开发-3

    python里的集合 1.集合的概念 集合(set):把不同的元素组成一起形成集合,是python基本的数据类型.set集合,是一个无序且不重复的元素集合. 2.集合的主要作用 1)去重 举例说明: ...

  5. Python自动化开发 - 常用模块(一)

    本节内容 1.模块介绍 2.time&datetime模块 3.random模块 4.os模块 5.sys模块 6.json&pickle模块 7.logging模块 一.模块介绍 模 ...

  6. python自动化开发-[第四天]-函数

    今日概要: - 函数对象 - 函数嵌套 - 命名空间和作用域 - 闭包 - 装饰器 - 迭代器 - 生成器 - 内置函数 一.函数对象 1.函数对象的定义: 函数是第一类对象,即函数可以当作数据传递 ...

  7. python自动化开发-[第三天]-编码,函数,文件操作

    今日概要 - 编码详解 - 文件操作 - 初识函数 一.字符编码 1.代码执行过程 代码-->解释器翻译-->机器码-->执行 2.ASCII ASCII:一个Bytes代表一个字符 ...

  8. Python自动化开发 - 内置函数总结

    Python解释器提供了很多内置函数 参考链接:https://docs.python.org/3.6/library/functions.html 一.数学相关 1.绝对值:abs(-1) 2.最大 ...

  9. Python自动化开发-简介

    1.Python简介 Python创始人  Guido Van Rossum,人称"龟叔",1989年圣诞节期间,为了在阿姆斯特丹打发时间,开发的一个新的脚本解释程序 作为ABC语 ...

随机推荐

  1. Codeforces55D Beautiful numbers

    原题链接 虽然依旧是套模板,但是因为我太弱了,不会建状态,所以去看了题解.. 这里就直接引用我看的题解吧,写的不错的. 题解 //我的代码 #include<cstdio> #includ ...

  2. POJ3678 Katu Puzzle

    原题链接 \(2-SAT\)模板题. 将\(AND,OR,XOR\)转换成\(2-SAT\)的命题形式连边,用\(tarjan\)求强连通分量并检验即可. #include<cstdio> ...

  3. 11. pt-heartbeat

    pt-heartbeat [OPTIONS] [DSN] --update|--monitor|--check|--stop ------------------------------------- ...

  4. 语法分析器初步学习——LISP语法分析

    语法分析器初步学习——LISP语法分析 本文参考自vczh的<如何手写语法分析器>. LISP的表达式是按照前缀的形式写的,比如(1+2)*(3+4)在LISP中会写成(*(+ 1 2)( ...

  5. ubuntu 下通过ftp命令下载文件

    /*连接*/ $ ftp 192.168.180.2Connected to 192.168.180.2.Name (192.168.180.2:rivsidn): admin  Password: ...

  6. hook api实现

    https://www.cnblogs.com/findumars/p/8734116.html https://blog.csdn.net/lonelyrains/article/details/2 ...

  7. Spring PropertyResolver 占位符解析(二)源码分析

    Spring PropertyResolver 占位符解析(二)源码分析 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) ...

  8. RunAsPolicy Exit Code 1替代

    <Policies>  <RunAsPolicy CodePackageRef="Code" UserRef="SetupLocalSystem&quo ...

  9. Max Chunks To Make Sorted II LT768

    This question is the same as "Max Chunks to Make Sorted" except the integers of the given ...

  10. android 使用UDP发送数据 DatagramSocket 创建对象为null

    DatagramSocket socket=null; try { socket = new DatagramSocket();  //这里创建对象为空 } catch (SocketExceptio ...