zoukankan      html  css  js  c++  java
  • 函数

    什么是函数?

    一个函数就是一个特定的功能或者称为一个工具,使用函数可以把一个大的程序分成一个个小的可管理的功能‘模块’,这就是程序结构化或模块化的一种体现形式。
     

    使用函数的优点

    • 隐藏了具体功能的实现细节,程序逻辑更加清晰,结构化程度增强
    • 避免写重复代码,减少代码量
    • 需求变更时,只需要修改函数内的代码逻辑,其余引用函数的地方无需修改,保持了一致性,增强程序的易维护性和可扩展性
     

    为什么要定义函数?

    在python语言中,所有的函数必须遵循‘先定义,后使用’的原则。函数的定义就相当于事先将一段代码逻辑以普通字符的形式保存起来,然后赋值给函数名,这和变量的定义有点相似,函数名就代表了一个特定的功能的引用,没有事先将函数定义好而直接使用函数,就相当于在引用一个不存在的‘变量名’。
     
      

    二. 函数的组成部分

    • def:定义函数的关键字
    • 函数名:用来以后按照名字调用函数体实现的功能
    • 括号:括号内定义参数,参数是可有可无的,且无需指定参数的类型
    • 冒号:括号后要加冒号,然后在下一行开始缩进编写函数内容。
    • """文档描述""":描述函数相关信息的文档(如函数功能,参数介绍等),非必要,但是建议加上。
    • 函数体:由语句组成,函数体可以是pass(代表什么也不做)
    • return 值:定义函数的返回值,return是可有可无的

     

    定义函数

    >>> def F():
            e='Hello Word'
            return e
    >>> F()
    'Hello Word'

     

     

    函数形参

    函数的参数有形参和实参的区分。
    形参:只有在被调用是分配内存,结束后立即释放内存,值仅在函数内部有效。
    实参:在函数调用时出现,一般指参数具体的值。
    def F(a,b,c): #a、b、c是形参
         return a,b,c
    >>> F(1,2,3) #1、2、3是实参
    (1, 2, 3)
    注意: 实参占用的是实参的内存存储单元,只有在函数调用时,才会开辟形参的内存单元,用来存储形参接收实参传来的值。这是不同的两个内存存储单元,且形参内存存储单元只在函数运行过程中有效,在调用结束时就会被释放,而实参的内存存储单元并不会因此而释放,即便是调用过程中形参的值被修改,也完全影响不到实参的值,即运行过程中x可能被修改为10,在运行结束后a的值仍然为1。
     

    默认参数

    默认参数可以简化函数的调用。设置默认参数时,有几点要注意:
    • 必选参数在前,默认参数在后
    • 当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。
    >>> def F(a,b=2,c=3):
                return a,b,c
    >>> F(1)
    (1, 2, 3)
    >>> F(111)
    (111, 2, 3)
    >>> F(111,c=333)
    (111, 2, 333)

     

     

    可变参数

    可变参数就是传入的参数个数是可变的,可以是0个或多个
    返回的是元组
    >>> def F(*num):
                return num
    >>> F(1,2,3) #多个参数
    (1, 2, 3)
    >>> F() #0个参数
    ()
    #列表作为参数
    >>> a=[1,2,3]
    >>> F(a)
    ([1, 2, 3],)
     
    >>> F(a[0],a[1],a[2])
    (1, 2, 3)
     
    >>> F(*a) #推荐用法
    (1, 2, 3)

     

     
     
     

    关键字参数

    关键字指的是参数名字,按关键字传值即实参被定义成key=value的形式,以此来调用函数,可简称为关键字调用(所有形式参数的名字都可以作为关键字)。
    通过指定参数名(key)精准定位到唯一一个形参,然后将实参的值(value)传递给它。采用关键字调用意味着我们无需再去考虑形参的顺序,仍然能把值准确的传给形参
    >>> def F(**num):
    return num
    >>> F()
    {}
    >>> F(a='aa',b='bb')
    {'b': 'bb', 'a': 'aa'}
    >>> q={'q':'qq','w':'ww'}
    >>> F(**q)
    {'w': 'ww', 'q': 'qq'}
    >>> F(**q,d='dd')
    {'w': 'ww', 'q': 'qq', 'd': 'dd'}

    可变参数*args与关键字参数**kwargs通常是组合在一起使用的,可以接收任意长度的任意参数。

     

    参数顺序

    位置参数---> 可变参数---> 默认参数---> 关键参数
    def a(x,*args,y=6,**kwargs):
        print(x)
        print(y)
        print(args)
        print(kwargs)
    
    >>> a(1,2,3,4,5,6,7,r=5,t=6,y=0)
    1
    0
    (2, 3, 4, 5, 6, 7)
    {'r': 5, 't': 6}
    >>> a(1,2,3,4,r=5,t=6,y=0)
    1
    0
    (2, 3, 4)
    {'r': 5, 't': 6}

     

    函数的第一类对象

    即函数可以被当作数据来传递

    def func():
        print('the is func')

     

    可以被引用

    >>> f=func
    >>> f()
    the is func

     

    可以作为参数

    >>> def f2(x):
        return x()
    
    >>> f2(func)
    the is func

     

    返回值可以是函数

    >>> def f3():
        return func
    
    >>> ret=f3()
    >>> ret()
    the is func

     

    可以作为容器的元素

    >>> D={}
    >>> D['dic']=func
    >>> D['dic']()
    the is func

     

     

     

  • 相关阅读:
    Maven中配置生成单元测试报告配置
    maven-surefire-plugin总结
    Java程序内存分析:使用mat工具分析内存占用
    利用内存分析工具(Memory Analyzer Tool,MAT)分析java项目内存泄露
    JVM性能监控工具(一)-jdk命令行工具
    Java线程详细监控和其dump的分析使用—-分析Java性能瓶颈
    JDK自带内存及线程分析工具
    使用jstack和TDA进行java线程dump分析
    qt 插件开发
    精通linux设备驱动开发 笔记
  • 原文地址:https://www.cnblogs.com/hanqian/p/6390427.html
Copyright © 2011-2022 走看看