美文网首页
day35-Vim编辑py程序

day35-Vim编辑py程序

作者: xdxh | 来源:发表于2018-11-15 20:46 被阅读0次

一、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()

相关文章

网友评论

      本文标题:day35-Vim编辑py程序

      本文链接:https://www.haomeiwen.com/subject/xkbyfqtx.html