python学习笔记.docx
《python学习笔记.docx》由会员分享,可在线阅读,更多相关《python学习笔记.docx(125页珍藏版)》请在冰豆网上搜索。
python学习笔记
python学习笔记
(一)——入门1
python学习笔记
(二)——数据类型9
python学习笔记(三)——字符串20
python学习笔记(四)——数据字典25
python学习笔记(五)——语句35
python学习笔记(六)——函数45
python学习笔记(七)——文件和目录操作57
初识Redis及Redis在Windows下的安装和使用64
python小专题——time模块69
python一些小知识76
python小专题——JSON79
python小专题——optparse模块82
python小专题——urllib2模块88
python调用powershell、远程执行bat92
python对MySQL的CRUD102
python检测服务器是否ping通107
python操作excel表格(xlrd/xlwt)110
python学习笔记
(一)——入门
python很多人都非常熟悉,而我作为后知后觉者,虽然慢人一步,但是学习永远不会晚。
其实作为shell,不管是perl还是ruby、powershell等,语法很相似的,我以前没接触过python,现在从最基础的学起,当然对于非常简单的并没有详细记录,简单的准备记录下应该注意的地方。
虽然python3.X的shell工具已经出来了,但是相关教程好像没找到,而且与python2.x语法好多不兼容。
所以我的学习环境是pythonshell2.7,也是目前最稳定和常用的版本吧。
娱乐阶段:
学习python之前,先来看看python的设计哲学,我觉得GuidovanRossum一定是个有趣的人,能将设计思想展现在python解释器中,呵呵。
输入importthis命令:
Python2.7.3(default,Apr102012,23:
31:
26)[MSCv.150032bit(Intel)]onwin32
Type"copyright","credits"or"license()"formoreinformation.
>>>importthis
TheZenofPython,byTimPeters
Beautifulisbetterthanugly.优美胜于丑陋
Explicitisbetterthanimplicit.明了胜于晦涩
Simpleisbetterthancomplex.简单胜过复杂
Complexisbetterthancomplicated.复杂胜过凌乱
Flatisbetterthannested.扁平胜于嵌套
Sparseisbetterthandense.间隔胜于紧凑
Readabilitycounts.可读性很重要
Specialcasesaren'tspecialenoughtobreaktherules.即使假借特例的实用性之名,也不违背这些规则
Althoughpracticalitybeatspurity.虽然实用性次于纯度
Errorsshouldneverpasssilently.错误不应该被无声的忽略
Unlessexplicitlysilenced.除非明确的沉默
Inthefaceofambiguity,refusethetemptationtoguess.当存在多种可能时,不要尝试去猜测
Thereshouldbeone--andpreferablyonlyone--obviouswaytodoit.应该有一个,最好只有一个,明显能做到这一点
Althoughthatwaymaynotbeobviousatfirstunlessyou'reDutch.虽然这种方式可能不容易,除非你是python之父
Nowisbetterthannever.现在做总比不做好
Althoughneverisoftenbetterthan*right*now.虽然过去从未比现在好
Iftheimplementationishardtoexplain,it'sabadidea.如果这个实现不容易解释,那么它肯定是坏主意
Iftheimplementationiseasytoexplain,itmaybeagoodidea.如果这个实现容易解释,那么它很可能是个好主意
Namespacesareonehonkinggreatidea--let'sdomoreofthose!
命名空间是一种绝妙的理念,应当多加利用
>>>
哈哈,和一般的语言不同,在“helloworld”程序开始之前,它还有一番人生哲学啊。
初步入门:
第一个python程序:
(和其他脚本一样,可以按tab键快速选择)
>>>print"helloworld"==>print是一个函数
helloworld
>>>
这个在python3.0的解释器中运行是错误的,应该写成:
print("helloworld"),不管这些,以下均是2.X版本下。
基础知识:
交互式python解释器可以当非常强大的计算器使用
>>>1+1
2
>>>1/2==>和其他语言一样,不做任何处理的情况下,这个是取整
0
>>>1.0/2==>将任意一个数写成浮点形式,则结果会与精度最大的保持一致
0.5
>>>1./2==>单独写个小数点也行
0.5
>>>1//2==>//这个符号是专门取整的
0
>>>
假如不想每次都要这么费劲一下,我就想在python里执行普通的除法,有办法:
>>>from__future__importdivision==>注意future左右是两个下划线
>>>1/2
0.5
>>>1//2==>在这种情况下你反而想取整数部分了,使用//
>>>0
>>>1.//2
>>>0.0
长整型和进制:
>>>958346283662845==>2.2版本以前是不能处理长整型的,范围是-2147483648~2147483647
958346283662845L==>L表示长整型,而且是大写
>>>0xAF==>16进制
175
>>>010==>8进制(010首数字是0,表8进制)
8
>>>
获取用户输入:
>>>x=input("x=")
x=3
>>>y=input("y=")
y=4
>>>x*y
12
函数:
>>>pow(2,3)==>求幂函数
8
>>>2**3
8
>>>abs(-10)==>取绝对值
10
>>>round(5/2)==>这里是先算5/2,即2,所以round
(2)=2.0
2.0
>>>round(2.5)==>把浮点数四舍五入为最接近的整数值
3.0
>>>floor(32.9)==>取为不大于该数的最大整数
32
模块:
>>>floor(23.5)
==>出错了
#ff0000;">Traceback(mostrecentcalllast):
File"",line1,in
floor(23.5)
NameError:
name'floor'isnotdefined
>>>importmath==>引入模块math
>>>math.floor(23.5)
23.0
>>>int(math.floor(23.5))==>转换为整数
23
>>>
那我不想每次都输入math.来调用相应函数,如下写法:
>>>frommathimportfloor
>>>floor(3.2)
3.0
cmath和复数:
在高中的时候有复数的预算,比如对一个复数取平方根,python提供了对复数处理的机制,但是要引入cmath模块。
>>>sqrt(-9)
Traceback(mostrecentcalllast):
File"",line1,in
sqrt(-9)
NameError:
name'sqrt'isnotdefined
>>>importmath==>引入math模块也无效
>>>math.sqrt(-9)
Traceback(mostrecentcalllast):
File"",line1,in
math.sqrt(-9)
ValueError:
mathdomainerror
>>>importcmath==>引入cmath模块
>>>cmath.sqrt(-9)
3j
>>>(1+3j)*(9-2j)==>还可以进行计算
(15+25j)
>>>
(__future__这个模块比较特别,它可以导入那些在未来会成为标准python组成的新特性)
保存并执行程序:
现在建一个python文件,扩展名是.py,把print"hellopython!
"写入,双击,我们看到的是一闪而过的一个黑框,我记得在执行C#窗体程序的时候也会出现这种情况,只要在主程序结尾加上"Console.ReadKey()"就行了,这里也是,要给控制台一个提醒输入的机会,不然运行完就退出了,在结尾加一个语句:
raw_input()。
再双击即可弹出“hellopython!
”
执行这个文件hello.py
name=raw_input("whatisyouname:
")
print"hello"+name+"!
"
raw_input()
字符串:
>>>"hellopython!
"==>双引号会把原字符串按原样显示
'hellopython!
'
>>>"we'llgoshopping!
"
"we'llgoshopping!
"
>>>'we'llgoshopping!
'
SyntaxError:
invalidsyntax
>>>'we\'llgoshopping!
'==>转义单引号
"we'llgoshopping!
"
>>>"\"hello,python!
\"shesaid"==>字符串本身有双引号的情况
'"hello,python!
"shesaid'
>>>"hello"+"python!
"==>字符串拼接
'hellopython!
'
str&repr:
您可能发现了,不用print打印出的字符串显示出来的时候会被单引号括起来。
所有通过python打印的字符串是被引号括起来的,这是因为python打印值的时候会保持该值在代码中的状态,而不是你希望用户看到的状态。
>>>print"helloworld"
helloworld
>>>print'helloworld'
helloworld
>>>"helloworld"
'helloworld'
>>>'helloworld'
'helloworld'
>>>print10000L
10000
>>>10000L
10000L
>>>
这里讨论的实际是值转换成字符串的两种机制,
str函数:
会把值转换为较理性的字符串,以便用户可以理解
repr函数:
会创建一个字符串,以合法的python表达式的形式表示值。
>>>printrepr("hellopython!
")
'hellopython!
'
>>>printrepr(100000L)
100000L
>>>printstr("hellopython!
")==>显然,用户更希望看到的是str函数处理后的结果
hellopython!
>>>printstr(10000L)
10000
>>>
其实python有时候也没有这么智能,在高级语言中,好像数字有时候可以自动转换为字符串型
>>>age=22
>>>print"myageis"+age
Traceback(mostrecentcalllast):
File"",line1,in
print"myageis"+age
TypeError:
cannotconcatenate'str'and'int'objects
>>>print"myageis"+str(age)
myageis22
>>>
input&raw_input
这样,我们先运行两个脚本,代码如下:
name=input("pleaseinputyourname:
")
print"hello,"+name
另一个脚本是将上述input改为raw_input
运行会发现,第一个出错。
其实不运行脚本也行,我么直接在解释器里运行命令吧!
>>>name=input("pleaseinputname:
")
pleaseinputname:
Jay
Traceback(mostrecentcalllast):
File"",line1,in
name=input("pleaseinputname:
")
File"",line1,in
NameError:
name'Jay'isnotdefined
>>>name=raw_input("pleaseinputname:
")
pleaseinputname:
Jay
其实你只要在input那个下面输入的字符串加上引号就行了,这就是原因。
input会假设用户输入的是python的合法表达式,当然以字符串作为输入的名字肯定没有问题,但是要求用户每次输入一个东西还需要加引号,这不太友好。
想反,raw_input函数会把所有的输入当做原始数据,然后自动将其放入字符串中,所以不会出错,所以我们应尽可能使用raw_input()
长字符串
如果需要写一个很长的字符串,它需要跨多行,可以使用三个单引号,强制换行用反斜杠\
>>>'''asdgh
agjaw
ag'''
'asdgh\nagjaw\nag'
>>>1+5+\
4+6
16
>>>
python中对多个反斜杠(路径中常用)转义除了加\,可以在整个字串的前面加r
>>>print'c:
\temp\test.txt'
c:
empest.txt==>\t是制表符,所以会将\t作为一个制表符显示
>>>print'c:
\\temp\\test.txt'==>用传统的\转义
c:
\temp\test.txt
>>>printr'c:
\temp\test.txt'==>在前面加r转义
c:
\temp\test.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数据结构
学一门语言,最基础和重要的就是数据结构了,而在python中最基本的数据结构是序列,也可以理解为数组,但貌似比数组强大。
>>>jason=['jason',42]
>>>james=['james',45]
>>>database=[jason,james]
>>>database
[['jason',42],['james',45]]
>>>
索引:
>>>greeting='hello'
>>>greeting[0]
'h'
>>>greeting[-1]==>反着的时候从-1而不是0开始开始
'o'
>>>digital=raw_input("year:
")[3]
year:
2013
>>>digital
'3'
索引示例:
>>>months=['January','February','March','April',\
'May','June','July','August','September','October'\
'November','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=months[month_num-1]==>注意这里索引要减1
>>>ordinal=day+endings[day_num-1]
>>>printmonth_name+''+ordinal+','+year
March30th,2013
>>>
分片:
使用索引能访问单个元素,使用分片能访问一定范围的元素,分片通过冒号相隔的两个索引来实现。
>>>tag='//www.python.org">Pythonwebsite'
>>>tag[9:
30]
'http:
//www.python.org'
>>>tag[32:
-4]
'Pythonwebsite'>>>
>>>numbers=[1,2,3,4,5,6,7,8,9,10]
>>>numbers[3:
6]
[4,5,6]
>>>numbers[-3:
-1]
[8,9]
>>>numbers[-3:
0]#分片中的最左边的索引比它右边索引的晚出现在序列中,结果就是一个空序列
[]
>>>numbers[-3:
]#默认到最后
[8,9,10]
>>>numbers[:
3]#默认从第一个开始
[1,2,3]
>>>numbers[:
]#默认全部
[1,2,3,4,5,6,7,8,9,10]
很显然,分片操作的实现需要提供两个索引作为边界,第一个索引的元素包含在分片内,而第二个不包含在分片内。
分片步长:
默认步长没有写,是1,分片格式:
上边界:
下边界:
步长
>>>numbers[0:
10:
1]#默认步长是1
[1,2,3,4,5,6,7,8,9,10]
>>>numbers[0:
10:
2]#步长设为2
[1,3,5,7,9]
>>>numbers[3:
6:
3]#步长设为3
[4]
>>>numbers[:
:
4]
[1,5,9]
>>>numbers[8:
3:
-1]#步长不能为0,因为不会向下执行,可以为负数,向前执行
[9,8,7,6,5]
>>>numbers[10:
0:
-2]#当步长为负数时,开始索引必须大于结束索引
[10,8,6,4,2]
>>>numbers[0:
10:
-2]
[]
>>>numbers[:
:
-2]
[10,8,6,4,2]
>>>numbers[5:
:
-2]
[6,4,2]
>>>numbers[:
5:
-2]
[10,8]
>>>
序列相加:
>>>[1,2,3]+[4,5,6]
[1,2,3,4,5,6]
>>>[1,2,3]+'world'#列表和字符串都是序列,但是不能连在一起,两种同类型的序列才能进行连接操作
Traceback(mostrecentcalllast):
File"",line1,in
[1,2,3]+'world'
TypeError:
canonlyconcatenatelist(not"str")tolist
>>>
序列乘法:
>>>'python'*5
'pythonpythonpythonpythonpython'
>>>[25]*10
[25,25,25,25,25,25,25,25,25,25]
空列表可以简单的通过[]表示,但若想要创建一个占用十个元素空间,却不包括任何有用的有用的内容列表。
这时需要使用None,None是Python的内建值,初始化一个长度为10的列表如下:
>>>sequence=[None]*10
>>>sequence
[None,None,None,None,None,None,None,None,None,None]
序列乘法示例:
(存在脚本中运行)
sentence=raw_input("Sentence:
")
screen_width=60
text_width=len(sentence)
box_width=text_width+6
left_margin=(screen_width-box_width)//2
print
print''*left_margin+'+'+'-'*(box_width-2)+'+'
print''*left_margin+'|'+''*text_width+'|'
print''*left_margin+'|'+sentence+'|'
print''*left_margin+'|'+''*text_width+'|'
print''*left_margin+'+'+'-'*(box_width-2)+'+'
print
raw_input()
结果如下:
in运算符:
检查一个值是否在序列中
>>>permission='rwx'#有木有觉得这个像判断Linux中某个文件的执行权限,确实可以这么判断
>