一、单例模式

1、常用的单例模块

class Singleton(object):
_instance = None def __new__(cls, *args, **kwargs): if not cls._instance:
cls._instance = super(Singleton, cls).__new__(cls)
return cls._instance s1 = Singleton()
s2 = Singleton()
print(s1 is s2) # True

2、属性共用的单例

"""
上面的第一种写法,虽然创建的是同一个实例,
但是属性是不共用的,因为每次__init__都会重新设置
""" class Singleton(object):
_instance = None def __new__(cls, *args, **kwargs): if not cls._instance:
cls._instance = super(Singleton, cls).__new__(cls)
return cls._instance def __init__(self, name, age):
self.name = name
self.age = age s1 = Singleton(name="小明", age=18)
print(s1.name, s1.age) # 小明 18 s2 = Singleton(name="小红", age=17)
print(s2.name, s2.age) # 小红 17 print(s1 is s2) # True """
因此想要属性也共用,__init__也需要处理
""" class Singleton(object):
_instance = None
_initialized = False def __new__(cls, *args, **kwargs): if not cls._instance:
cls._instance = super(Singleton, cls).__new__(cls)
return cls._instance def __init__(self, name, age):
if not self._initialized:
self.name = name
self.age = age
self._initialized = True s1 = Singleton(name="小明", age=18)
print(s1.name, s1.age) # 小明 18 s2 = Singleton(name="小红", age=17)
print(s2.name, s2.age) # 小明 18 print(s1 is s2) # True

3、加锁的单例

import time
import threading class Singleton(object):
lock = threading.RLock() # 定义一把锁
_instance = None def __new__(cls, *args, **kwargs):
if cls._instance:
return cls._instance # 如果之前实例化过,没必要再次实例化,因为都是同一个实例 with cls.lock: # 避免当线程没有返回实例前,另一个线程也进来了,导致出现不止一个实例
if not cls._instance:
cls._instance = super(Singleton, cls).__new__(cls)
return cls._instance def task(arg):
obj = Singleton()
print(obj) for i in range(10):
t = threading.Thread(target=task,args=(i,))
t.start() time.sleep(10)
obj = Singleton()

4、单例装饰器

def singleton(cls):
_instance = {} def _singleton(*args, **kwargs):
if cls not in _instance:
_instance[cls] = cls(*args, **kwargs) return _instance[cls] return _singleton @singleton
class A():
def __init__(self, name):
self.name = name a1 = A("ming")
print(a1.name) # ming a2 = A("dong")
print(a2.name) # ming

二、栈

1、自定义一个栈

# 栈是后进先出的数据结构,但是python中并没有栈这种数据结构,因此我们自己实现
class Stack(object): def __init__(self):
self.MyStack = [] def push(self, value):
"""
向栈插入数据
:param value:
:return:
"""
self.MyStack.append(value) def pop(self):
"""
从栈中取走数据
:return:
"""
return self.MyStack.pop() stack = Stack()
stack.push(1)
stack.push(2)
print(stack.pop()) #

2、python中的栈

后进先出(栈)
from queue import LifoQueue
lq = LifoQueue()
lq.put(1)
lq.put(2)
lq.put(3) print(lq.get()) #
print(lq.get()) #
print(lq.get()) #

三、队列

1、python默认的队列

# 队列(queue)是一种具有先进先出特征的线性数据结构,元素的增加只能在一端进行,元素的删除只能在另一端进行。能够增加元素的队列一端称为队尾,可以删除元素的队列一端则称为队首
import queue q = queue.Queue() # 队列对象
q.put(1) # 往队列存元素
q.put(2)
q.put('a')
q.put([1,2,3])
print(q.get()) # 1 取元素
print(q.get()) #
print(q.get()) # a

2、双端队列(双端列表)

# list的缺点:list在插入元素(insert)的时候是非常慢的,因为你插入一个元素,那么此元素后面的所有元素索引都得改变,
# 当数据量很大的时候,那么速度就很慢了。
# 双端队列:可以弥补List的这个缺点
# 双端队列:deque除了实现list的append()和pop()外,还支持appendleft()和popleft(),这样就可以非常高效地往头部添加或删除元素。
from collections import deque dq = deque([1,2,3])
dq.append(4)
dq.append(5)
dq.appendleft(6)
print(dq) # deque([6, 1, 2, 3, 4, 5]) print(dq.pop()) #
print(dq.popleft()) #

四、有序字典

python3.6之前,字典的Key是无序的(3.6之后字典默认有序,无需用此方法,但是很多公司未必都是在用3.6的版本), 在对dict做迭代时,我们无法确定Key的顺序,如果要保持Key的顺序,可以用OrderedDict。

首先说明一下普通字典的创建,可以使用面向对象的方式创建

# 普通字典的创建方式
dic1 = dict({'a':1,'b':2}) # 括号里面直接写字典
dic2 = dict([('c',3),('d',4)]) # 括号里面写列表,列表每一个元素是二元组,每个元组是字典的键和值
print(dic1) # {'a': 1, 'b': 2}
print(dic2) # {'c': 3, 'd': 4}

有序字典的创建

from collections import OrderedDict

order_dic = OrderedDict([('a', 1), ('b', 2)])
# 也可以这样创建
order_dic2 = OrderedDict({'c': 3, 'd': 4}) print(order_dic) # OrderedDict([('a', 1), ('b', 2)])
print(order_dic2) # OrderedDict([('c', 3), ('d', 4)]) order_dic['小明'] = '嘿嘿嘿'
print(order_dic) # OrderedDict([('a', 1), ('b', 2), ('小明', '嘿嘿嘿')])

五、其他

1、namedtuple:可命名元组

from collections import namedtuple

time = namedtuple('My_time', ['hour', 'minute', 'second'])
t1 = time(17, 50, 30)
print(t1) # My_time(hour=17, minute=50, second=30)
print(t1.hour) #
print(t1.minute) #
print(t1.second) # # 可命名元组非常类似一个只有属性没有方法的类,
# 这个类最大的特点就是一旦实例化不能修改属性的值,
# 可命名元组不能用索引取值了,只能用属性取值,
# ['hour', 'minute', 'second']是对象属性名,
# My_time是类的名字,而time就相当于把一个类赋值给一个变量(变量复用地址而已,实际上还是那个类)

2、defaultdict:为字典设置默认值

from collections import defaultdict

dic = defaultdict(list)  # 为字典设置默认值为空列表(defaultdict里面的参数必须是可调用的)
# dic = defaultdict(1) # 报错,因为数字 1 不可调用
print(dic['a']) # []
dic['b'].append(2)
print(dic['b']) # [2] # 可与匿名函数结合使用,设置任何默认值
dic = defaultdict(lambda: 'none') # lambda返回什么值都可以
print(dic['a']) # none
print(dic) # {'a': 'none'} dic['b'] = 2
print(dic) # {'a': 'none', 'b': 2} # 例子:有如下值集合 [11,22,33,44,55,66,77,88,99,90],将所有大于 66 的值保存至字典的第一个key中,
# 将小于 66 的值保存至第二个key的值中。
# 即: {'k1': 大于66 , 'k2': 小于66}
# 1、用正常的字典做
lst = [11, 22, 33, 44, 55, 66, 77, 88, 99, 90]
dic = {} for num in lst:
if num > 66:
if 'k1' not in dic:
dic['k1'] = [num]
else:
dic['k1'].append(num) elif num < 66:
if 'k2' not in dic:
dic['k2'] = [num]
else:
dic['k2'].append(num)
print(dic) # 2、使用字典的默认值
from collections import defaultdict lst = [11, 22, 33, 44, 55, 66, 77, 88, 99, 90]
dic = defaultdict(list) for num in lst:
if num > 66:
dic['k1'].append(num)
elif num < 66:
dic['k2'].append(num)
print(dic)

3、Counter

# Counter类的目的是用来跟踪值出现的次数。它是一个无序的容器类型,以字典的键值对形式存储,
# 其中元素作为key,其计数作为value。计数值可以是任意的Interger(包括0和负数)。
from collections import Counter c = Counter('aaasasabssbba')
print(c) # Counter({'a': 6, 's': 4, 'b': 3})

python之单例模式、栈、队列和有序字典的更多相关文章

  1. python模块介绍- collections(5)-OrderedDict 有序字典

    1.3.5 OrderedDict 有序字典 OrderedDict是dict的子类,它记住了内容添加的顺序. import collections print 'Regular dictionary ...

  2. Python数据结构:栈 队列

    栈,队列的特性: 1.栈(stacks)是一种只能通过访问其一端来实现数据存储与检索的线性数据结构,具有后进先出(last in first out,LIFO)的特征 2.队列(queue)是一种具有 ...

  3. python基础知识4——collection类——计数器,有序字典,默认字典,可命名元组,双向队列

    1.计数器(counter) Counter是对字典类型的补充,用于追踪值的出现次数. ps:具备字典的所有功能 + 自己的功能  Counter 我们从中挑选一些相对常用的方法来举例: 在上面的例子 ...

  4. Python学习笔记——基础篇2【第三周】——计数器、有序字典、元组、单(双)向队列、深浅拷贝、函数、装饰器

    目录 1.Python计数器Counter 2.Python有序字典OrderredDict 3.Python默认字典default 4.python可命名元组namedtuple 5.Python双 ...

  5. 【python】collections模块(有序字典,计数器,双向队列)

    collections模块基本介绍 我们都知道,Python拥有一些内置的数据类型,比如str, int, list, tuple, dict等, collections模块在这些内置数据类型的基础上 ...

  6. Python_Day_05 计数器(counter),有序字典(OrderDict),默认字典(defaultdict),可命名元祖(namedtuple),双向队列(deque),单项队列(deuqe.Queue)

    Counter(计数器) 是一个字典的子类,存储形式同样为字典,其中存储的键为字典的元素,值为元素出现的次数,在使用之前我们需要先导入文件 import collections 初始化一个计数器 im ...

  7. 计数器(counter),有序字典(OrderDict),默认字典(defaultdict),可命名元祖(namedtuple),双向队列(deque),单项队列(deuqe.Queue)

    Python_Day_05 计数器(counter),有序字典(OrderDict),默认字典(defaultdict),可命名元祖(namedtuple),双向队列(deque),单项队列(deuq ...

  8. python-Day3-set 集合-counter计数器-默认字典(defaultdict) -可命名元组(namedtuple)-有序字典(orderedDict)-双向队列(deque)--Queue单项队列--深浅拷贝---函数参数

    上节内容回顾:C语言为什么比起他语言块,因为C 会把代码变异成机器码Pyhton 的 .pyc文件是什么python 把.py文件编译成的.pyc文件是Python的字节码, 字符串本质是 字符数组, ...

  9. python基本数据结构栈stack和队列queue

    1,栈,后进先出,多用于反转 Python里面实现栈,就是把list包装成一个类,再添加一些方法作为栈的基本操作. 栈的实现: class Stack(object): #初始化栈为空列表 def _ ...

随机推荐

  1. 2.4配置的热更新「深入浅出ASP.NET Core系列」

    希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,谢谢关注. 大家知道通常我们修改网站的配置文件比如,webconfig的时候,网站需要重启才能读取到最新的修改,所谓热更新就是 ...

  2. js正则表达式替换HTML标签以及空格(&nbsp;)

    参考:范仁义 js代码: function filter(text) { var reg = /<[^<>]+>/g;//1.全局匹配g肯定忘记写,2.<>标签中不 ...

  3. WinForm的EXE破解(基于IL修改)

    一.目的与目标 1.1 主题目的 部门新人较多,希望通过本次分享让同学们对以下知识点有个认识: 破解原理 IL原理 强签名与加密 resx文件 由于时间有限,本文作为部门分享演示过程中辅助性文档,会对 ...

  4. SpringCloud-sleuth-zipkin链路追踪

    什么是Zipkin? 它是一个分布式链路跟踪系统它可以帮助收集时间数据,每个应用程序向Zipkin报告定时数据,Zipkin UI呈现了一个依赖图表来展示多少跟踪请求经过了每个应用程序:如果想解决延迟 ...

  5. OSS上传文件到阿里云

    最近做项目,需要上传文件,因为上传到项目路径下,感觉有时候也挺不方便的,就试了一下上传文件到阿里云oss上去了, oss的使用网上有很多介绍,都是去配置一下需要的数据,然后直接调用他的api就可以了. ...

  6. Vmware安装CentOs7+gitlab(一)

    本篇文章主要介绍了VMware安装Centos7超详细过程(图文),具有一定的参考价值,感兴趣的小伙伴们可以参考一下 1.软硬件准备 软件:推荐使用VMwear,我用的是VMwear 12 镜像:Ce ...

  7. MySQL字段操作与数据处理

    一,对字段的操作 1.拼接字段:Concat()函数 多数DBMS使用 + 或者 || 来实现拼接,而MySQL使用 Concat() 函数来实现拼接. 实例: Concat()函数拼接时加上的字符需 ...

  8. 小米5.0以上系统如何没ROOT激活xposed框架的经验

    在较多企业的引流或者业务操作中,大多数需要使用安卓的黑高科技术xposed框架,这段时间,我们企业购买了一批新的小米5.0以上系统,大多数都是基于7.0以上版本,大多数不能够获取Root的su超级权限 ...

  9. 关于Android Studio 3.2 运行应用时提示 “Instant Run requires that the platform corresponding to your target device (Android 7.0 (Nougat)) is installed.” 的说明

    点击"Run",运行App后,Android Studio显示如图1-1界面: 图1-1 这是因为你连接的外部设备(比如Android手机或AVD)的SDK版本在你的电脑上没有安装 ...

  10. 一个ELK日志检索实施案例

    figure:first-child { margin-top: -20px; } #write ol, #write ul { position: relative; } img { max-wid ...