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中是解包和压包,主要用于函数的形参和实参

posted @ 2018-06-05 10:08  梦_鱼  阅读(182)  评论(0编辑  收藏  举报