1、python 学习笔记(一) 入门 .1python 学习笔记(二) 数据类型 .9python 学习笔记(三) 字符串 .20python 学习笔记(四) 数据字典 .25python 学习笔记(五) 语句 .35python 学习笔记(六) 函数 .45python 学习笔记(七) 文件和目录操作 .57初识 Redis 及 Redis 在 Windows 下的安装和使用 64python 小专题 time 模块 69python 一些小知识 76python 小专题 JSON 79python 小专题 optparse 模块 .82python 小专题 urllib2 模块 .88pyt
2、hon 调用 powershell、远程执行 bat.92python 对 MySQL 的 CRUD102python 检测服务器是否 ping 通 .107python 操作 excel 表格(xlrd/xlwt) .110python 学习笔记(一)入门python 很多人都非常熟悉,而我作为后知后觉者,虽然慢人一步,但是学习永远不会晚。其实作为 shell,不管是 perl 还是 ruby、powershell 等,语法很相似的,我以前没接触过 python,现在从最基础的学起,当然对于非常简单的并没有详细记录,简单的准备记录下应该注意的地方。虽然 python3.X 的shell 工具
3、已经出来了,但是相关教程好像没找到,而且与 python2.x 语法好多不兼容。所以我的学习环境是 python shell2.7,也是目前最稳定和常用的版本吧。娱乐阶段:学习 python 之前,先来看看 python 的设计哲学,我觉得 Guido van Rossum 一定是个有趣的人,能将设计思想展现在 python 解释器中,呵呵。输入 import this 命令:Python 2.7.3 (default, Apr 10 2012, 23:31:26) MSC v.1500 32 bit (Intel) on win32Type “copyright“, “credits“ or
4、 “license()“ for more information. import thisThe Zen of Python, by Tim PetersBeautiful is better than ugly. 优美胜于丑陋Explicit is better than implicit. 明了胜于晦涩Simple is better than complex. 简单胜过复杂Complex is better than complicated. 复杂胜过凌乱Flat is better than nested. 扁平胜于嵌套Sparse is better than dense. 间隔胜
5、于紧凑Readability counts. 可读性很重要Special cases arent special enough to break the rules. 即使假借特例的实用性之名,也不违背这些规则Although practicality beats purity. 虽然实用性次于纯度Errors should never pass silently. 错误不应该被无声的忽略Unless explicitly silenced. 除非明确的沉默 In the face of ambiguity, refuse the temptation to guess. 当存在多种可能时,不
6、要尝试去猜测There should be one- and preferably only one -obvious way to do it. 应该有一个,最好只有一个,明显能做到这一点Although that way may not be obvious at first unless youre Dutch.虽然这种 方式可能不容易,除非你是 python 之父Now is better than never. 现在做总比不做好Although never is often better than *right* now. 虽然过去从未比现在好If the implementatio
7、n is hard to explain, its a bad idea. 如果这个实现不容易解释,那么它肯定是坏主意If the implementation is easy to explain, it may be a good idea. 如果这个实现容易解释,那么它很可能是个好主意Namespaces are one honking great idea - lets do more of those! 命名空间是一种绝妙的理念,应当多加利用 哈哈,和一般的语言不同,在“hello world”程序开始之前,它还有一番人生哲学啊。初步入门:第一个 python 程序:(和其他脚本一样
8、,可以按 tab 键快速选择) print “hello world“ =print 是一个函数hello world 这个在 python3.0 的解释器中运行是错误的,应该写成:print(“hello world“),不管这些,以下均是 2.X 版本下。基础知识:交互式 python 解释器可以当非常强大的计算器使用 1+12 1/2 =和其他语言一样,不做任何处理的情况下,这个是取整0 1.0/2 =将任意一个数写成浮点形式,则结果会与精度最大的保持一致0.5 1./2 =单独写个小数点也行0.5 1/2 = /这个符号是专门取整的0 假如不想每次都要这么费劲一下,我就想在 pytho
9、n 里执行普通的除法,有办法: from _future_ import division =注意 future 左右是两个下划线 1/20.5 1/2 =在这种情况下你反而想取整数部分了,使用/ 01./20.0长整型和进制: 958346283662845 =2.2 版本以前是不能处理长整型的,范围是-21474836482147483647958346283662845L =L 表示长整型,而且是大写 0xAF =16 进制175 010 =8 进制 (010 首数字是 0,表 8 进制)8 获取用户输入: x=input(“x=“)x=3 y=input(“y=“)y=4 x*y12函
10、数: pow(2,3) =求幂函数8 2*38 abs(-10) =取绝对值10 round(5/2) =这里是先算 5/2,即 2,所以 round(2)=2.02.0 round(2.5) =把浮点数四舍五入为最接近的整数值3.0 floor(32.9) =取为不大于该数的最大整数32模块: floor(23.5)=出错了Traceback (most recent call last): File “, line 1, in floor(23.5)NameError: name floor is not defined import math =引入模块 math math.floor(
11、23.5)23.0 int(math.floor(23.5) =转换为整数23 那我不想每次都输入 math.来调用相应函数,如下写法: from math import floor floor(3.2)3.0cmath 和复数:在高中的时候有复数的预算,比如对一个复数取平方根,python 提供了对复数处理的机制,但是要引入 cmath 模块。 sqrt(-9)Traceback (most recent call last):File “, line 1, in sqrt(-9)NameError: name sqrt is not defined import math =引入 math
12、 模块也无效 math.sqrt(-9)Traceback (most recent call last):File “, line 1, in math.sqrt(-9)ValueError: math domain error import cmath =引入 cmath 模块 cmath.sqrt(-9)3j (1+3j)*(9-2j) =还可以进行计算(15+25j) (_future_ 这个模块比较特别,它可以导入那些在未来会成为标准 python 组成的新特性)保存并执行程序:现在建一个 python 文件,扩展名是 .py,把 print “hello python!“写入,双击
13、,我们看到的是一闪而过的一个黑框,我记得在执行 C#窗体程序的时候也会出现这种情况,只要在主程序结尾加上“Console.ReadKey()“就行了,这里也是,要给控制台一个提醒输入的机会,不然运行完就退出了,在结尾加一个语句:raw_input()。再双击即可弹出 “hello python!”执行这个文件 hello.pyname=raw_input (“what is you name:“)print “hello “+name +“!“raw_input()字符串: “hello python!“ =双引号会把原字符串按原样显示hello python! “well go shoppi
14、ng!“well go shopping!“ well go shopping!SyntaxError: invalid syntax well go shopping! =转义单引号“well go shopping!“ “hello,python!“ she said“ =字符串本身有双引号的情况“hello,python!“ she said“hello “ + “python!“ =字符串拼接hello python!str & repr:您可能发现了,不用 print 打印出的字符串显示出来的时候会被单引号括起来。所有通过 python 打印的字符串是被引号括起来的,这是因为 pyt
15、hon 打印值的时候会保持该值在代码中的状态,而不是你希望用户看到的状态。 print “hello world“hello world print hello worldhello world “hello world“hello world hello worldhello world print 10000L10000 10000L10000L 这里讨论的实际是值转换成字符串的两种机制,str 函数:会把值转换为较理性的字符串,以便用户可以理解repr 函数:会创建一个字符串,以合法的 python 表达式的形式表示值。 print repr(“hello python!“)hello
16、python! print repr(100000L)100000L print str(“hello python!“) =显然,用户更希望看到的是 str 函数处理后的结果hello python! print str(10000L)10000 其实 python 有时候也没有这么智能,在高级语言中,好像数字有时候可以自动转换为字符串型 age=22 print “my age is “+ ageTraceback (most recent call last):File “, line 1, in print “my age is “+ ageTypeError: cannot conc
17、atenate str and int objects print “my age is “+ str(age)my age is 22 input & raw_input这样,我们先运行两个脚本,代码如下:name=input(“please input your name:“)print “hello,“+name另一个脚本是将上述 input 改为 raw_input运行会发现,第一个出错。其实不运行脚本也行,我么直接在解释器里运行命令吧! name =input(“please input name:“)please input name:JayTraceback (most rece
18、nt call last):File “, line 1, in name =input (“please input name:“)File “, line 1, in NameError: name Jay is not defined name =raw_input (“please input name:“)please input name:Jay其实你只要在 input 那个下面输入的字符串加上引号就行了,这就是原因。input 会假设用户输入的是 python 的合法表达式,当然以字符串作为输入的名字肯定没有问题,但是要求用户每次输入一个东西还需要加引号,这不太友好。想反,raw
19、_input 函数会把所有的输入当做原始数据,然后自动将其放入字符串中,所以不会出错,所以我们应尽可能使用 raw_input()长字符串如果需要写一个很长的字符串,它需要跨多行,可以使用三个单引号,强制换行用反斜杠 asdghagjawagasdghnagjawnag 1+5+4+616python 中对多个反斜杠(路径中常用)转义除了加,可以在整个字串的前面加 r print c:temptest.txt c: emp est.txt =t 是制表符,所以会将 t 作为一个制表符显示 print c:temptest.txt =用传统的转义c:temptest.txt print rc:t
20、emptest.txt =在前面加 r 转义c:temptest.txt 常用的函数:abs(number)、cmath.sqrt(number)、float(object)、help()、input(prompt)、int(object)、long(object)、math.ceil(number)(返回上入整数)、math.floor(number)(返回下舍整数)、pow(x,y)、raw_input(prompt) 、repr(object)、str(object) 、round(number.ndigits)python 学习笔记(二)数据类型python 数据结构学一门语言,最基础
21、和重要的就是数据结构了,而在 python 中最基本的数据结构是序列,也可以理解为数组,但貌似比数组强大。 jason=jason,42 james=james,45 database=jason,james databasejason, 42, james, 45 索引: greeting=hello greeting0h greeting-1 =反着的时候从-1 而不是 0 开始开始o digital=raw_input (“year:“)3year:2013 digital3索引示例: months=January,February,March,April,May,June,July,A
22、ugust,September,OctoberNovember,December #根据指定的年月日以数字形式打印出日期 endings=st,nd,rd+17*th+st,nd,rd+7*th+st #以 1-31 的数字作为结尾的列表 year=raw_input (“Year:“)Year:2013 month=raw_input(Month(1-12):)Month(1-12):3 day=raw_input(Day(1-31):)Day(1-31):30 month_num=int(month) day_num=int(day) month_name=monthsmonth_num-
23、1 =注意这里索引要减 1 ordinal=day+endingsday_num-1 print month_name + +ordinal + , + yearMarch 30th, 2013 分片:使用索引能访问单个元素,使用分片能访问一定范围的元素,分片通过冒号相隔的两个索引来实现。 tag=Python web site tag9:30http:/www.python.org tag32:-4Python web site numbers=1,2,3,4,5,6,7,8,9,10 numbers3:64, 5, 6 numbers-3:-18, 9 numbers-3:0 #分片中的最
24、左边的索引比它右边索引的晚出现在序列中,结果就是一个空序列 numbers-3: #默认到最后8, 9, 10 numbers:3 #默认从第一个开始1, 2, 3 numbers: #默认全部1, 2, 3, 4, 5, 6, 7, 8, 9, 10很显然,分片操作的实现需要提供两个索引作为边界,第一个索引的元素包含在分片内,而第二个不包含在分片内。分片步长:默认步长没有写,是 1,分片格式:上边界:下边界:步长 numbers0:10:1 #默认步长是 11, 2, 3, 4, 5, 6, 7, 8, 9, 10 numbers0:10:2 #步长设为 21, 3, 5, 7, 9 num
25、bers3:6:3 #步长设为 34 numbers:4 1, 5, 9 numbers8:3:-1 #步长不能为 0,因为不会向下执行,可以为负数,向前执行9, 8, 7, 6, 5 numbers10:0:-2 #当步长为负数时,开始索引必须大于结束索引10, 8, 6, 4, 2 numbers0:10:-2 numbers:-210, 8, 6, 4, 2 numbers 5:-26, 4, 2 numbers:5:-210, 8 序列相加: 1,2,3+4,5,61, 2, 3, 4, 5, 6 1,2,3+world #列表和字符串都是序列,但是不能连在一起,两种同类型的序列才能进
26、行连接操作Traceback (most recent call last):File “, line 1, in 1,2,3+worldTypeError: can only concatenate list (not “str“) to list 序列乘法: python*5pythonpythonpythonpythonpython 25*1025, 25, 25, 25, 25, 25, 25, 25, 25, 25空列表可以简单的通过 表示,但若想要创建一个占用十个元素空间,却不包括任何有用的有用的内容列表。这时需要使用 None,None 是 Python 的内建值,初始化一个长度
27、为 10 的列表如下: sequence=None*10 sequenceNone, None, None, None, None, None, None, None, None, None序列乘法示例:(存在脚本中运行)sentence=raw_input (“Sentence:“)screen_width=60text_width=len(sentence)box_width=text_width+6left_margin=(screen_width-box_width)/2printprint * left_margin + + + - * (box_width-2) + +print
28、* left_margin + | + * text_width + |print * left_margin + | + sentence + |print * left_margin + | + * text_width + |print * left_margin + + + - * (box_width-2) + +printraw_input()结果如下:in 运算符:检查一个值是否在序列中 permission=rwx #有木有觉得这个像判断 Linux 中某个文件的执行权限,确实可以这么判断 w in permissionTrue xx in permissionFalse us
29、ers=jason,james,jzhou raw_input (“enter your name:“) in usersenter your name:jzhouTrue序列成员资格示例:database=jason,42,james,45,jzhou,22username=raw_input(“Username:“)age=raw_input(“Age:“)if username,age in database:print “OK,right“raw_input()内建函数 len、min 、max numbers1, 2, 3, 4, 5, 6, 7, 8, 9, 10 len(numb
30、ers)10 max(numbers)10 min(numbers)1 列表:列表不同于元组和字符串,列表是可变的,而且列表有许多专门的方法。字符串不能像列表一样被修改,但是列表中的 list 函数可以实现修改。列表的常用用法: list(hello)h, e, l, l, o x=1,1,1 x1=2 #可以改变列表为元素赋值 x2=3 x1, 2, 3 names=james,jason,jzhou,liwear #可以删除列表中的元素 del names3 namesjames, jason, jzhou name=list(jzhou) namej, z, h, o, u name2:
31、=list(1314) #可以分片赋值 namej, z, 1, 3, 1, 4 numbers=1,5 #分片赋值可以在不需要替换任何元素的情况下插入新元素 numbers1:1=2,3,4 numbers1, 2, 3, 4, 5 numbers1:4= #也可以变相的删除元素 numbers1, 5列表的方法主要有 append, count,extend,index,insert,pop,remove,reverse,sort,简单用法如下: list=1,2,3 list .append(4) # append 用于在列表末尾追加新对象 list1, 2, 3, 4 to,be,or
32、,to.count(to) #count 用于统计某个元素在列表中出现的次数2 x=1,2,1,1,2,1,1,2 x.count(1)2 x.count(1,2)1 a=1,2,3 b=4,5,6 a.extend(b) #extend 在列表的末尾一次性追加另一个序列的多个值,扩展原有列表 a1, 2, 3, 4, 5, 6 #注意这个操作与连接操作不同,extend 修改了被扩展的序列即 a,而连接只是临时显示并没有变 a=1,2,3 b=4,5,6 alen(a):=b #也可以通过分片赋值来扩展,但是可读性不强 a1, 2, 3, 4, 5, 6 sentence=we,are,go
33、od,student sentence.index (are) #index 用于从列表中找出某个值第一个匹配项的索引位置1 numbers=1,2,3,4,5,6,7 numbers.insert(3,four) #insert 用于将对象插入列表中,和数据结构中的链表操作非常相似 numbers1, 2, 3, four, 4, 5, 6, 7 numbers=1,2,3,4,5,6,7 numbers3:3=four #也可以使用分片赋值的方法实现,但是可读性不强 numbers1, 2, 3, four, 4, 5, 6, 7 x=1,2,3 x.pop() #出栈操作,和数据结构中的
34、栈操作一样,即移除列表中的最后一个,并且返回该元素的值3 x1, 2 x.pop()2 x=1,2,3 x.append(x.pop() #这个操作和数据结构中的 push、pop 是一样的,追加刚刚出栈的值,很有趣,最后得到的还是是原来的值 x1, 2, 3 x=to,be,or,not,to,be x.remove (be) #remove 用于移除列表中某个值的第一个匹配项 x #值得注意的是 remove 方法是没有返回值的原位置改变方法,注意和 pop 的区别to, or, not, to, be x=1,2,3 x.reverse () #将列表中的元素反向存放,注意这种方法 改变
35、了列表但没有返回值 x3, 2, 1 x=4,5,6,7,1,2,3 x.sort() #sort 用于在原位置对列表进行排序,也改变了序列的值,但是没有返回值 x1, 2, 3, 4, 5, 6, 7 注意以上方法除了 count 和 index,都是会使列表的内容的产生变化。介于 sort 方法修改列表但是没有返回值的情况有待细说一下: x=4,6,2,1,7,9 y=x.sort() #因为 x.sort()不反回值,所以 y 并没有赋到值 print yNone 看下正确的做法吧,其实也就是将步骤拆开而已:(sort 函数不反回值的特点决定了不能在它的后面继续后续操作,比如 x.sor
36、t().reverse(),但是serted(x).reverse()是正确的 ) x=4,6,2,1,7,9 y=x: #先将 x 复制给 y y.sort() #将 y 排序 x4, 6, 2, 1, 7, 9 y1, 2, 4, 6, 7, 9 x=y x1, 2, 4, 6, 7, 9 y1, 2, 4, 6, 7, 9另一种获取已排序的列表副本的方法是使用 sorted 函数: x=4, 6, 2, 1, 7, 9 y=sorted(x) x4, 6, 2, 1, 7, 9 y1, 2, 4, 6, 7, 9sorted 函数可以用于任何序列,却总是返回一个列表: sorted(“P
37、ython“) #默认按 ASCII 码排序P, h, n, o, t, y如果想把一些元素按相反的顺序排出,可以先用 sort 或者 sorted 函数,在调用 reverse 函数。嵌套使用的功能很强大。关于高级排序:元素能按照特定的方式进行排序,可以使用 compare(x,y)自定义比较函数,compare(x,y)函数会在 xy 时返回正值,x=y 时返回 0。定义好该函数之后,就可以提供给 sort 方法作为参数了。 cmp(42,23)1 cmp(99,100)-1 cmp(1,1)0 numbers=5,2,6,7 numbers.sort(cmp) #这个机制之后会介绍 nu
38、mbers2, 5, 6, 7元组不可变序列元组和列表一样,也是一种序列,唯一的不同是元组不能修改,字符串也是如此;创建元素很简单,用逗号分隔一些值,就自动创建了元组: 1,2,3(1, 2, 3) (1,2,3)(1, 2, 3) (42,) # 逗号说明它是一个元组,不然加括号(如:(42))也没用(42,) 3*(40+2) #这个例子说明了逗号的重要性,42 和(42)是完全一样的126 3*(40+2,) (42, 42, 42) tuple 函数:tuple 函数的功能与 list 函数基本一样:以一个序列作为参数把它转换为元组。如果参数是数组,那么该参数就会被原样返回: tupl
39、e(1,2,3)(1, 2, 3) tuple(abc)(a, b, c) tuple(1,2,3)(1, 2, 3)元组其实就是数组,除了创建和访问之外,没有太多操作,和其他类型的序列操作类似: x=1,2,3 x12 x0:2 #元组的分片还是元组,就像列表的分片还是列表一样(1, 2)那么元组的存在意义是什么呢,首先元组可以在映射中当做键使用,而列表不行;其次,元组作为很多内建函数和方法的返回值存在。只要不涉及到修改元组,大部分情况下和列表基本功能相同。一般来说,列表可更能满足对序列的所有要求。用到的函数总结:cmp(x,y)、len(seq)(返回序列长度 )、list(seq)(把序
40、列转换成列表)、 max(args)、 min(args)、reverse(seq)(对序列进行反向迭代)、sorted(seq)(返回已排序的包含 seq 所有元素的列表 )、tuple(seq)( 把序列转换成元组)python 学习笔记(三)字符串字符串操作字符串在任何一门语言都是一个重点,灵活运用可实现各种强大的功能,在python 中,字符串也是如此,标准的序列操作对字符串也使用,但是分片赋值不行,因为字符串是不可变的。字符串的格式化:字符串格式化使用字符串格式化操作符%来实现,在%左侧放置一个字符串,右侧放置希望格式化的值。看下面这个简单的例子: format=“Hello,%s,
41、Im studying %s!“ values=(world,Python) print format % valuesHello,world,Im studying Python!注意:如果使用列表或者其他列表代替元组,那么序列就会被解释为一个值,只有元组和字典和格式化一个以上的值。%s 标记了需要插入转换值的位置,s 表示会被转化为字符串,如果不是字符串,则会用 str 将其转换为字符串。另外,如果需要在格式化字符串里包括百分号,则必须使用%。如果需要格式化实数,用 f 说明符类型,同时提供精度;一个据点再加上希望保存的小数位数。因为格式化说明符总是以表示类型的字符结束,所以精度应该放在类
42、型字符前面: format=“PI with three decimals :%.3f“ from math import pi print format % piPI with three decimals :3.142格式化操作符的右操作数可以是任何东西,如果是元组或者映射类型(字典),则字符串的格式化略有不同。例如,如果右操作数是元组,则其中每一个 I元素都会被单独格式化,每个值都需要一个对应的转换说明符。(注意:如果需要转换的元组作为转换表示的一部分存在,那么必须将它用圆括号括起来) %s plus %s equals %s %(1,1,2)1 plus 1 equals 2 当然,字
43、符串格式化还有很多,比如填充和字宽和精度等,这些带用到时再去查也不迟,下面是一个关于字符串格式化一个较综合的例子,包括字宽和对齐等:width=input(Please input width:)price_width=10item_width=width-price_widthheader_format=%-*s%*sformat =%-*s%*.2fprint = * widthprint header_format % (item_width,Item,price_width ,Price)print - * widthprint format % (item_width ,Apples
44、,price_width ,0.4)print format % (item_width ,Pears,price_width ,0.5)print format % (item_width ,Cantaloupes,price_width ,1.92)print format % (item_width ,Dried Apricots(16 oz.),price_width ,8)print format % (item_width ,Prunes(4 lbs.),price_width ,12)print = * widthraw_input(“enter any key to exit“
45、)运行结果如下:字符串方法:几乎任何一种语言关于字符串的方法都很多,不过都大同小异,python 中字符串方法的思想和数据结构的思想非常相似。find在一个较长的字符串查找子字符串,返回所在位置的最左端索引,下面是常用的用法: “hello,python,I like python“.find(python) #返回的是第一个python的索引6 title=“hahha,hekko,hello“ title.find (find) #找不到时返回-1-1 subject=$ Get rich now !$ subject.find ($) #默认返回最左边所在的位置0 subject.fin
46、d ($,1) #指定起始搜索位置20 subject.find($,0,10) #指定搜索的上下限,注意包含上线不包含下线0join用来在队列中添加元素( 必须是字符串),是 split 方法的逆方法,很常用,下面几例是常见用法: digitals=1,2,3,4,5 seperaor=+ seperaor.join(digitals) #连接数字列表出现错误Traceback (most recent call last):File “, line 1, in seperaor.join(digitals)TypeError: sequence item 0: expected strin
47、g, int found digitals=1,2,3,4,5 #改为字符串 seperaor=+ seperaor.join(digitals) #连接字符串列表是正确的1+2+3+4+5 dir=,usr,bin,env /.join(dir) #Linux 下目录的格式/usr/bin/env print C:+.join(dir) #windows 下目录格式,注意反斜杠需要转义C:usrbinenvlower返回字符串的小写字母。为了程序的友好有时候需要“忽略”用户输入的大小写,在程序中应使用统一的格式来识别,下面举出常见用法:(upper 是类似的用法) Trouble Is a Friend!.lower()trouble is a f