函数、面向对象编程总结
这一周主要学习了函数和面向对象编程。下面对函数和面向对象编程做一个总结和补充。
函数部分
如何写一个函数
def 函数名(参数):
...
return ...
def 函数名(*args):
for arg in args:
...
return ...
def 函数名(*args, **kwargs):
for arg in args:
...
for value in kwargs.values():
...
return ...
定义函数时,写在 * 前面的参数为位置参数,只需要对号入座 写在 * 后面的参数为命名关键字参数,必须写成“参数名=参数值”
函数的全局变量与局部变量
全局变量:没有写在任何函数里面的变量 局部变量:定义在函数内部的变量 Python程序中搜索一个变量是按照 LEGB 顺序进行搜索的
Local(局部作用域) ---> Embeded(嵌套作用域) ---> Global(全局作用域) ---> Built-in(内置作用域) global : 声明使用全局变量或者定义一个局部变量将其放到全局作用域 nonlocal :声明使用嵌套作用域的变量(不使用局部变量)
例题:CRAPS赌博游戏 玩家摇两颗色子,如果第一次摇出了7点或11点,玩家胜;如果摇出了2点、3点、12点,庄家胜; 如果摇出了其他的点数,游戏继续,玩家重新摇色子;如果玩家摇出了第一次摇的点数,玩家胜; 如果玩家摇出了7点,庄家胜;如果玩家摇出其他点数,游戏继续,玩家重新摇色子,直到分出胜负。
游戏开始之前,玩家有1000元的初始资金,玩家可以下注,赢了获得下注的金额,输了就扣除下注的金额, 游戏结束的条件是玩家把钱输光
import random
m = 1000
def roll_dice(num):
"""
摇色子
:param num: 色子的数量
:return: 摇出的点数
"""
q = 0
for _ in range(num):
q += random.randrange(1, 7)
return q
def win():
"""
赢
"""
global m
m += x
print('玩家胜')
def lose():
"""
输
"""
global m
m -= x
print('庄家胜')
while m > 0:
print(f'玩家现有资金:{m}')
x = 0
while x <= 0 or x > m:
try:
x = int(input('输入下注的金额:'))
except ValueError:
pass
s1 = roll_dice(2)
print(f'第一次摇出的点数:{s1}')
if s1 in (7, 11):
win()
elif s1 in (2, 3, 12):
lose()
else:
while True:
s2 = roll_dice(2)
print(f'游戏继续,玩家摇出的点数:{s2}')
if s2 == s1:
win()
break
elif s2 == 7:
lose()
break
print('玩家破产,游戏结束')
例题2编写一个函数判断一个正整数是不是“快乐数”。 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程, 如果数字变成了1,这个数就是快乐数,如果无限循环始终变不到1,这个数就不是快乐数。
def is_happhy_num(num):
"""
判断正整数是不是快乐数
:param num:输入一个正整数
:return:快乐数返回True,否则返回False
"""
list1 = []
while True:
x = 0
while num > 0:
x += (num % 10) ** 2
num = num // 10
num = x
if num not in list1:
list1.append(num)
else:
return False
if x == 1:
return True
if __name__ == '__main__':
x = int(input('输入一个正整数:'))
if is_happhy_num(x):
print(f'{x}是快乐数')
else:
print(f'{x}不是快乐数')
面向对象编程部分
面向对象编程4大支柱
抽象 :提取共性 封装 :把数据和操作数据的函数从逻辑上组装成一个整体 继承 :扩展已有的类创建新类 多态 :给不同对象发出同样的消息,不同对象的执行不同的行为
魔术方法
魔术方法:有特殊用途和意义的方法 __init__ :初始化方法 __str__ :获得对象的字符串表示 __repr__ :获得对象的字符串表示,把对象放到容器中调用print输出 __lt__ :进行大小的比较
动态属性与静态方法
动态属性
在运行时可以改变其结构的语言,例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。 在Python中,我们可以动态为对象添加属性
静态方法
们在类里面写的函数,通常称为方法,它们基本上都是发给对象的消息 但是有的时候,我们的消息并不是想发给对象,而是希望发给类,这时候就会用到静态方法。
对象方法、类方法、静态方法都可以通过类名.方法名 的方式来调用,区别在于方法的第一个参数到底是普通对象还是类对象,还是没有接受消息的对象
在面向对象的世界中,一切皆为对象,我们定义的类也是对象,所以类也可以接收消息,对应的方法是类方法或静态方法。通过继承,我们可以从已有的类创建新类,实现对已有类代码的复用。
|