教你如何开发XBMC(KODI)插件,怎么入门及个人能的Python基础和实用技巧。
原文作者: wurenji
原文链接:https://www.hao4k.cn/thread-23835-1-9.html
Python是目前xbmc插件开发使用的唯一编程语言,要是想自己做个插件玩玩,Python这玩意儿多少要会点。python老鸟可以直接无视本文。
本文不作为完整的python学习教程,但可以帮助你更快入门和掌握要点。如果能在您日后的开发过程中起到一丁点作用,那将是我的荣幸!
话说磨刀不误砍柴工。下面几楼分块跟大家分享一下我的python学习使用心得
(一)环境搭建
为了更好的学习Python,建议搭建一些软件环境来提高学习开发效率。
Python是一门开源的程序设计语言,是一种可交互执行的解释性脚本语言,非常适合简单应用和插件开发。如果只是编写xbmc插件,并且在xbmc里面进行调试的话,可以不用下载安装python软件包。在官方下载地址上有多个版本下载,因为XBMC内置的解释器是基于python2的,所以请大家下载2.7.3版本进行安装。特别注意,python 3在很多地方与python 2是不兼容的。
DreamPie是一个很好的Python Shell,我经常拿它来进行交互开发,或者作为高级计算器。Python有个优势,不像其他编译性语言一样,一定要等到程序写完,编译通过以后才能运行得到结果。而Python却可以在Python Shell中单独允许一条语句。比如说,你不知道字符串去空格的函数是不是strip了,那么很简单,直接到pytho shell中跑一句 ' abc '.strip() 看得到的结果是不是'a'就知道了,不对再去查文档也不迟。很多时候,一个很大的py文件里面某地方出错了,你完全可以把其中某一些语句挑出来单独在python shell里面去跑,省去反复不停的执行整个文件,而且减少依赖。
我是用的最多的Python开发环境是Ulipad,因为本身是python写的,跨平台,windows/linux/mac os都可以用。另外一款PyScripter是针对windows平台开发的优秀IDE。两者都具有语法高亮、自动缩进、类型浏览等多种特性,可以提高代码编制效率。当然不嫌麻烦的话,也可以使用记事本来写代码。
(二)变量
Python的变量是没有类型的,可以赋任意类型的值。变量不需单独定义,一旦赋值即可使用。print函数可以输出变量内容。
>>> url = 'http://www.baidu.com'
>>> page = 4
>>> print url
http://www.baidu.com
>>> print page
4
>>> page += 5
>>> url += '?page=' + str(page)
>>> print url
http://www.baidu.com?page=9
上面的示例都是在python shell中交互运行的结果,以>>>开头的是输入的语句,其他的部分是显示结果。可以看到不需要像有些语言用var声明变量,也不需要int/string/char []*之类的类型定义符来进行定义。很简单,你想用的时候,直接赋值就行了,然后就可以对变量进行任意操作,比如用+=进行自加/连接,作为print函数的参数来输出变量的值。
>>> a = 123
>>> print a
123
>>> a = 1.24
>>> print a
1.24
>>> a = "I'm a fine"
>>> print a
I'm a fine
>>> a = (1, 2.4, "hello", {'a': 0, 'b': 1})
>>> print a
(1, 2.4, 'hello', {'a': 0, 'b': 1})
在上面的示例中,可以看到同一个变量可以赋不同的值。最后一个看起来稍微复杂点,将在后面的数据类型中一一讲到。
(三)数字
Python中的数字分整数和浮点数。python的整数有int和long,但是我们使用的时候不用管他。python中整数长度是没有限制的,这和别的很多语言不同,也就是说可以轻松的在python中完成大整数的运算
>>> 2**30
186: 1073741824
>>> 9**99
187: 29512665430652752148753480226197736314359272517043832886063884637676943433478020332709411004889L
>>> 2358321783728157823*23594389258432 + 29512665430652752148753480226197736314359272517043832886063884637676943433478020332709411004889
210: 29512665430652752148753480226197736314359272517043832886063884693320105595399861474399840518425L
>>> (1+2)*(39-13)
复制代码
在Python中,long类型的数值会在最后加上一个大写的L,但是你在输入的时候完全可以不用写。这是内部的类型转换,是无需关注和进行显示转换的。整数和浮点数进行运算时,会自动将整数转化为浮点后进行运算,得到浮点数结果。用int函数将浮点数转换为整数时,不进行四舍五入,而是简单的抛弃小数部分,这点需要注意。我们可以用int(x+0.5)的方式来进行四舍五入,当然也可以直接使用round()函数。
还有一点需要注意的是,/在python 2.x中,对于整数而言跟//的用法是相同的,都是取整数部分,这点很容易被忽略。%符号是用于取余数的运算符。divmod可以同时获得商和余数。
>>> 5/3
221: 1
>>> 5%3
222: 2
>>> 5/3.0
223: 1.6666666666666667
>>> 5//3
224: 1
>>> 5//3.0
225: 1.0
>>> divmod(5, 3)
226: (1, 2)
对于变量加1,没有像c语言里面那样的x++,一般用x=x+1,或者简化为x+=1。
(四)字符串
字符串是我们在程序中使用最多的类型。Python中没有字符类型,只有字符串。字符串可以用单引号或者双引号包围起来。可以用\符号在行的末尾进行换行,这是一种语法形式的换行,在很多地方使用,比如这行代码太长了。\换行的字符串实际并不包括换行符。
236: 'bbb'
>>> print 'hello'
hello
>>> print "hello"
hello
>>> 'hello' == "hello"
237: True
>>> print 'hello \
... world'
hello world
单引号和双引号可以嵌套使用。这点在使用中很方便,比如一个html代码片段,里面有双引号,在字符串里面就必须进行转义。但是使用单引号就可以省却这个麻烦。
把几个字符串放到一起,Python会自动进行拼接,也可以用+号进行显示拼接。
>>> print 'hello' "world"
helloworld
>>> print 'hello' +"world"
helloworld
字符串中包含换行符的,需要用\n进行表示。但是Python有一种很方便的方法,就是使用连续三个’或者"将字符串包围起来,则其中所有字符都原封不动的保留,包括空格和回车。这在构造一段html代码的时候很有用。
>>> print 'Dear J:\n Hi.\n yours.'
正则表达式是我们在编写插件过程中最常见的技巧,但是正则表达式本身有\符号进行转义。比如\\表示\,\*表示*。但是\本身在python字符串中也是起转移作用的,那么要么你多转义几次,要么使用raw string,就是在字符串加上一个r,表示字符串内不需要进行转义。下面的示例在正则表达式中表示三个字符:^\*
>>> print '\\^\\\\\\*'
\^\\\*
>>> print r'\^\\\*'
\^\\\*
字符串是只读的,不能修改其中的某些字符。如果需要修改,必须重新构造一个字符串。
>>> s='abb'
>>> s[0]='b'
Traceback (most recent call last):
File "", line 1, in
s[0]='b'
TypeError: 'str' object does not support item assignment
>>> s='b' + s[1:]
>>> s
236: 'bbb'
上例中的s[1:]用法在python中叫做切片(slice)。不仅对于字符串,对于后面讲到的tuple和列表都是同样的用法。基本的用法是s[start:end:step],start是切片开始的位置,python中从0开始,end表示结束的位置,注意s[end]这个字符本身不包含在内。这样end-start就是最后切片的长度,当然如果end小于start,得到的是空字符串''。step表示切片的步长,默认为1。简单来说,就是从start开始取,依次是start+step、start+step*2、...一致到小于end的所有字符。start、end、step都可以为负数,start和end负数表示从字符串后面开始数起,-1表示最后一个字符,step为负数就从后往前切片,这要求start大于end。len()函数用来获取字符串长度。几个参数都可以省略,start省略表示从0开始,end省略表示取到最后,step默认就是1了。说起来有点犯迷糊,看下面的例子就容易理解了。
>>> a='hello world'
>>> len(a)
240: 11
>>> a[:] #copy of string
241: 'hello world'
>>> a[2:] #from the third
242: 'llo world'
>>> a[2:-1] #except the last one
243: 'llo worl'
>>> a[::2] # the even chars
244: 'hlowrd'
>>> a[::-1] #reverse of string
245: 'dlrow olleh'
>>> 'magnet:?xt=urn:btih:8fcffdf6062379a6a1a0505bb809919870d240eb&dn=%5B%E8%A5%BF%E6%B8%B8%E9%99%8D%E9%AD%94%E7%AF%87%5D.2013.HDTV.720p.x264.AAC-iSCG%5B%E5%9B%BD%E8%AF%AD%E4%B8%AD%E8%8B%B1%E5%AD%97%E5%B9%951.7G%5D'[20:60]
246: '8fcffdf6062379a6a1a0505bb809919870d240eb'
下面的例子里面有一些字符串常见操作:
>>> 'hello world'.upper() #大写
247: 'HELL