python备忘录

小知识点

递归
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,这都无所谓
![](http://upload-images.jianshu.io/upload_images/38359-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就是一个返回函数的高阶函数***

### 类
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351

推荐阅读更多精彩内容

  • http://python.jobbole.com/85231/ 关于专业技能写完项目接着写写一名3年工作经验的J...
    燕京博士阅读 7,561评论 1 118
  • 个人笔记,方便自己查阅使用 Py.LangSpec.Contents Refs Built-in Closure ...
    freenik阅读 67,683评论 0 5
  • 可以看我的博客 lmwen.top 或者订阅我的公众号 简介有稍微接触python的人就会知道,python中...
    ayuLiao阅读 3,098评论 1 5
  • 字符集和编码简介 在编程中常常可以见到各种字符集和编码,包括ASCII,MBCS,Unicode等字符集。确切的说...
    兰山小亭阅读 8,473评论 0 13
  • python学习笔记 声明:学习笔记主要是根据廖雪峰官方网站python学习学习的,另外根据自己平时的积累进行修正...
    renyangfar阅读 3,027评论 0 10