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