一、Python的函数传递
1、类型是属于对象的,而不是变量
2、对象有两种:不可更改,strings, tuples, 和numbers;可以修改的对象:list, dict, set
3、当一个引用传递给函数,函数自动复制一份引用,函数里的引用和外边的引用没有半毛关系。所以当函数把引用指向了一个不可变对象,当函数返回的时候,外面的引用没被修改;当函数内的引用指向的是可变对象,对它的操作就和定位了指针地址一样,在内存里进行修改。
示例代码如下:
a = 1
def fun(a):
a = 2
fun(a)
print(a)
输出a 为1
# ------------------
a = []
def fun(a):
a.append(1)
fun(a)
print(a)
输出a 为[1]
二、Python字段推导式
注:类似列表推倒试,以键值对方式推倒 用符号“:”隔开,返回字典,语法如下
1、遍历过滤字典:并支持condition判断 和key、value修改 如 value+"str 、key.lower()
data = {key: value for key, value in dict.items() if condition}
2、遍历数组
data = {key: value for key, value in list if condition}
3、合并数组:
arr1 = ["小明", "小红"]
arr2 = ["男", "女"]
data = {key: value for key, value in zip(arr1, arr2)}
输出:data = {'小明': '男', '小红': '女'}
4、字典同字母key(忽略大小写)求和
dict_a = {'a': 2, 'B': 5, 'A': 7, 'C': 10}
data = {key.lower(): dict_a.get(key.lower(), 0) + dict_a.get(key.upper()) for key in dict_a.keys() if key.lower() in ["a", "b"]}
三、面向切面编程AOP和装饰器
装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。
四、鸭子类型
描述:当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”我们并不关心对象是什么类型,到底是不是鸭子,只关心行为。
作用:动态语言中经常使用,非常灵活,使得python不像java那样专门去弄一大堆的设计模式
五、Python 函数重载
可变参数类型。
可变参数个数。
基本设计原则:仅仅当两个函数除了参数类型和参数个数不同以外,其功能是完全相同的,此时才使用函数重载,如果两个函数的功能其实不同,那么不应当使用重载,而应当使用一个名字不同的函数。
那么对于情况 1 ,函数功能相同,但是参数类型不同,python 如何处理?答案是根本不需要处理,因为 python 可以接受任何类型的参数,如果函数的功能相同,那么不同的参数类型在 python 中很可能是相同的代码,没有必要做成两个不同函数。
对于情况 2 ,函数功能相同,但参数个数不同,python 如何处理?大家知道,答案就是缺省参数。对那些缺少的参数设定为缺省参数即可解决问题。因为你假设函数功能相同,那么那些缺少的参数终归是需要用的。
鉴于情况 1 跟 情况 2 都有了解决方案,python 自然就不需要函数重载了。