美文网首页
python备忘录

python备忘录

作者: 异想派 | 来源:发表于2016-11-07 19:41 被阅读37次

    小知识点

    递归
    def calculatedepth(mytree):
        maxdepth=0
        firststr=mytree.keys()[0]
        seconddict=mytree[firststr]
        for key in seconddict.keys():
            print key,
            if type(seconddict[key]).__name__=='dict':
                numdepth=1+calculatedepth(seconddict[key])
            else:
                numdepth=1   #到叶节点后,计算树深度的变量+1
            if numdepth>maxdepth:
                maxdepth=numdepth
            print numdepth,maxdepth
        return maxdepth
    
    if __name__=='__main__':
        mytree={"纹理": {"模糊": "否", "清晰": {"根蒂": {"稍蜷": {"色泽": {"乌黑": {"触感": {"软粘": "否", "硬滑": "是"}}, "青绿": "是"}}, "蜷缩": "是", "硬挺": "否"}}, "稍糊": {"触感": {"软粘": "是", "硬滑": "否"}}}}
        b=calculatedepth(mytree)
    

    1、# -*- coding: UTF-8 -*-
    作用是定义源代码的编码. 如果没有定义, 此源码中是不可以包含中文字符串的.PEP 0263 -- Defining Python Source Code Encodingshttps://www.python.org/dev/peps/pep-0263/
    2、```
    sys.getdefaultencoding()

    是设置默认的string的编码格式
    https://segmentfault.com/q/1010000003066524
    
    >当对str进行编码时,会先用默认编码将自己解码为unicode,然后在将unicode编码为你指定编码。
    这就引出了python2.x中在处理中文时,大多数出现错误的原因所在:python的默认编码,defaultencoding是ascii
    [Python中的str与unicode处理方法](http://python.jobbole.com/81244/)
    
    
    - 
    Python导入自定义包或模块  
    [sys.path.append](http://www.cnblogs.com/kaituorensheng/archive/2013/05/24/3096040.html)
    > 对于模块和自己写的程序不在同一个目录下,可以把模块的路径通过sys.path.append(路径)添加到程序中
    
    

    import sys
    sys.path.append(’引用模块的地址')

    
    
    
    
    - 狭义的Shell指的就是命令行终端
    shell的作用:用户输入指令,通过Shell和内核沟通,控制硬件正常工作
    > $ echo:表示输出文本
    $ echo cd:表示输出路径
    $ ls:显示本层目录的所有文件和文件夹
    
    

    $ cd Desktop/
    $ ls -al #查看桌面目录的所有文件,包括隐藏文件

    可参考http://www.cnblogs.com/xiaodao/archive/2012/02/21/2361519.html
    - 判断一个变量是否是某个类型可以用isinstance()
    

    a=list()
    isinstance(a,list) #a表示数据类型对应实例,list表示数据类型
    True
    type(a)
    <type 'list'>

    - 获得一个对象的所有属性和方法,可以使用**dir()函数**
    
    
    ### Dataframe
    - 建表
    > dft=DataFrame({'B':[0,1,2,np.nan,4]},  
    index=pd.Index([pd.Timestamp('20130101 09:00:00'), pd.Timestamp('20130101 09:00:02'), pd.Timestamp('20130101 09:00:03'),  pd.Timestamp('20130101 09:00:05'), pd.Timestamp('20130101 09:00:06')], name='foo'))
    
    - 查询已安装包
    >终端--pip list      #会出现相应包和版本信息
    
    ### Class
    #### 1 、类属性
    - 类的几种特殊属性的含义
    > C.\__name__:以字符串的形式,返回类的名字,注意这时候得到的仅仅是一个字符串,它不是一个类对象
    C.\__doc__:显示类的文档
    C.\__base__:类C的所有父类。如果是按照上面方式定义的类,应该显示object,因为以上所有类都继承了它。等到学习了“继承”,再来看这个属性,内容就丰富了
    C.\__dict__:以字典形式显示类的所有属性
    C.\__module__:类所在的模块
     
    

    if _name_ == "main": #此处_main_相当于一个模块

    C.base 查看类C的父类P
    返回<class 'main.P'>

    print C.mro #打印出类的继承顺序

    #### 2、
    - 当建立实例的时候,首先要执行类中的初始化函数
    - 单继承VS多继承
    - 子类方法或属性覆盖父类方法或属性VS调用父类被覆盖的方法
    
    ### Python2.x中的编码问题
    #### 1、unicode与utf-8间的转换
    - 严格意义上说,str其实是字节串,它是unicode经过编码后的字节组成的序列。对UTF-8编码的str'汉'使用len()函数时,结果是3,因为实际上,UTF-8编码的'汉' == '\xE6\xB1\x89'。
    - unicode才是真正意义上的字符串,对字节串str使用正确的字符编码进行解码后获得,并且len(u'汉') == 1
    
    

    coding: UTF-8

    u=u'汉'
    print repr(u)

    u'\u6c49',等价于u

    s=u.encode('UTF-8')
    print repr(s)

    '\xe6\xb1\x89' ,type(s)=str

    u2=s.decode('UTF-8')
    print repr(u2)

    u'\u6c49'

    对unicode进行解码是错误的

    s2 = u.decode('UTF-8')

    同样,对str进行编码也是错误的

    u2 = s.encode('UTF-8')

    
    #### 2、读写文件
    - open()方法打开文件时,read()读取的是str,读取后需要使用正确的编码格式进行decode()
    - write()写入时,如果参数是unicode,则需要使用你希望写入的编码进行encode(),如果是其他编码格式的str,则需要先用该str的编码进行decode(),转成unicode后再使用写入的编码进行encode()。
    - 如果直接将unicode作为参数传入write()方法,Python将先使用源代码文件声明的字符编码进行编码然后写入。
    
    

    coding: UTF-8

    f=open('test.txt')
    s=f.read()
    f.close()
    print type(s)

    <type 'str'>

    已知是GBK编码,解码成unicode

    u=s.decode('GBK')

    f=open('test.txt','w')

    编码成UTF-8编码的str

    s=u.encode('UTF-8')
    f.write(s)
    f.close()

    综上:
    ***字节串本身是不带编码信息的,所以必须你事先知道字节串使用的编码才能进行正确的解码。解码得到的就是unicode了,在码表中对应的就是中文***
    但是两种不同的编码一般会存在一些互相不同的“真空区域”,如果字节串中包含这里面的字节,解码时会抛出异常。中文我们一般都是使用GBK和UTF-8居多,所以有一个方法就是依次使用这两种编码尝试解码,哪个没有抛出异常就认为是哪种编码格式
    

    -- coding: utf-8 --

    u = '汉'
    c = u'汉'
    c
    u'\u6c49'
    u = '汉'
    b=u.decode('UTF-8') # 直接加 u 和 decode('UTF-8')效果相同
    b
    u'\u6c49'
    type(c)
    <type 'unicode'>
    type(b)
    <type 'unicode'>
    u
    '\xe6\xb1\x89'
    b.encode('UTF-8')
    '\xe6\xb1\x89'

    http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html
    #### 3、str.encode()/str.decode(),引自老齐
    ######3.1
    - 查看默认编码方式,python命令行
    

    import sys
    sys.getdefaultencoding()
    'ascii' #默认为ascii形式

    
    - 修改默认编码方式
    在程序中加入如下代码
    

    import sys
    reload(sys)
    sys.setdefaultencoding('utf8')

    https://github.com/qiwsir/ITArticles/blob/master/Python/Python%E7%9A%84%E4%B8%AD%E6%96%87%E6%98%BE%E7%A4%BA%E6%96%B9%E6%B3%95.md
    ###### 3.2 编码的转换方式
    - 基于ACII得到的***字节串***,一个汉字两个字节
    

    a = "赵国"
    type(a)
    <type 'str'>
    len(a)
    4
    a
    '\xd5\xd4\xb9\xfa'

    
    - 基于Unicode的***字符串***
    

    b = u'赵国'
    type(b)
    <type 'unicode'>
    len(b)
    2
    b
    u'\u8d75\u56fd'

    
    - Unicode的***字符串***转为UTF-8编码
    

    c = b.encode("utf-8")
    type(c)
    <type 'str'> #中文str以GBK和UTF-8居多,偶尔试试ACII
    len(c)
    6
    c
    '\xe8\xb5\xb5\xe5\x9b\xbd'

    d = c.decode("utf-8")
    type(d)
    <type 'unicode'>
    len(d)
    2
    d
    u'\u8d75\u56fd'

    
    #### 4、避免中文乱码的经验操作
    - 使用utf-8编码方案,因为它跨平台不错,开头声明。
    目的是:为了在源代码中支持非ASCII字符,必须在源文件的第一行或者第二行显示地指定编码格式。告诉python interpret如何解释字符串的编码
    

    -- coding: utf-8 --

    - 遇到字符(节)串,立刻转化为unicode,不要用str(),直接使用unicode()
    

    unicode_str = unicode('中文', encoding='utf-8')

    因为此时python为ACII编码方式,故不能处理非ascii编码,需要自己设置python的默认编码

    print unicode_str.encode('utf-8')
    或者使用如下形式

    import sys
    reload(sys)
    <module 'sys' (built-in)>
    sys.setdefaultencoding('utf8')
    cc=unicode('中文') #这里就不在需要申明
    cc
    u'\u4e2d\u6587'

    
    - 如果对文件操作,打开文件的时候,最好用codecs.open,替代open(这个后面会讲到,先放在这里)
    

    import codecs
    codecs.open('filename', encoding='utf8')

    
    - 声明字符串直接加u,声明的字符串就是unicode编码的字符串
    

    a = u"中"

    附:关于python编码的前世今生
    http://foofish.net/python-character-encode.html
      - python中和字符串相关的数据类型,分别是**str**、**unicode**两种,他们都是basestring的子类,可见str与unicode是两种不同类型的字符串对象
      - 不论是Python3x、Java还是其他编程语言,Unicode编码都成为语言的默认编码格式,而数据最后保存到介质中的时候,不同的介质可有用不同的方式,有些人喜欢用UTF-8,有些人喜欢用GBK,这都无所谓
    ![](https://img.haomeiwen.com/i38359/92d48e677f783805?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
      
    ### 函数
    - 递归函数
    定义:在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数
    
    - 迭代
    1 . 定义:给定一个list\tuple\str\dict\generator,我们可以通过**for...in**循环来遍历这个list\tuple\str\dict\generator,这种遍历我们称为迭代(Iteration)
    2 . 判别可迭代对象:
    

    from collections import Iterable #iterable:可迭代的
    isinstance('abc', Iterable)
    True

    - 列表生成式
    列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式
    
    - 列表生成器
    定义:一边循环一边计算的机制,称为生成器(Generator)
    
    - 函数生成器yield 
    使用函数来生成复杂的生成器
    
    - 高阶函数:
    定义:***函数参数中可以接受函数传入***
    1 . map/reduce
     - map()
    函数接收两个参数,一个是函数,一个是序列(列表、元组、字符串),map
    将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回
     - reduce
    函数接收两个参数,一个是函数(接受2个参数),一个是序列(列表、元组、字符串),结果生成一个聚合值
    2 . filter
    
    - 返回函数
     - 闭包
    

    def count():
    ... fs = []
    ... for i in range(1, 4):
    ... def f():
    ... return i*i
    ... fs.append(f)

    此处相当于fs列表放了3个f函数。但是返回的函数没有立即执行,

    直到调用了f()才执行(相当于下面的f1()),此时i已经变成3
    ... return fs
    ...

    f1, f2, f3 = count()
    f1()
    9
    f2()
    9
    作为对照,使用如下函数
    def count():
    ... fs = []
    ... for i in range(1, 4):
    ... def f():
    ... return i*i
    ... fs.append(f()) #此处为f(),直接调用函数的结果
    ... return fs
    ...
    f1,f2,f3=count()
    f1
    1
    f2
    4
    f3
    9

    
    - 装饰器
    要增强函数的功能,比如,在函数调用前后自动打印日志,但又不希望修改函数的定义,这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。***decorator就是一个返回函数的高阶函数***
    
    ### 类

    相关文章

      网友评论

          本文标题:python备忘录

          本文链接:https://www.haomeiwen.com/subject/yunsuttx.html