一、Linux命令
1.find命令
find code/ -name *.py -> 在code目录下查找后缀名为.py的文件
2.查找替换
:1,$s/shit/self/ci
:搜索范围/需要替换的内容/替换内容/是否需要确认,忽略大小写
二、面向对象的编程
1.面向对象的四大支柱:抽象、封装、继承、多态
抽象 -> 定义类的过程就是提取共性的抽象过程
数据抽象 -> 找到对象的静态特征 -> 属性 -> 找名词
行为抽象 -> 找到对象的动态特征 -> 方法 -> 找动词
封装 -> 将数据和操作数据的方法从逻辑上组成一个整体 -> 对象
隐藏实现细节 暴露简单的调用接口
继承 -> 从已有的类创建新类的过程
提供继承信息的称之为父类,得到继承信息的称之为子类
多态 -> 调用相同的方法,做了不同的事情 -> 同样的方法在运行时表现出不同行为
子类重写父类方法,不同的子类给出不同的实现版本
注:写代码时尽量用符号常量去替换字面常量
2.面向对象七个设计原则
1.单一职责原则 -> 一个类只做该做的事情不做不该做的事情
2.开闭原则
3.依赖倒转原则
4.里氏替换原则
5.接口隔离原则
6.合成聚合复用原则 -> 优先考虑强关联关系而不是继承关系来复用代码
7.最少知识原则 (迪米特法则)
GoF设计模式:23种经典场景 -> Python中弱化了很大一部分
3.类和类之间(对象之间)的关系:
1.is-a 关系 -> 继承
2.has-a 关系 -> 关联/聚合/合成
3.use-a 关系 -> 依赖
三、扑克游戏
代码
#!/usr/bin/python3
"""
扑克游戏
"""
from enum import Enum
from enum import unique
import random
# 经验:符号常量优于字面常量 枚举类型是定义符号常量的最佳选择
@unique
class Suite(Enum):
"""花色的枚举"""
SPADE = 0
HEART = 1
CLUB = 2
DIAMOND = 3
class Card(object):
"""牌"""
def __init__(self, suite, face):
self.suite = suite
self.face = face
def show(self):
suites = ['黑','红','梅','方']
faces = [
'', 'A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K'
]
return f'{suites[self.suite.value]}{faces[self.face]}'
"""
def __lt__(self, other):
if self.suite == other.suite:
return self.face < other.face
return self.suite.value < other.suite.value
"""
def __str__(self):
return self.show()
def __repr__(self):
return self.show()
class Poker(object):
"""扑克"""
def __init__(self):
self.index = 0
self.cards = [Card(suite, face)
for suite in Suite
for face in range(1, 14)]
def shuffle(self):
"""洗牌"""
random.shuffle(self.cards)
def deal(self):
"""发牌"""
card = self.cards[self.index]
self.index += 1
return card
@property
def has_more(self):
"""是否还有更多的牌"""
return self.index < len(self.cards)
class Player(object):
"""玩家"""
def __init__(self, name):
self.name = name
self.cards = []
def get_one(self,card):
"""摸一张牌"""
self.cards.append(card)
def sort_cards(self, key = lambda card: (card.suite.value, card.face)):
"""玩家整理手上的牌"""
self.cards.sort(key=key)
def main():
poker = Poker()
poker.shuffle()
players = [
Player('东邪'), Player('西毒'), Player('南帝'), Player('北丐')
]
for _ in range(13):
for player in players:
player.get_one(poker.deal())
for player in players:
player.sort_cards(key = lambda card: card.face)
print(player.name, end = '')
print(player.cards)
if __name__ == '__main__':
main()
自定义输出
def __str__(self):
return self.show()
输出对象
def __repr__(self):
return self.show()
生成式
self.cards = [Card(suite, face) for suite in Suite for face in range(1, 14)]
*前面的参数称为位置参数(传参时不用指定参数名按位置对号入座即可)
*后面的参数称为命名关键字参数(传参时必须给出参数名和参数值)
def sort_cards(self, *, key = lambda card: (card.suit.value, card.face)):
"""玩家整理手上的牌"""
self.cards.sort(key=key)
四、录制宏的步骤
1.在命令模式下输入qa开始录制宏(其中a是寄存器的名字,也可以是其他英文字母或0-9的数字)。
2.执行你的操作(光标操作、编辑操作等),这些操作都会被录制下来。
3.如果录制的操作已经完成了,按q结束录制。
4.通过@a(a是刚才使用的寄存器的名字)播放宏,如果要多次执行宏可以在前面加数字,例如100@a表示将宏播放100次。
五、作业
实现Linux环境中的日历功能
代码
from datetime import date
def main():
today = date.today()
str_today = date.strftime(today, '%Y %m %d').split(' ')
year = str_today[0]
century = int(year) // 100
y = int(year[-2:])
month = int(str_today[1])
day = 1
months = ['', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
day_nums = ['', 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
if int(year) % 4 == 0 and int(year) % 100 != 0 or int(year) % 400 == 0:
day_nums = ['', 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
week = (y + y // 4 + century // 4 - 2 * century + 26 * (month + 1) // 10 + day - 1) % 7
day_num = day_nums[month]
days = [x for x in range(1, day_num+2)]
print('\t ' + months[month] + ' ' + year)
str1 = 'Su\tMo\tTu\tWe\tTh\tFr\tSa'
print(str1)
tab = 0
count = 0
while tab < week:
tab += 1
print('\t', end='')
count += 1
for day in days:
count += 1
if count % 7 == 0:
print(day, '\t')
else:
print(day, '\t', end='')
if __name__ == '__main__':
main()
网友评论