zoukankan      html  css  js  c++  java
  • Python-函数

    Python中通过pass忽略代理架构错误,用来组织代码架构体系

    函数相关关键字: def return * ** lambda

    为何需要函数?

      1. 功能重用,避免重复代码

      2. 组织代码和隐藏细节

      3. 可读性

     

    函数整体架构

    def funcName(variable, ..., *args, **kwargs):
        pass
    

      

    函数原数据有哪些?

      1. 函数名       .__name__

      2. 函数注释      .__doc__

      3. 函数所在模块    .__modul__

      4. 函数默认参数元组  .__defaults__

      5. 函数代码属性    .__code__

    def bei_men_chui_xue(skin='yellow'):
        """北门吹雪"""
        name = '北门吹雪'
        age = 18
        pass
    
    
    print("函数名:", bei_men_chui_xue.__name__)
    print("函数注释:", bei_men_chui_xue.__doc__)
    print("函数默认参数组:", bei_men_chui_xue.__defaults__)
    print("函数代码属性:", bei_men_chui_xue.__code__)
    

      

    形式参数是什么?

      函数中用来代替真实的数据,如y=x+1,中x就是形式参数,y是函数执行结果返回值

      1. 必须参数。函数调用时候必须传递的参数,不能放在默认参数之后

    def bei_men_chui_xue(name, skin='yellow'):
        """北门吹雪"""
        print(name)
        pass
    
    
    bei_men_chui_xue("北门吹雪")
    

      2.  默认参数。有传参则覆盖默认值,无传参则启动默认值,默认参数不应该过长,过长则可以通过对象传递进去

    from collections import namedtuple
    
    
    def bei_men_chui_xue(info, skin='yellow', country="中国"):
        """北门吹雪"""
        print(info.name, info.age, skin, country)
        pass
    
    
    info = namedtuple("Info", ["name", "age"])
    info.name = "北门吹雪"
    info.age = 18
    bei_men_chui_xue(info, skin='white')
    

      3. 可变参数,多余参数组成新元组

    def bei_men_chui_xue(name, *args):
        """北门吹雪"""
        print(name, args, type(args))
        pass
    
    
    bei_men_chui_xue("北门吹雪", 18, "中国")
    

      4. 可变关键字参数,多余参数组成字典

    def bei_men_chui_xue(name, **kwargs):
        """北门吹雪"""
        print(name, kwargs, type(kwargs))
        pass
    
    
    bei_men_chui_xue("北门吹雪", age=18, country="中国")
    

      5. 形式参数顺序为: 必须参数(必须放到首位)、默认参数、可变参数

    什么是传参?

      函数在执行或者类实例化的时候,需要一些值,传入这些值

      1. 不指定形参名,依次依顺序传递进去,考虑传参顺序

    def bei_men_chui_xue(name, age, country):
        """北门吹雪"""
        print(name, age, country)
        pass
    
    
    bei_men_chui_xue("北门吹雪", 18, "中国
    

      2. 形参关键字传值,不需要考虑顺序,增强代码可读性

    def bei_men_chui_xue(name, age, country):
        """北门吹雪"""
        print(name, age, country)
        pass
    
    
    bei_men_chui_xue(name="北门吹雪", age=18, country="中国")
    

      3. 必须参数必须传值

      4. 解包可迭代对象,依次依顺序把元素传递进去 *

    def bei_men_chui_xue(name, age, country):
        """北门吹雪"""
        print(name, age, country)
        pass
    
    
    bei_men_chui_xue(*("北门吹雪", 18, "中国"))
    

      5. 解包字典,字典的key是关键字参数的参数名,字典的value是关键字的实参 **

    def bei_men_chui_xue(name, age, country):
        """北门吹雪"""
        print(name, age, country)
        pass
    
    
    bei_men_chui_xue(**{'name': "北门吹雪", 'age': 18, 'country': "中国"})
    

      

    什么是函数返回?

      函数执行完,需要返回其处理结果,有时我们就需要这样的结果, return

      1. 碰到return函数将返回并结束函数

    def bei_men_chui_xue(name, age, country):
        """北门吹雪"""
        return name
        print(name, age, country)
        return age, country
    
    
    r = bei_men_chui_xue(**{'name': "北门吹雪", 'age': 18, 'country': "中国"})
    print(r)
    

      # 有时需要巧用return关键字,在一些if分支中,分支本身就只能走其中一个,联合return结束函数

    def bei_men_chui_xue(name, age, country):
        """北门吹雪"""
        if age >= 18:
            return name
        else:
            return country
    
    
    r = bei_men_chui_xue(**{'name': "北门吹雪", 'age': 17, 'country': "中国"})
    print(r)
    

      2. 可以有1个或多个返回值,多个返回值以逗号隔开,结果则组合成元组形式

    def bei_men_chui_xue(name, age, country):
        """北门吹雪"""
        return name, age, country
    
    
    r = bei_men_chui_xue(**{'name': "北门吹雪", 'age': 17, 'country': "中国"})
    print(r, type(r))
    

      3. 当函数没有返回值的时候,返回None

    def bei_men_chui_xue(name, age, country):
        """北门吹雪"""
        return
    
    
    r = bei_men_chui_xue(**{'name': "北门吹雪", 'age': 17, 'country': "中国"})
    print(r, type(r))
    

      

    函数执行顺序: 先定义再调用,逐行从上到下依次解释执行

    * 放在形参中表示把多余参数组成新的元组,在实参中则解包可迭代对象依次依顺序传递进函数

    ** 放在形参中表示把多余关键字参数组成新的字典,在实参中则解包字典,把字典的key当作实参关键字,字典的value当作实参关键字的值

    匿名函数 lambda

      没有名字但具有函数特性,核心功能还是算子

    bei_men_chui_xue = lambda x:  x+1
    print(bei_men_chui_xue(6))

      等价于

    def bei_men_chui_xue(number):
        return number + 1
    
    print(bei_men_chui_xue(6))
    

      其实匿名函数本质不是上面这样用的,算子的特性,用于map reduce等需要把迭代对象中元素依次处理的场景

    names = ["bei_men_chui_xue", 'qi_niu_yun', 'jin_ri_tou_tiao']
    
    # 把以非字母分割的字符首字母大写
    # 最终结果为 ['Bei_Men_Chui_Xue', 'Qi_Niu_Yun', 'Jin_Ri_Tou_Tiao']
    names = map(lambda value: value.title(), names)
    print(list(names))
    

      

    小知识:

      自定义递归(问题规模缩小,有结束条件)限制,Python默认999次

      递归大兄弟,自己玩自己,太多内存受不了

    import sys
    sys.setrecursionlimit(num)
    

     

    经验:

      1. 很多时候,函数命名极其关键,通过函数名指明函数式做什么的

      2. 函数不仅仅只是代码重用,还能增强代码的可阅读性,隐藏了具体实现细节,很多时候阅读代码的时候并不想看到具体实现是什么,如果想看具体实现细节则直接通过函数名索引过去

      3. 匿名函数其实最本质的作用是算子,处理逻辑只有一行而不想单独定义一个函数那就不需要函数名字,没有名字但具有函数特性这也是被称为匿名函数的原因

      4. 递归其实本质上是for循环的另外一种实现方式而已,仅此而已,但比for循环更加难以理解这种行为,虽然看起来比较简洁

      5. *在其他语言中表示指针类型或者取指针指向的值,但在Python中是解包和压包,主要用于函数的形参和实参

  • 相关阅读:
    Hadoop启动脚本分析
    java基础-Idea开发工具介绍
    Hadoop集群-HDFS集群中大数据运维常用的命令总结
    Hadoop部署方式-高可用集群部署(High Availability)
    Hadoop部署方式-完全分布式(Fully-Distributed Mode)
    Hadoop部署方式-伪分布式(Pseudo-Distributed Mode)
    Hadoop部署方式-本地模式(Local (Standalone) Mode)
    Hadoop基础原理
    Java基础-DBCP连接池(BasicDataSource类)详解
    nc命令的常用参数介绍
  • 原文地址:https://www.cnblogs.com/2bjiujiu/p/9136576.html
Copyright © 2011-2022 走看看