函数
名字
命名方法(官方方法,驼峰命名法)
命名原则:1.由数字,下划线和字母组成,且不能由数字开头。
2.不能命名关键字
3.区分大小写,大写为常量
参数
默认值
可变参数 * args
def say_hello(*args):
print(args)
def main():
a_list = [1, 2, 3, 4, 5, 'zhangli', 24]
say_hello(*a_list)
if __name__ == '__main__':
main()
关键字参数 **kwargs
def say_hello(**kwargs):
print(kwargs)
def main():
a_set = {'name': 'zhangli','age': 24, 'sex': 'female'}
say_hello(**a_set)
if __name__ == '__main__':
main()
命名关键字参数 *
def foo(a, b, c, *, name, age):
print(a+b+c)
print(name, ':', age)
def main():
foo(1, 2, 3, name='zhang', age=24)
if __name__ == '__main__':
main()
返回值
对象
字符串
元组
集合
嵌套函数
高阶函数 函数里面再次调用函数
# 通过向函数中传入函数,可以写出更通用的代码
# calc函数中的第二个参数是另一个函数,他代表了一个二元运算
# 所以calc函数变得通用性更强,可以由传入的第二个参数来决定到底做什么
# 高内聚, 低耦合 high cohesion low coupling
def calc(my_list, op):
total = my_list[0]
for index in range(1, len(my_list)):
total = op(total, my_list[index])
return total
def add(x, y):
return x + y
def mul(x, y):
return x * y
def main():
my_list = [1, 3, 5, 7, 9]
print(calc(my_list, add))
print(calc(my_list, mul))
if __name__ == '__main__':
main()
# 装饰器
def record(fn):
def wrapper(*args, **kwargs):
print('准备执行%s函数之前...' % fn.__name__)
print(args)
print(kwargs)
# 此行代码在执行被装饰的函数
# 在这行代码的前后我们可以附加其他的代码
# 这些代码可以让我们在执行函数时做一些额外的工作
val = fn(*args, **kwargs)
print('%s函数执行完成' % fn.__name__)
return val
return wrapper
# 通过修饰器修饰f函数,让f函数在执行时,可以进行更多的操作
@record # 合二为一
def f(n):
if n == 0 or n == 1:
return 1
return n * f(n-1)
if __name__ == '__main__':
print(f(5))
# 装饰器 让我们看出函数里面到底发生了什么。
lambda函数 (匿名函数)-- 此函数极短,故简写,直接写在放参数的括号里
闭包
偏函数
柯里化
作用域
局部作用域
嵌套作用域
全局作用域
内置作用域
标志符 LEGB local enclose global build_in (nonlocal global)
类和对象
类的定义
1.类是对象的蓝图和模板,有了类就可以定义对象
2.类最重要的就是数据抽象和行为抽象
3.数据抽象:抽取对象的共有的静态特征 -- 属性
4.行为抽象:抽取对象的共有的行为特征 -- 行为
对象的关系
use a 依赖关系(作用和反作用)
have a 关联(普通/ 聚合/合成)(你中有我,我中有你)
提供继承信息的称为父类(超类/基类)
得到继承信息的称为子类(派生类/衍生类)
通过继承我们可以将子类中的重复代码,抽取到父类中。
子类通过继承,并复用这些代码,来减少重复代码的编写
将来如果要维护子类的公共代码,只需要在父类中进行操作即可
七大原则
单一职责原则
开闭原则
依赖倒转原则
里氏替换原则
接口隔离原则
合成聚合复用原则
迪米特法则