大家好,我又来写博客了,距上一次发表博客已经过了两周了,那么,下面我就继续分享一下我学习到的一点知识:
首先是一个大致的目录:
函数
名字
参数/默认值/可变参数/关键字参数/命名关键字参数
返回值
类和对象
高类聚,低耦合
单一职责原则
里式替换
开闭原则
依赖倒换原则(x)
接口隔离原则(x)
合成聚合复用原则
迪米特法则(最少知识原则)
说明:(x)前面的是暂时不用了解的
嵌套定义
高阶函数 - Lambda函数(匿名函数)/闭包/偏函数/柯里化
标识符
print(a)
LEGB - not defined - global/nonlical
首先是定义函数,在Python中我们用def来定义函数,然后用return来返回值,首先我们来看一个问题:
请说出下面的方程有多少组正整数解:
x1+x2+x3+x4=8
这个问题用代码解决就是
"""
输入M和N计算C(M,N)
"""
m = int(input('m = '))
n = int(input('n = '))
fm = 1
for num in range(1, m + 1):
fm *= num
fn = 1
for num in range(1, n + 1):
fn *= num
fmn = 1
for num in range(1, m - n + 1):
fmn *= num
print(fm // fn // fmn)
是不是看起来很复杂,而且代码重复率过多,当你了解了函数之后你就可以这样做
def factorial(num):
"""
求阶乘
:param num: 非负整数
:return: num的阶乘
"""
result = 1
for n in range(1, num + 1):
result *= n
return result
m = int(input('m = '))
n = int(input('n = '))
# 当需要计算阶乘的时候不用再写循环求阶乘而是直接调用已经定义好的函数
print(factorial(m) // factorial(n) // factorial(m - n))
这样代码看起来就会更精简
若我们给函数的参数一个默认值,那么如果我们在调用这个函数时不传入其他参数,这个函数将使用这个默认值的参数,接下来我们看看例子:
from random import randintdef
roll_dice(n=2):
"""
摇色子
:param n: 色子的个数
:return: n颗色子点数之和
"""
total = 0
for _ in range(n):
total += randint(1, 6)
return total
def add(a=0, b=0, c=0):
return a + b + c
# 如果没有指定参数那么使用默认值摇两颗色子
print(roll_dice())
# 摇三颗色子
print(roll_dice(3))
print(add())
print(add(1))
print(add(1, 2))
print(add(1, 2, 3))
# 传递参数时可以不按照设定的顺序进行传递
print(add(c=50, a=100, b=200))
我们还可以对上面的代码进行优化:
# 在参数前使用*表示args是可变参数
# 也就是说调用add函数时传入的参数个数可以是0个或多个
def add(*args):
total = 0
for val in args:
total += val
return total
print(add())
print(add(1))
print(add(1, 2))
print(add(1, 2, 3))
print(add(1, 3, 5, 7, 9))
关于类和面向对象
继承 - 从已经有的类创建新类的过程
提供继承信息的称为父类(超类/基类)
得到继承信息的称为子类(派生类/衍生类)
通过继承我们可以将子类中的重复代码抽取到父类中
子类通过继承并复用这些代码来减少重复代码的编写
将来如果要维护子类的公共代码只需要在父类中进行操作即可
以及
线段上有两个点 - has-a - 关联
人使用了房子 - use-a - 依赖
学生是人 - is-a - 继承
我们还可以通过__slots__限定对象可以绑定的成员变量
Python没有从语言层面支持抽象类的概念
我们可以通过abc模块来制造抽象类的效果
在定义类的时候通过指定metaclass=ABCMeta可以将类声明为抽象类
抽象类是不能创建对象的 抽象类存在的意义是专门拿给其他类继承
abc模块中还有一个包装器abstractmethod
通过这个包装器可以将方法包装为抽象方法 必须要求子类进行重写
以上就是我这两周学习函数和面向对象所积累的一些知识点,希望对大家能有所帮助,之所以没有注意排版和格式
是因为我急着去复习,下周还有考试!!!