#20160202#
print() 双引号单引号均可,字符串之间用逗号分隔会自动加入空格
直接写变量名回车可以打印出变量值(类似matlab)
name=input(‘please input your name…’)
if结构
if a>1: print a else: print -a
python强制缩进,大小写敏感
#20160204#
Python 3版本中,字符串是以Unicode编码的,也就是说,Python的字符串支持多语言
ord()函数 字符–》编码
chr()函数 编码–》字符
>>> '\u4e2d\u6587'
'中文'
python默认字符串类型为str,一个字符对应若干字节;传输或者保存为byte类型,以字节为单位。
x=b’xxx’
字节码转回ASCII或utf-8 (decode方法)
>>>b’abc’.decode(‘ascii’)
‘abc’
取字符串长度函数 len()
中文经过utf-8编码后占3个字节,英文仅占1个字节
>>>len(‘我们’.encode(‘utf-8’))
6
格式化输出
>>>‘hi, %s, you have %d’ % (‘xxx’, 100)
‘hi, xxx, you have 100’
%%用于转义
【lists】
>>>classmates=[‘Alice’,’Bob’]
>>>classmates
[‘Alice’,’Bob’]
>>>len(classmates)
2
若取用最后一个元素,用-1做索引;-2,-3类推
追加元素,append方法
>>>classmates.append(‘Adam’)
删除最后一个元素,pop方法
>>>classmates.pop
指定位置
>>>classmates.pop(i)
加入到指定位置,比如,index=1的位置
>>>classmates.insert(1,’Alex’)
替换指定位置元素,直接赋值即可
>>>classmates[1]=’Frank’
list可以放入不同的数据类型,甚至可以list套list,例如
>>>language=[‘VB’,’C++’,[‘php’,’asp’]]
引用’asp’
>>>language[2][1]
有序列别tuple,不可更改,小括号
>>>classmates=(‘Bob’,’Jane’,’Dennis’)
引用依然用中括号。
若定义只有一个元素的tuple,不能用 test=(1)的形式,小括号被解释为数学运算符,加入逗号消除歧义test=(1,)
tuple指的是指向不变
IF
强制缩进代表块语句
if xxx: xxxx elif xxx: xxxx else: xxxx
input输入的是str()类型,必须通过int()函数转换才能与数值类型进行比较。
FOR
遍历list
names=['Bob','Steve','John'] for name in names: print name
range(n)函数用于生成小于整数n的序列
如0-100的序列求和
num=range(101) sum=0 for x in num: sum=sum+x print(sum)
WHILE
s=100 sum=0 while s>0: sum=sum+s s=s-1
DICT和SET
dictionary,key-value对
dic={‘Mike’:100,’Alice’:90}
dic[‘Mike’]
dic[‘Mike’]=10
判断key是否存在,用in
>>>‘Tom’ in dic
False
get方法
>>>dic.get(‘Tom’,-999)
-999
pop方法删除字典元素
dic.pop(‘Mike’)
和list比较,dict有以下几个特点:
而list相反:
key是不可变对象,做Hash运算后确定value地址
SET
只保存key,用list初始化
>>>s=set([1,2,3])
>>>s
{1,2,3}
无重复,无序,集合,可以交集并集等
>>>s1=set([1,2,3])
>>>s2=set([2,3,4])
>>>s1 & s2
{2,3}
>>>s1 | s2 |
{1,2,3,4}
注意了解不可变对象的概念,最后一部分
对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容。相反,这些方法会创建新的对象并返回,这样,就保证了不可变对象本身永远是不可变的。
DOS下文件系统操作与Linux下有区别也有相同,比如切换目录都是cd命令,但在dos下切换驱动器,需要加上 /d选项,这个略坑。或者直接输入盘符F:
ls在dos下用dir替代。
之前截取了一些羽绒服的销量数据,以为能凑着这次广州飞雪的超强寒潮写一点东西,最后发现数据并不是很有说服力。由于淘宝反爬虫的策略,因此过程中用浏览器配合按键精灵每小时截图,最后也是搜集到了不少位图数据,因此有一个问题就怎样在这些位图中将数字抽取出来,因为数字几乎没有干扰,这是个很基本的OCR(Optical Character Recognition,光学字符识别)问题。
考虑还是用MATLAB做图像处理熟悉,简单查了下资料,思路很简单:
2.(关键)字符分隔,这个其实很简单,向x轴y轴分别投影,找出0和正整数之间的过渡位置,即字符和间隙的分隔位置
4.待识别的新样本重复1和2的操作,计算与记录特征的标准偏差,设定一合理阈值偏差,小于该偏差即可认为识别成功。
对于标准的屏幕显示的数字(或者字母),可以想象上述过程基本能做到极高的识别率了。手写体识别估计就更复杂了,需要用到机器学习等方法,木有涉猎,暂且不表。
识别部分程序代码如下
function img_number()
clear all;
close all;
echo off;
%---------------Read features---------------
x_mat=load('../feature/x_project.txt');
y_mat=load('../feature/y_project.txt');
I = imread('../img/2016011920.bmp');
I=I(612:625,900:946,:);
I_int = rgb2gray(I);
I_int=~im2bw(I_int,0.5); %binary and reverse
I_x_pro = sum(I_int,1); % project to the x axis
imshow(I_int)
num_x_start=strfind(I_x_pro~=0,[0 1])+1; %find the start point of a specific figure
num_x_end=strfind(I_x_pro==0,[0 1]); %find the end point of a specific figure
I_y_pro = sum(I_int,2); % project to the y axis
num_y_start=strfind(I_y_pro'~=0,[0 1])+1; %find the start point of a specific figure
num_y_end=strfind(I_y_pro'==0,[0 1]); %find the end point of a specific figure
fig_num = size(num_x_start); % how many figures in the image
fig_stdwidth = 6;
fig_stdheight = num_y_end-num_y_start+1;
for ii=1:fig_num(2)
I_std_ele_fig = imresize(I_int(num_y_start:num_y_end,num_x_start(ii):num_x_end(ii)), [fig_stdheight fig_stdwidth]);
std_x_pro = sum(I_std_ele_fig,1);
std_y_pro = sum(I_std_ele_fig,2)';
for jj=1:10
if(sum((std_x_pro-x_mat(jj,2:end)).^2)<10 & sum((std_y_pro-y_mat(jj,2:end)).^2)<10)
jj-1
end
end
end