操千曲而识谱,认千剑而知器,学而问者千篇,悟者为上
- 题1---singleton 模式
该题的本意或者说想要达到的理想目的是:改变一个子类的属性,不管声明多少个新的不同的实例对象,其相应的属性值是一样的
在进行编码之前,预备知识有两点,一就是__ new _(cls)与_ init __ (self) 之间的区别,二就是super()单线程子类继承
- 用一句话概括就是前者是声明的一个实例,而后者声明的是一个对象,直白的讲,比如你想要把一堆人分为一类,那么你需要先从这一堆人中找一个对象,然后自定义的给他声明一些属性(胡子,身高等)这就是init 初始化的作用,而你要判断这些属性适合不适合于其他的人,你就要从这堆人中找到一个人,而这个人就是你要研究的实例对象
... def print_c(self):
... print"hello world!"
...
class child(hello):
... def print_c(self):
... super(child,self).print_c()
...
child().print_c()
hello world!
下面开始解题
方法一:利用继承类来实现
class singleton1(object):
def __new__(cls):
if not hasattr(cls,'instance'):#当假设cls这个实例没有instance属性的时候
ori=super(singleton1,cls)#将sington1作为cls的一个子类,重新定义了一个新的类
cls.intsance=ori.__new__(cls)
return cls.intsance
class my(singleton1):
def __init__(self):
self.a=1
def main():
l1=my()
l2=my()
print (l1==l2)
l1.a=3
print (l2.a)
print (l1.a)
if __name__=='__main__':
main()
方法二:只需要super 声明的子类具有和原来的实例cls 具备同样的属性即可
class singleton(object):
dic={}
def __new__(cls):
descent=super(singleton,cls)#声明一个子类
descent.__dict__=cls.dic#子类和父类实例的属性相同
return descent
class mysecond(singleton1):
def __init__(self):
self.a=1
def main():
l1=mysecond()
l2=mysecond()
print (l1==l2)
l1.a=3
print (l2.a)
print (l1.a)
方法三:最为简单,其本质上没有两个两个实例之间的互动,而是通过__ init __的属性初始化完成单线程的目的
class mythird(object):
def __init__(self,a):
self.a=a
def main():
l1=mythird()
l2=mythird()
l1.a=3
print (l2.a)
-
题2---二维数组的查找
查找一个数是否属于一个二维数组,原题信息如下截图:
解题的过程实际上就是选择algorithm 的过程,这也是为什么算法这么的重要,在该书中有这么一段话很值得算法研究人员的思考(可能对我这种菜鸟感触太大了),因此摘录下来:
当我们分析一个复杂的问题的时候,无从下手,或者后续步骤越来越复杂,使得开头容易,后续剪不断理还乱的思绪交叉,这时候就需要从一个简单的具体实例出发,试图寻找其普遍规律 ----书中以插找7为例,首先右上角9>7,因此根据二维数组的排布规律,可以删除该列,一直删除到前两列,由于2<7所以删除行,直到在 删除1前两行后,检测到7
- 普适规律:首先选取右上角的数,如果该数字等于要查找的数,就停止查找,否则如果该数字大于要查找的数字,就删除对应的列,反之,就删除对应的行
下面为封装代码:
#二维数组的查找,算法就是根据书中的理念
import numpy as np
import pandas as pd
from pandas import Series
from pandas import DataFrame
#下面的例子是以整数二维数组为例
class search(object):
#在全局变量中定义一个array可以用np.arange(12).reshape((3,4))
def __init__(self,array,target):
self.array=array
self.target=target
def judge(self):
list=[]
if self.array==np.array(list):
return False
def num(self):
row=int(np.shape(self.array)[0])#得到行数
column=int(np.shape(self.array)[1])#得到列数
return column,row
def permit(self):
if type(self.target)!=int:
self.target=int(self.target)#对其格式进行匹配
def finder(self):
i,j=self.num()#通过num()方法拿到列数行数
m=0#重新定义行数
n=i-1#将列数赋值给n,之所以为i-1,是因为列索引是从0开始的
while n>=0 and m<=(j-1):#当列数还在索引范围之内,且行数也在索引范围之内时
if self.array[m][n]<self.target:#当右上角的数小于要查找的数字时
j+=1#删除行
elif self.array[m][n]>self.target:
n-=1
else:
return True
return False
print ('the target was not in this aimed array')
def main():
array=np.arange(12).reshape((3,4))
s=search(array,8)
s.finder()
if __name__=='__main__':
main()
- 最近在看了不起的匠人,希望能够静心,2018新年的第一集:“非静而无以为学,摒言、听步、闻鼠”
- 除去不可抗力因素外,希望能一日两题,持续更新
- Freedom as autonomy