python学习笔记--进阶
# """
# 找出序列中出现次数最多的元素
# """
# from collections import Counter
#
# words = [
# 'look', 'into', 'my', 'eyes', 'look', 'into', 'my', 'eyes',
# 'the', 'eyes', 'the', 'eyes', 'the', 'eyes', 'not', 'around',
# 'the', 'eyes', "don't", 'look', 'around', 'the', 'eyes',
# 'look', 'into', 'my', 'eyes', "you're", 'under'
# ]
# counter = Counter(words)
# print(counter.most_common(3))
# # heapq模块,堆排,优先队列
# import heapq
#
# list1 = [34, 25, 12, 99, 87, 63, 58, 78, 88, 92]
# list2 = [
# {'name': 'IBM', 'shares': 100, 'price': 91.1},
# {'name': 'AAPL', 'shares': 50, 'price': 543.22},
# {'name': 'FB', 'shares': 200, 'price': 21.09},
# {'name': 'HPQ', 'shares': 35, 'price': 31.75},
# {'name': 'YHOO', 'shares': 45, 'price': 16.35},
# {'name': 'ACME', 'shares': 75, 'price': 115.65}
# ]
# print(heapq.nlargest(3, list1))
# print(heapq.nsmallest(3, list1))
# print(heapq.nlargest(2, list2, key=lambda x: x['price']))
# print(heapq.nlargest(2, list2, key=lambda x: x['shares']))
# """
# 贪婪法:在对问题求解时,总是做出在当前看来是最好的选择,不追求最优解,快速找到满意解。
# 输入:
# 20 6
# 电脑 200 20
# 收音机 20 4
# 钟 175 10
# 花瓶 50 2
# 书 10 1
# 油画 90 9
# """
# class Thing(object):
# """物品"""
#
# def __init__(self, name, price, weight):
# self.name = name
# self.price = price
# self.weight = weight
#
# @property
# def value(self):
# """价格重量比"""
# return self.price / self.weight
#
#
# def input_thing():
# """输入物品信息"""
# name_str, price_str, weight_str = input().split()
# return name_str, int(price_str), int(weight_str)
#
#
# def main():
# """主函数"""
# # map() 会根据提供的函数对指定序列做映射。
# # 第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
# max_weight, num_of_things = map(int, input().split())
# all_things = []
# for _ in range(num_of_things):
# all_things.append(Thing(*input_thing()))
# all_things.sort(key=lambda x: x.value, reverse=True)
# total_weight = 0
# total_price = 0
# for thing in all_things:
# if total_weight + thing.weight <= max_weight:
# print(f'小偷拿走了{thing.name}')
# total_weight += thing.weight
# total_price += thing.price
# print(f'总价值: {total_price}美元')
#
#
# if __name__ == '__main__':
# main()
# # 说明:子列表指的是列表中索引(下标)连续的元素构成的列表;列表中的元素是int类型,可能包含正整数、0、负整数;程序输入列表中的元素,输出子列表元素求和的最大值,例如:
# #
# # 输入:1 -2 3 5 -3 2
# #
# # 输出:8
# #
# # 输入:0 -2 3 5 -1 2
# #
# # 输出:9
# #
# # 输入:-9 -2 -3 -5 -3
# #
# # 输出:-2
# def get_max_sub_list():
# list1 = list(map(int, input().split()))
# max1 = now = list1[0]
# for i in range(1, len(list1)):
# now = max(list1[i], now + list1[i])
# if now > max1:
# max1 = now
#
# return max1
# if __name__ =="__main__":
# print(get_max_sub_list())
# # 函数使用
# # 将函数视为“一等公民”
# #
# # - 函数可以赋值给变量
# # - 函数可以作为函数的参数
# # - 函数可以作为函数的返回值
#
# # 高阶函数使用
# # filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。
# #
# # 该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。
# item1 = list(map(lambda x: x ** 2, filter(lambda x: x % 2, range(1, 10))))
# print(item1)
# items2 = [x ** 2 for x in range(1, 10) if x % 2]
# print(items2)
# """
# 月薪结算系统 - 部门经理每月15000 程序员每小时200 销售员1800底薪加销售额5%提成
#
# 继承:is-a
# """
# from abc import ABCMeta, abstractmethod
#
#
# class Employee(metaclass=ABCMeta):
# """员工(抽象类)"""
#
# def __init__(self, name):
# self.name = name
#
# @abstractmethod
# def get_salary(self):
# """结算月薪(抽象方法)"""
# pass
#
#
# class Manager(Employee):
# """部门经理"""
#
# def get_salary(self):
# return 15000.0
#
#
# class Programmer(Employee):
# """程序员"""
#
# def __init__(self, name, working_hour=0):
# self.working_hour = working_hour
# super().__init__(name)
#
# def get_salary(self):
# return 200.0 * self.working_hour
#
#
# class Salesman(Employee):
# """销售员"""
#
# def __init__(self, name, sales=0.0):
# self.sales = sales
# super().__init__(name)
#
# def get_salary(self):
# return 1800.0 + self.sales * 0.05
#
#
# class EmployeeFactory:
# """创建员工的工厂(工厂模式 - 通过工厂实现对象使用者和对象之间的解耦合)"""
#
# @staticmethod
# def create(emp_type, *args, **kwargs):
# """创建员工"""
# all_emp_types = {'M': Manager, 'P': Programmer, 'S': Salesman}
# cls = all_emp_types[emp_type.upper()]
# return cls(*args, **kwargs) if cls else None
#
#
# def main():
# """主函数"""
# emps = [
# EmployeeFactory.create('M', '曹操'),
# EmployeeFactory.create('P', '荀彧', 120),
# EmployeeFactory.create('P', '郭嘉', 85),
# EmployeeFactory.create('S', '典韦', 123000),
# ]
# for emp in emps:
# print(f'{emp.name}: {emp.get_salary():.2f}元')
#
#
# if __name__ == '__main__':
# main()
# 枚举
"""
经验:符号常量总是优于字面常量,枚举类型是定义符号常量的最佳选择
"""
from enum import Enum, unique
import random
# @unique保证每个属性值唯一
@unique
class Suite(Enum):
"""花色"""
SPADE, HEART, CLUB, DIAMOND = range(4)
def __lt__(self, other):
return self.value < other.value
class Card():
"""牌"""
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 __repr__(self):
return self.show()
class Poker():
"""扑克"""
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)
self.index = 0
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():
"""玩家"""
def __init__(self, name):
self.name = name
self.cards = []
def get_one(self, card):
"""摸一张牌"""
self.cards.append(card)
def sort(self, comp=lambda card: (card.suite, card.face)):
"""整理手上的牌"""
self.cards.sort(key=comp)
def main():
"""主函数"""
poker = Poker()
poker.shuffle()
players = [Player('东邪'), Player('西毒'), Player('南帝'), Player('北丐')]
while poker.has_more:
for player in players:
player.get_one(poker.deal())
for player in players:
player.sort()
print(player.name, end=': ')
print(player.cards)
if __name__ == '__main__':
main()
装饰器:

浙公网安备 33010602011771号