zoukankan      html  css  js  c++  java
  • Python自动化开发

    本节内容

    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("王大炮", 19, "CN", "Python")

    stu_register("李小红", 20, "CN", "Linux")

    stu_register("张志成", 18, "CN", "MySQL")

     

     

     

     

     

     

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

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

     

     

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

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

     

    关键参数

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

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

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

     

     

    非固定参数

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

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

      print(name, age, agrs)

    stu_register("Alex", 18)

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

    stu_register("Joanthan", 20, "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("Joanthan", 20, "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)

  • 相关阅读:
    matplotlib 进阶之origin and extent in imshow
    Momentum and NAG
    matplotlib 进阶之Tight Layout guide
    matplotlib 进阶之Constrained Layout Guide
    matplotlib 进阶之Customizing Figure Layouts Using GridSpec and Other Functions
    matplotlb 进阶之Styling with cycler
    matplotlib 进阶之Legend guide
    Django Admin Cookbook-10如何启用对计算字段的过滤
    Django Admin Cookbook-9如何启用对计算字段的排序
    Django Admin Cookbook-8如何在Django admin中优化查询
  • 原文地址:https://www.cnblogs.com/jonathan1314/p/6340979.html
Copyright © 2011-2022 走看看