• 函数 前半部


    函数

    什么是函数

    在程序中,函数就是具备某一功能的工具,事先将准备好的工具准备好就是函数的定义

     

    为什么要用函数

    没有函数的话,写程序的时候会遇到以下问题:

    1. 程序长

    2. 扩展性差

    3. 可读性差

    如何用函数:

    先定义函数,再使用函数

     

    函数的分类:内置函数和自定义函数

    定义函数

    语法

    有参数函数,及应用场景

    在函数定义阶段括号内有参数,成为有参函数

    注意: 定义时有参,意味着调用的时候也必须传入参数

    如果函数逻辑代码需要依赖外部传入的值。必须定义为有参函数

    无参数函数,及应用场景

    定义函数时,参数是函数体接收外部传值的一种媒介,其实就是一个变量名

    在函数阶段,括号内没有参数,成为无参函数

    注意:定义时无参,意味着调用的时候也无需传入参数

    如果代码逻辑不需要依赖外部传入的值,则必须定义为无参函数

    空函数,及应用场景

    当你知道你需要实现某种功能的时候,但不知如何代码实现的时候,你可以暂时写一个空函数

    def func():
       pass

     

    调用函数

    函数名() 即调用函数

    会执行函数代码,直到碰到return 或者执行完函数内所有代码结束

    如何调用函数

    函数调用的三种方式

    def max_self(x,y):
       if x>y:
           return x
       else:
           return y
       
       
       
    # 1
    max_self(1,2)
    # 2
    res = max_self(1,2)
    # 3
    max_self(max_self(2000,3000),4000)

     

    函数的返回值

    函数参数的应用:形参和实参,位置形参,位置实参,关键字实参,默认形参,*args **kargs

    形参

    在函数定义阶段括号内定义的参数,称之为形式参数,简称形参,本质就是变量名

    实参

    在函数调用阶段,括号内传入的参数,称之为实际参数,简称实参,本质就是变量的值

    位置形参

    在函数定义阶段按照从左到右的循序依次定义的形参,称之为位置形参

    特点:按照为之定义的形参,都必须被传值,多一个也不行少一个也不行

    位置实参

    在函数调用阶段,按照从左到右的顺序依次定义的实参,被称之为位置实参

    特点: 按照位置为对应的形参依次传值

    关键字实参

    在调用函数时,按照key=value的形势为指定的参数传值,成为关键字实参

    特点:可以打破位置的限制,但仍能为指定的形参赋值

    注意:

    1. 可以混用位置实参和关键字实参,但是位置实参必须在关键字实参的左边

    1. 可以混用位置实参和关键字实参,但是不能对一个形参重复赋值

    默认形参

    在定义阶段就已经被赋值。

    特点,在定义阶段就已经被赋值,意味着调用时可以不用为他赋值

    注意:

    1. 位置形参必须放在默认形参的左边

    2. 默认形参的值,之在定义阶段复制一次,也就是说默认参数的值在函数定义阶段就已经固定

    3. 默认参数的值通常是不可变类型

    总结:

    实参的应用:取决于个人习惯

    形参的应用:

    1. 大多数情况的调用值不一样,变化较大,就应该将该参数定义成位置形参

    2. 大多数情况的调用之一样,变化较小,就应该将该参数定义成默认形参

    高级函数(函数对象)

    可变长参数:指的是在调用函数时,传入的参数个数可以不固定

    调用函数时,传值的方式无非两种,一种为位置实参,一种是关键字实参,因此形参也必须有两种解决方法,以此来分别接受溢出的位置实参(*)和关键字实参(**)

    可变长实参 *

    实参中的* ,* 会将*后参数的值循环取出,打散成位置实参,以后但凡碰到实参中带 *的,他就是位置实参,应该马上打散成位置实参去看

    可变长形参 **

    形参中的 **会将溢出的关键字实参全部接受,然后存储字典的形势,然后把字典赋值给 * *后的参数, 约定俗成 * * 后的参数名为kwargs

    可变长实参之**

    实参中的**,会将后参数的值循环取出,打散成关键字实参

    命名关键字形参

    需求: 函数的使用者必须按照关键字实参传

    命名关键字形参,在函数定义阶段,* 后面的参数都是命名关键字参数

    特点: 在传值的时候,必须按照key=value的方式传值,而且key鼻血命名关键字参数指定的参数名

    函数对象的四大功能

    1. 引用

    2. 当做参数传给一个函数

    3. 可以当做函数的返回值

    4. 可以当做容器类型的元素

    函数嵌套

    函数内部定义的函数,无法在函数外部使用内部定义的函数

    函数内部的函数只能在函数内部调用

    作用域和名称空间

    内置名称空间

    存放python解释器自带的名字,如int float 等

    生命周期,再解释器启动时生效,再解释器关闭时失效

    全局名称空间

    全局名称空间:除了内置和局部的名字之外,其余都存放在全局名称空间下,如x,fun , z

    生命周期:在文件执行时生效,在文件执行结束后失效

    局部名称空间

    局部名称空间: 用于存放函数调用期间函数体产生的名字

    生命周期:在文件执行函数调用期间生效,在函数执行结束后失效

    加载顺序

    内置------->全局------->局部

    查找顺序

    局部------->全局-------->内置 ( 从当前位置开始查找,如果当前位置为全局,则为全局)

    闭包函数

    闭包:闭是封闭(函数内部函数),包是包含(该内部函数对外部作用域而非全局作用域的变量的引用)

    闭包函数: 函数内部函数对外部作用域而非全局作用域的引用

    提示 :我们之前都是通过参数将外部的值传给函数,闭包提供另外一种思想

    两种方式: 使用参数的形式 包给函数

     

    装饰器

    什么装饰器,指为装饰器对象添加额外功能,因此定义一个装饰器就是定义一个函数,只不过该函数的功能是用来为其他函数添加额外的功能

    注意:

    1. 装饰器本身其实是可以任意可调用的对象

    2. 被装饰的对象也可以是任意可调用的对象

    为什么要用装饰器:例如。我们已经上线了一个项目,我们需要修改某一个方法,但是我们不想修改该方法的使用模式,这时候可以使用装饰器,因为一旦软件上线后,一般对修改源代码是封闭的,对于扩展功能是开放的

    两大原则:

    1. 不修改被装饰对象的源代码

    2. 不修改被装饰对象的调用方式

     

    第一种传参方式:改变调用方式

    第二种传参方式:包给函数-外包

     

     

  • 相关阅读:
    二叉树重建leetcode
    leetcode 字符串
    leetcode first missing positive,覆盖区间
    leetcode 较难题
    Linq分页
    Linq 数据库通用的操作类
    .Net3.5扩展方法实现对象JSON序列化
    js 判断输入内容(主要针对汉字)的字节长度
    div 内table 居中
    Linq增、删、改、查
  • 原文地址:https://www.cnblogs.com/zrx19960128/p/10960190.html
Copyright © 2020-2023  润新知