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,这都无所谓
![](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就是一个返回函数的高阶函数***
### 类