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()
装饰器: