zoukankan      html  css  js  c++  java
  • 大话Python函数底层逻辑

    函数
      叫 子过程或子程序 描叙的更为贴近实际应用场景
      这和数学中的函数实现上不同但语义上相识,如 f(x) = expressiom, 给定一个确定的输入必然返回一个确定的输出
      数学中函数的关系是通过代数方程确定的,计算机中的函数关系通过 表达式语句确定的,计算机可以完成数学中函数的
      表达,并且远比数学中的函数要强大,数学中完成的仅仅是计算问题,计算机不仅仅完成计算还能同时自动完成相关联的
      运算与许多系统级别的工作

    在学习函数之前,我们理解这个场景,比如你在画画,你需要什么?一支画笔和一张白纸就足够了,类比
    计算机程序,你需要一个空文本文件和往空文本文件中写入程序,文本编辑器就是那支画笔,空白文件就是那张白纸
    画画中,我们要熟知几种图形与线条,在程序中我们要熟知函数、类、变量、循环分支,这些都是构成程序的基本构件

    函数定义

    def ...(param, ...):
        ...
        return expression, ...

      1. 关键字def引入一个函数定义,后面跟函数名称和函数的参数列表,然后最后以:作为结尾,下一行缩进表示函数体
      2. 定义的语义是创建了一个东西然后给予这个东西一个名字,然后后面某个时候可以通过名字来引用这个东西,要想用
        某个东西,就需要创建这个东西并给他一个名字
      3. 调用函数 ...(param, ...),这个过程又被称为执行函数,函数调用和函数执行时一个意思,要真有个区别
        函数调用是传递实际参数给函数,函数执行时执行函数体
      4. return 语句从函数中返回结果值,也就是函数的输出,可以时一个值,也可以时多个值,如果没有return语句则函数返回 None

    def compare(one, two):
        """比较两个字符串,忽略大小写 如果一样则返回True, 否则返回False"""
        res = one.lower() == two.lower()
        return res
    
    str_one = "123XXX"
    str_two = "123xxx"
    # 比较两个字符串是否一致
    res = compare(str_one, str_two)
    print(res)
    

    形参 和 实参

    形参
      函数定义时候使用,只存在名称,没有具体的值,但可以在函数体内参与运算,很特殊,类似数学中的代数运算


    实参
      函数调用时候使用,需要传递具体的值给函数定义的形参

    函数调用过程传递参数的几种方式
      1. 位置参数,通过实参索引位置与形参索引位置依次赋值,等价于多重赋值
      2. 关键字参数,通过形参名称指定实参值的形式
      3. 解包序列提供位置参数,解包字典提供关键字参数

    def compare(one, two):
        """比较两个字符串,忽略大小写 如果一样则返回True, 否则返回False"""
        res = one.lower() == two.lower()
        return res
    
    
    str_list = ["123XXX", "123xxx"]
    # 解包序列获取位置参数,要求序列中元素个数必须和函数定义的位置参数个数一模一样
    res = compare(*str_list)
    print(res)
    
    
    str_dict = {
        "one": "123XXX",
        "two": "123xxx"
    }
    # 解包字典获取关键字参数,要求字典中的key要和函数定义的形参名称一一对应
    res = compare(**str_dict)
    print(res)
    

    函数定义形参的几种形式

      # 形参的定义控制函数调用时候参数的传递方式
      1. 必传参数
      2. 默认参数,在函数定义过程中计算的,只会执行一次,这对形参默认值时时可变类型时候显得重要
      3. 可变参数(又叫收集参数、非固定参数)
      4. 仅限位置参数、仅限关键字参数、位置或关键字参数

    def beg_sum(one, two, *num, **kwargs):
        """对两数求和,如果、num有则加上num中数"""
        res = one + two
        if not num:
            return res
        res += sum(num)
        # 输出kwars参数
        print(kwargs)
        return res
    
    # 通过位置参数传递参数
    res = beg_sum(1, 3, 77, 99, 99)
    print(res)
    
    # 通过关键字参数传递参数
    res = beg_sum(one=1, two=2, three=4)
    print(res)
    

      

    细心观察函数,你会发现,函数就是一个架子(框架),定义了输入,也定义了输出,至于中间的函数逻辑需要根据
    具体的业务场景写语句逻辑

    函数的语法糖形式又称为匿名函数
      # lambda 表达式,返回的时函数对象,主要用于一些内置的函数,如 map reduce filter sort
      # 应用于对可迭代对象中元素的简单处理
      # lambda 表达式只限于单行表达式
      # lambda 函数并特殊,只是普通def函数的简写,一种语法上的便捷,就好像吃了糖一样,甜甜的,所有叫做语法糖

    nums = [10, 2, 3, 4, 6, 7, 8]
    # 过滤掉 小于等于3的
    want_nums = filter(lambda x: x > 3, nums)
    print(list(want_nums))
    

     

    函数标注
      # 参数和返回值的元信息,类似静态语言的参数的类型与返回值类型,但不同的是Python的标注信息仅仅是提示,不做
      参数类型检查,保存在函数元信息的 __annotations__以字典形式存放

    def compare(one: str, two: str) -> int:
        """比较两个字符串,忽略大小写 如果一样则返回True, 否则返回False"""
        res = one.lower() == two.lower()
        return res
    
    str_one = "123XXX"
    str_two = "123xxx"
    # 比较两个字符串是否一致
    res = compare(str_one, str_two)
    print(res)
    # 打印函数元信息,函数标注
    print(compare.__annotations__)
    

      

    所有名称遵守同样的规范
      # [a-zA-Z][a-zA-Z0-9]*
      # 基本上都是英文单词和英文单词的缩写或简写
      # 不能是关键字或内置函数名称

    声明 = 定义 = 创建

    元数据 任何数据都有元数据
      对数据的特征描叙,又叫元信息
      例如数字 1 其元数据:
        a. int类型
        b. 支持数值运算 + - * / // %
        c. 逻辑值为真
        ... 具有意义的特征信息

      小明 元数据
        身高
        体重
        年龄
        学历
        ...

    Python 中并不存在变量声明这么一说,只存在变量赋值
      形式 varname = expression
      # 等号左边的是变量赋值,会首先查找当前作用域中的变量,如果没找到,则新建一个变量varname,如果找到则修改其值
      # 但是在 expression 中的变量,更确切的说是参与表达式运算的变量,这就存在变量引用,这个变量引用会首先找当前局部作用域中该行语句之前创建的变量,如果没有找到,则找外一层的局部变量,依次往上找,并不会往下找,一直找到全局变量,也就是定义在模块中的变量,还找不到则去找内置名称
      # expression 中变量,称为变量引用,变量引用的查找过程 当前作用域 > 外层函数的作用域 > 全局作用域 > 内置名称, 只要在某一级找到,则停止查找返回确切的值
      # Python中也不存在常量这么概念,我们可以约定变量名大写就是语义上实现常量

      构成作用域的在Python中只要函数、模块、内置名称、类

  • 相关阅读:
    Storm-源码分析-Topology Submit-Supervisor
    Storm-源码分析- Multimethods使用例子
    Storm-源码分析- Storm中Zookeeper的使用
    Storm-源码分析-EventManager (backtype.storm.event)
    Storm-源码分析-Topology Submit-Nimbus
    Storm-源码分析-Topology Submit-Nimbus-mk-assignments
    Storm-源码分析- Component ,Executor ,Task之间关系
    决策树之 C4.5
    JSBridge深度剖析
    【工具类】Date、Long、String 类型互转
  • 原文地址:https://www.cnblogs.com/2bjiujiu/p/13771452.html
Copyright © 2011-2022 走看看