Life is short, you need Python!

初识Python

第一次听说Python已经是三四年前的事情了。当时是用C#帮人处理了一个有向图的小代码。对方问,用什么写的,是Python嘛。我才知道还有Python这么个东西。当时只知道这是一个跨平台的脚本语言。随后曾在回家的火车上看过一点点,但一直没有实实在在的使用过。天生的对脚本语言不感兴趣。

用上Python

最近在帮助一个朋友搞输入法的算法,需要在Python上进行算法测试。同时,也想着,以后尽量把科学计算的工具从原来可能只有我才用的C#转到比较通用的Python上。于是,匆匆忙忙的看了几天就直接上手了。用了一个多月,感叹Python确实在某些方面是很神奇的。比如,Python可以用a, b = b, a来交换a和b的值。

实用的数据结构

应该是因为功能定位不同,Python和其他语言的大部分教程不同。Python一上来并不是讲int、float、double、string和数组等基本类型,而是介绍list,turple和dictionary(还有一个可能不太常用的set结构)这些数据结构。在c#中,list要用ArrayList,turple相当于结构体,dictionary相当于HashTable,三个都已经算是相对高级的应用了,至少是需要增加Using才能使用的(结构体不是)。尤其是字典类型,如果不是万不得以,好像基本不会使用HashTable,更别说的字典中套字典了。而在Python中,不仅把这个三种实用的数据结构做为基础直接使用,而且还经常联合使用。对于纯粹的数据处理和计算来说,大缩短了代码编写的时间。能灵活熟悉的使用这三种数据结构,Python就基本上算是初步掌握了。

有趣的下标引用

list,turple和dictionary都是数据的存储结构。引用一串数据中的某一个或某几个是最常用操作。和C#一样,Python也是用[n]来引用,但在操作上Python有许多独特的逻辑。比如,Python的引用是可以用负数的。

data = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
data[0]     #取第一个元素,结果为['Monday']
data[-1]    #取最后一个元素,结果为['Sunday']
data[:5]    #从开头取,取到5号个元素之前,结果为['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
data[4:]    #从第4个元素取到最后,结果为['Friday', 'Saturday', 'Sunday']
data[1:2]   #从第1号元素取,取到2号元素之前,结果为['Tuesday']    
data[3:-2]  #从3号元素取,取到倒数第2个元素之前,结果为['Thursday', 'Friday']

甚至你还可以这样把所有奇数位或偶数位的取出来,生成一个新的list:

data[::2]   #结果为['Monday', 'Wednesday', 'Friday', 'Sunday']
data[1::2]  #结果为['Tuesday', 'Thursday', 'Saturday']

虽然C#也可以用Substring方法实现字符串的截取,但使用上就不如Python来的直观,而且该方法也仅限到普通的字符串。

独特循环方式

Python中的循环全是类似于C#中foreach的遍历式循环,如遍历链表、元组或字典。

for item in data_list:
    print(item)
for item in data_turple:
    print(item)
for key in data_dic:
    print(key, data_dic[key])

当然,对于字典类型的普遍,由于很多时候会可能会改变字典的内容,如删除某些键值,所以通常是遍历字典键的链表:

for key in list(data_dic.keys()):
    ...

那么,如果确实是要计算一个从1加到100的循环又该怎么办呢。在Python中,需要用range内嵌构建一个链表来实现:

for item in range(1,101):
    ...

所以,Python中通常不会使用i, j, k这种循环变量名。

Python的循环还能使用一个特别的zip组合,可以把两个链表组合成一个元组的链表,然后把元组中的元素分别赋值给不同的变量进行遍历。至于有什么用,那就要看具体的需求了。在保存输入法的词库数据时,为了节省空间,把同一个拼音的重码和对应的权重保存在了同一条记录中,并用‘|’进行了分隔。那么,获取某一个词的概率,或者是某一个音对应所有词的权重就可以这样写:

#比如,取出的youji对应的重码概率保存在了result中
result = '邮寄|0.3|有机|0.2|游击|0.2|游记|0.1'
result_list = result.split('|') #将结果转为list结构
for word, weight in zip(result_list[::2], result_list[1::2]):
    print(word, weight) 

zip实际上是先把两个list打包成了一个成员是元组的list,然后再遍历元组,分别把元组的元素赋值给word和weight。如果用C#,就等同于:

for(i=0;i<=result_list.count-1;i++){
  word = result[i];
  weight = result[i+1];
  i++;
  Console.writeline(word.tostring() + weight.tostring());
}

虽然看上去好像也不是特别麻烦,但逻辑上还是Python的更易懂一些。

看不明白的排序

排序是最常用的算法之一,大部分语言也都内置了排序的方法或函数。但是,主要都是针对基本类型的。如果要对一个结构体,或者类进行排序,其代码量也不算少。比如,前段时间在处理词频信息时,需要按词频进行排序。如果用两个链表分别保存「词」和「频度」,那在对「频度」时,就不能同步调整「词」的顺序。因此,必须把「词」和「频度」放在一个结构体中,对结构体进行排序。在C#中可以这样实现:

//先需要声明一个结构体,把所有需要同时排序的元素放在一起
//类似于Python形成一个元组
struct Unite{
  string word;
  int count;
}
//还需要声明一个排序比较的方法,比较的元素类型为声明的结构体
//在方法中明确排序时的比较元素,及是正序还是逆序
private static int CompareByCountDes(Unite x, Unite y){
  if (y.m_count - x.m_count > 0) return 1;
  else if (y.m_count - x.m_count < 0) return -1;
  else return string.Compare(x.m_word, y.m_word);
}
//然后才能用Sort方法对结构体进行排序
//Unite_List是一个元素为结构体Unite的链表,即List
Unite_List.Sort(CompareByCountDes); 

然而,在Python中,对于元素是元组的链表,其排序用一行代码就可以完成:

sorted(Unite_List, key=lambda item:float(item[1]), reverse=True)

其中,Unite_List中的元素为(word, count)形式的元组,key后面指定的是排序的依据元素,lambda是一个内嵌的小函数(到现在也不是特别明白)。但至少明白,是按item[1]进行排序,即按count进行排序,如果要按word排序,可指定为item[0]。最后的参数reverse如果为「真」,则为逆序,默认值为假,是正序。

虽然,排序的内部过程大概都是要走两层循环,但在代码上Python则更容易一些。

简单的文件和数据操作

把运算的数据保存在文件和数据库,或者从文件或数据库中读取数据,也是常见的操作。C#中读取文本文件,需要声明一个FileStream用来指定文件路径和打开方式,即「读」或「写」或「追加」等。然后,使用StreamReader读取文件。读取的过程一般通过while循环来完成。文件读写之后,还建议对这两个对象执行Close操作。

但Python中,只需要指定一个文件读取变量就行:

FileRead = open('read.txt', 'r', encoding='utf-8')
content = FileRead.readlines()
for line in content:
    print(line)
FileRead.close()

如果使用with结构,还可以把close省略掉。

对于数据库,也可以省掉open和close的过程,也不用像C#那样去声明一个Connection和Command对象。对于sqlite这种轻型的数据库,只需要提供数据库文件的路径,就可以直接执行sql语句:

conn = sqlite3.connect("sqlite.db")
conn.execute('create table ...')
conn.execute('insert into ...')
conn.execute('delete from ...')
conn.execute('update ...')
# 对于查询结果,可以通过遍历的形式读取
result = conn.execute('select id, name from people')
for row in result:  #遍历查询结果的第一条记录
    print(row[0], row[1])   #row[0]对应id,row[1]对应name

当然,Python主要用于实现数据处理,所以Python一般多用在后台,前端的UI处理还需要借助其他工具。

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

推荐阅读更多精彩内容

  • http://python.jobbole.com/85231/ 关于专业技能写完项目接着写写一名3年工作经验的J...
    燕京博士阅读 7,546评论 1 118
  • 小时候最喜欢夏季的阴雨天。晴朗天气,万里无云,大太阳烤得人无处躲藏,凉席上体温的热度迟迟不散,整个人湿湿黏黏的难受...
    小毛王阅读 348评论 0 1
  • 近年来,公租房已成为解决城镇中等偏下收入住房困难家庭、新就业无房职工以及在城镇稳定就业外来务工人员住房问题的有效途...
    百事可爱哟阅读 149评论 0 0
  • 贝尔摩德,真名莎朗·温亚德,组织代号苦艾酒,是黑暗组织的核心人物,也是为数不多的见过BOSS的人,因其高超的易容技...
    煦子阅读 5,713评论 1 5
  • 所有波澜因你而起 如西风吹皱秋池 待风止而波余 于额头凝聚 怎抹得去
    王者_52be阅读 424评论 6 20