#! /usr/bin/env python3

r'''
1. IEEE754规范来存储浮点数
	Python中取整: import math
	向下取整: int()
	四舍五入: round()
	向上取整: ceil()
	分别取小数部分和整数部分: modf()
	float('+inFinIty') #正无穷
	float('-inFinIty') #负无穷
	float('nan') #没有值
	定义的对象如果要被float函数正确转换成浮点数,需要定义__float__函数。

2. 回溯法一般与递归,深度优先遍历联合使用,他的核心就是不断尝试路线,倘若碰壁(走不通)则返回到上一步进行从新试探,其程序结构分为两部分:
(1)寻找起点,并在起点位置调用探索函数。
(2)设计探索函数,每一种可能都是一种if,
	其约束条件就是:探索是否超越边界 and 探索位置的值是否是所需
(1)适用范围:需要找出全部解或者最优解
(2)有组织的搜索
(3)探索解空间树
核心伪代码
方法1 使用函数内调用,则计算count需要global变量
	def f(self,参数):
	    "需要内容的布局"
	    def f1(参数):
		"需要的比较复杂的条件"
	    def f2(参数):
		if "跳出条件1":
		    retrun
		if "跳出条件2":
		    retrun

		"四个方向的探索"
		f2(r+1,c)
		f2(r-1,c)
		f2(r,c+1)
		f2(r,c-1)
	    return '结果'
方法二:采用函数外,就是类下不同方法之间的调用。不需要全局
class Solution():
    def Path(self,参数):
        "函数布局,产生随机矩阵,"
        # 调用同类下方法,返回所需值
        self.Find_path(参数)
        # 对所需值进行再处理
        return 结果

    def PD_K(self,参数):
    "将复杂约束条件设定"

    def Find_path(self,参数):
        "对四个位置进行探索,并对所走路径填1"
        对起始位置[0][0]设置为1
        # 如果采用方法之间的调用,则需要将将约束条件融合
        if j+1<n and self.PD_K(参数) and 标记位:
          对走过位置标记
            return self.Find_path(参数)
        elif 四个位置讨论
        else:
            return 所需结果
注意跳出条件是有顺序的: 首先是大范围(矩阵边界), 其次是中等范围(特殊条件), 最后是走过的痕迹标1(不能重复)

3. Python 类
    ------类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法。对象可以包含任意数量和类型的数据。
    ------python类与c++类相似,提供了类的封装,继承、多继承,构造函数、析构函数。
    ------在python3中,所有类最顶层父类都是object类,与java类似,如果定义类的时候没有写出父类,则object类就是其直接父类。
类定义语法格式如下:
	class ClassName:
	    <statement-1>
	    .
	    .
	    .
	    <statement-N>
4. 类的对象:创建一个类之后,可以通过类名访问、改变其属性、方法
	实例对象:类实例化后,可以使用其属性,可以动态的为实例对象添加属性(类似javascript)而不影响类对象。
5. 类的属性
	可以使用点(.)来访问对象的属性
	也可以使用以下函数的方式来访问属性:
	    getattr(obj, name[, default]) : 访问对象的属性
	    hasattr(obj,name) : 检查是否存在一个属性
	    setattr(obj,name,value) : 设置一个属性。如果属性不存在,会创建一个新属性
	    delattr(obj, name) : 删除属性
6. Python内置类属性
    __dict__ : 类的属性(包含一个字典,由类的数据属性组成)
    __doc__ :类的文档字符串
    __name__: 类名
    __module__: 类定义所在的模块(类的全名是'__main__.className',如果类位于一个导入模块mymod中,那么className.__module__ 等于 mymod)
    __bases__ : 类的所有父类构成元素(包含了以个由所有父类组成的元组)

7. 类的方法
	在类地内部,使用def关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数self,且为第一个参数。
	类的专有方法:
	    __init__ 构造函数,在生成对象时调用
	    __del__ 析构函数,释放对象时使用
	    __repr__ 打印,转换
	    __setitem__按照索引赋值
	    __getitem__按照索引获取值
	    __len__获得长度
	    __cmp__比较运算
	    __call__函数调用
	    __add__加运算
	    __sub__减运算
	    __mul__乘运算
	    __div__除运算
	    __mod__求余运算
	    __pow__称方

8. 类的封装
	python通过变量名命名来区分属性和方法的访问权限,默认权限相当于c++和java中的public
	类的私有属性: __private_attrs:两个下划线开头,声明该属性为私有,不能在类地外部被使用或直接访问。在类内部的方法中使用时self.__private_attrs。
	类的私有方法: __private_method:两个下划线开头,声明该方法为私有方法,不能在类地外部调用。在类的内部调用 self.__private_methods
	虽然python不允许实例化的类访问私有数据,但可以使用 object._className__attrName 访问属性。


9. 类的继承
	面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。继承完全可以理解成类之间的类型和子类型关系。
	需要注意的地方:继承语法 class 派生类名(基类名)://... 基类名写作括号里,基本类是在类定义的时候,在元组之中指明的。
	在python中继承中的一些特点:
	    1:在继承中基类的构造(__init__()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。使用super().__init__()或parentClassName.__init__()
	    2:在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self参数
	    3:Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。
	如果在继承元组中列了一个以上的类,那么它就被称作"多重继承" 。语法:
	    派生类的声明,与他们的父类类似,继承的基类列表跟在类名之后,如下所示:
	多态
	    如果父类方法的功能不能满足需求,可以在子类重写父类的方法。实例对象调用方法时会调用其对应子类的重写后的方法
10. Django-template-for
        /usr/local/lib/python3.4/dist-packages/django/template/defaulttags.py
            The for loop sets a number of variables available within the loop:

        ==========================  ================================================
        Variable                    Description
        ==========================  ================================================
        ``forloop.counter``         The current iteration of the loop (1-indexed)
        ``forloop.counter0``        The current iteration of the loop (0-indexed)
        ``forloop.revcounter``      The number of iterations from the end of the   loop (1-indexed)
        ``forloop.revcounter0``     The number of iterations from the end of the  loop (0-indexed)
        ``forloop.first``           True if this is the first time through the loop
        ``forloop.last``            True if this is the last time through the loop
        ``forloop.parentloop``      For nested loops, this is the loop "above" the  current one
        ==========================  ================================================
        tips:
        context_processors.py  context.py  defaultfilters.py ...
11. 安装tesseract-ocr出错的解决:
    第一个错误:tesseract_ocr.cpp:507:34: fatal error: leptonica/allheaders.h: No such file or directory compilation terminated.
    解决办法:sudo apt install libleptonica-dev
    第二个错误:tesseract_ocr.cpp:508:31: fatal error: tesseract/baseapi.h: No such file or directory compilation terminated.
    解决办法:sudo apt install libtesseract-dev
    [sudo] pip install tesseract-ocr

12. 调用pytesseract.image_to_string()出现如下错误,解决方法:sudo apt-get install tesseract-ocr
    Traceback (most recent call last):
      File "./ai-read-zh.py", line 9, in <module>
        text=pytesseract.image_to_string(image)
      File "/usr/local/lib/python2.7/dist-packages/pytesseract/pytesseract.py", line 122, in image_to_string
        config=config)
      File "/usr/local/lib/python2.7/dist-packages/pytesseract/pytesseract.py", line 46, in run_tesseract
        proc = subprocess.Popen(command, stderr=subprocess.PIPE)
      File "/usr/lib/python2.7/subprocess.py", line 710, in __init__
        errread, errwrite)
      File "/usr/lib/python2.7/subprocess.py", line 1327, in _execute_child
        raise child_exception
    OSError: [Errno 2] No such file or directory      
    安装中文: sudo apt-get install tesseract-ocr-chi-sim