Beinsearch
3/26/2017 - 9:54 AM

python基础语法

1、r 打开只读文件,该文件必须存在。 
2、r+ 打开可读写的文件,该文件必须存在。 
3、w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。 
4、w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。 
5、a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。 
6、a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。
7、上述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b 字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。不过在POSIX系统,包含Linux都会忽略该字符。

with open("1.txt") as ifile:
    for line in ifile:
        tokens = line.strip().split(' ')
        data.append([float(tk) for tk in tokens[:-1]])
        labels.append(tokens[-1])
        

"""
关于read()方法:
1、读取整个文件,将文件内容放到一个字符串变量中
2、如果文件大于可用内存,不可能使用这种处理
"""
file_object = open("test.py",'r') #创建一个文件对象,也是一个可迭代对象
try:
    all_the_text = file_object.read()  #结果为str类型
    print type(all_the_text)
    print "all_the_text=",all_the_text
finally:
    file_object.close()

"""
关于readline()方法:
1、readline()每次读取一行,比readlines()慢得多
2、readline()返回的是一个字符串对象,保存当前行的内容
"""
file_object1 = open("test.py",'r')
try:
  while True:
      line = file_object1.readline()
      if line:
          print "line=",line
      else:
          break
finally:
    file_object1.close()

"""
关于readlines()方法:
1、一次性读取整个文件。
2、自动将文件内容分析成一个行的列表。
"""
file_object2 = open("test.py",'r')
try:
  lines = file_object2.readlines()
  print "type(lines)=",type(lines) #type(lines)= <type 'list'>
  for line in lines:
      print "line=",line  
finally:
    file_object2.close()
    
    
#将变量输出到文件 
d = dict(name='Bob', age=20, score=88)
f=open('output','w')
f.write(str(d))
f.close()

序列化
try:
    import cPickle as pickle
except ImportError:
    import pickle
f = open('dump.txt', 'wb')
pickle.dump(d, f)
f.close()

反序列化
f = open('dump.txt', 'rb')
d = pickle.load(f)
f.close()

JSON序列化
import json
json.dumps(d)

JSON反序列化
json_str = '{"age": 20, "score": 88, "name": "Bob"}'
json.loads(json_str) #=> {u'age': 20, u'score': 88, u'name': u'Bob'}
#静态检查
#检查错误: 如"缩进错误", "少些了冒号", "变量不存在", "实例方法定义未包含self参数", "函数传参数量不对"等等
#检查代码风格: 如"代码单行字符数过多"等等
pylint example.py
#调试
from pudb import set_trace; set_trace()
import pudb; pu.db
pudb example.py
#Add Watch Expression
#变量区 按 n

#查找帮助 
print help(xrange)

#if条件表达式
'result1' if 3>2 else 'result2'

#函数 
#自变量list,输出函数结果list
[fun(x) for x in range(lower, upper) if x > a ]
{x: x ** 2 for x in range(5)}  # => {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

#引进包 
from math import ceil, floor
import math as m

#提高运行效率 
def double_numbers_generator(iterable):
    for i in iterable:
        yield i + i
for value in double_numbers_generator(xrange(1000000)): 
    print value
    if value > 5:
        break

#当Python解释器读取源代码时,为了让它按UTF-8编码读取,我们通常在文件开头写上这两行:
#!/usr/bin/env python
# -*- coding: utf-8 -*-

Python的程序有两种退出方式:
import sys;sys.exit()调用后会引发SystemExit异常,可以捕获此异常做清理工作
import os;os._exit()直接将python解释器退出,余下的语句不会执行。
一般情况下用sys.exit(),一般在fork出来的子进程中使用os._exit()

win下安装python包,以feerparser为例
1、安装setuptools
2、下载feerparser:https://pypi.python.org/pypi/feedparser
3、打开feedparser目录下的setup.py,用from distutils.core import setup替代第一行的from setuptools import setup
4、在cmd中切换目录至feedparser,输入python setup.py install

pip install mapnik2 -i https://pypi.tuna.tsinghua.edu.cn/simple

linux下安装python包,以feerparser为例
wget https://pypi.python.org/packages/source/f/feedparser/feedparser-5.1.3.tar.gz
tar zxf feedparser-5.1.3.tar.gz 
cd feedparser-5.1.3
python setup.py install
#变量类型 
type(('1', 'a'))   #tuple
isinstance(('1', 'a'), tuple)   #True

# Strings
# 连接
"Hello " + "world!"
"Hello " "world!"
'_'.join(map(str, [1, 2, 3]))
# 翻倍
"Hello" * 3
# 格式化
"The items in the basket are %s and %s" % ('apple', 'lemon')
"{} is a {}".format("This", "placeholder")
"{0} can be {1}".format("strings", "formatted")
"{name} wants to eat {food}".format(name="Bob", food="lasagna")

# Lists
li = [1, 2, 3]
# 末位添加
li.append(4)
# 在指定位置k插入元素'a'
li.insert(k, 'a')
# 末位删除
li.pop()
# 删除第k项 
del li[k]
# 删除第一个元素'a'
li.remove('a')
# 倒数第一项
li.[-1]
# 查找元素 
li.index('a')
# 选中序列
li[start:end:step]
# 连接,两者不变 
li + other_li
# 列表扩展
li.extend(other_li)
#列表生成式 List Comprehensions
[m + n for m in 'ABC' for n in 'XYZ'] # => ['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
#列表求交集 
tmp = [val for val in Li1 if val in Li2]
#列表求差集 
list(set(Li1).difference(set(Li2)))

#list排序
reverse() #倒序 
sort()  #升序 
b = sorted(a) #a不变,b已排序
#通过序列切片来逆转
mytuple=(5,4,3,2,1) 
mytuple[::-1] #=>(1, 2, 3, 4, 5)

#list去重 
reduce(lambda x,y:x if y in x else x + [y], [[],]+mylist)

#list是线性存储,数据量大的时候,插入和删除效率很低。deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈
from collections import deque
q = deque(['a', 'b', 'c'])
q.popleft() # => ['b', 'c']
q.appendleft('y') # => ['y','b', 'c']

#Tuple与list相似,但元素固定
tup = (1, 2, 3)
#定义1个元素的Tuple
t = (1,)

#namedtuple定义一种数据类型,它具备tuple的不变性,又可以根据属性来引用
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(1, 2)
isinstance(p, tuple) # => True

# Dictionaries 
s = dict([(i,2*i) for i in range(5)])
# => {0: 0, 1: 2, 2: 4, 3: 6, 4: 8}
filled_dict = {"one": 1, "two": 2, "three": 3}
# => {'three': 3, 'two': 2, 'one': 1}
# 查找key对应的value
filled_dict["four"]  # KeyError
filled_dict.get("four")  # None
#赋值
filled_dict["four"] = 4
# 列举keys
filled_dict.keys()  # => ["three", "two", "one"]
# 列举values
filled_dict.values()  # => [3, 2, 1]
# 列举条目 
filled_dict.items()  # => [("one", 1), ("two", 2), ("three", 3)]
#设置默认值,如果键不存在,将会添加键并将值设为默认值。
dict.setdefault(key, default=None) #如果字典中包含有给定键,则返回该键对应的值,否则返回为该键设置的值。

#defaultdict如果key不存在时,返回一个默认值
from collections import defaultdict
dd = defaultdict(lambda: 'N/A')
dd['key1'] = 'abc'
dd['key2'] # => 'N/A'

#OrderedDict保持Key的顺序,键值对是按照加入时的顺序存储
from collections import OrderedDict
dd = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2}
#按key排序
kd = collections.OrderedDict(sorted(dd.items(), key=lambda t: t[0]))
#=>OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])
#按照value排序
vd = collections.OrderedDict(sorted(dd.items(),key=lambda t:t[1]))
#=>OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])
#move_to_end(key, last=True)函数来改变键值对的位置,True时移到末尾,False移到开头
vd.move_to_end('orange')
#=>OrderedDict([('pear', 1), ('banana', 3), ('apple', 4), ('orange', 2)])
#popitem(),返回最后一个键值对,如果popitem(last=False)则先加入的先弹出

# Sets
some_set = set([1, 2, 2, 3, 4])  # some_set is now set([1, 2, 3, 4])
# 添加
some_set.add(5)
# 删除 
some_set.discard(2)
# 交集 
filled_set & other_set
# 并集 
filled_set | other_set
# 差集 
{1, 2, 3, 4} - {2, 3, 5}  # => {1, 4}
# 对称差集 
{1, 2, 3, 4} ^ {2, 3, 5}  # => {1, 4, 5}
# 大小
len(some_set)

str(n)  #数字转字符串 
int(s)  #字符串转整数
string.atoi(s,[base]) #字符串转整数, base为进制基数
string.atof(s)  #字符串转浮点数

#将Unicode转换成普通的Python字符串
unicodestring = u"Hello world"
utf8string = unicodestring.encode("utf-8")
plainstring = unicode(utf8string, "utf-8")
调试
https://www.zhihu.com/question/21572891
程序计时
http://blog.sina.com.cn/s/blog_6163bdeb0101806e.html

from time import clock
t = clock() #在win32系统下,返回真实时间;在Unix/Linux下返回CPU时间。
s = solvepackage(vol,val,cap)
print 'time:%.2fs' % (clock()-t)

zip函数
x = [1, 2, 3]
y = [4, 5, 6]
z = [7, 8, 9]
xyz = zip(x, y, z)
#[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
u = zip(*xyz)
#[(1, 2, 3), (4, 5, 6), (7, 8, 9)]
#zip(*xyz) 等价于 zip((1, 4, 7), (2, 5, 8), (3, 6, 9))

#nan变量
a = float('nan')  #创建 
math.isnan(a) #判断 

#win pip换源
#https://blog.csdn.net/lwgkzl/article/details/80935453
#C盘用户文件夹,新建pip目录,新建pip.ini
[global]
timeout = 6000
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
trusted-host = pypi.tuna.tsinghua.edu.cn
[install] 
trusted-host=pypi.doubanio.com