byteofpythonhtml
得到人生中的成功须要的专一与坚持不懈多过天才与机会。python
1.Python入门程序员
Python的官方介绍是:正则表达式
Python是一种简单易学,功能强大的编程语言,它有高效率的高层数据结构,简单而有效地实现面向对象编程。Python简洁的语法和对动态输入的支持,再加上解释性语言的本质,使得它在大多数平台上的许多领域都是一个理想的脚本语言,特别适用于快速的应用程序开发。算法
Python是一种表明简单主义思想的语言。阅读一个良好的Python程序就感受像是在读英语同样,尽管这个英语的要求很是严格!Python的这种伪代码本质是它最大的优势之一。它使你可以专一于解决问题而不是去搞明白语言自己。shell
解释性编程
一个用编译性语言好比C或C++写的程序能够从源文件(即C或C++语言)转换到一个你的计算机使用的语言(二进制代码,即0和1)。这个过程经过编译器和不一样的标记、选项完成。当你运行你的程序的时候,链接/转载器软件把你的程序从硬盘复制到内存中而且运行。安全
而Python语言写的程序不须要编译成二进制代码。你能够直接从源代码运行程序。在计算机内部,Python解释器把源代码转换成称为字节码的中间形式,而后再把它翻译成计算机使用的机器语言并运行。事实上,因为你再也不须要担忧如何编译程序,如何确保链接转载正确的库等等,全部这一切使得使用Python更加简单。因为你只须要把你的Python程序拷贝到另一台计算机上,它就能够工做了,这也使得你的Python程序更加易于移植。数据结构
面向对象app
Python即支持面向过程的编程也支持面向对象的编程。在面向过程的语言中,程序是由过程或仅仅是可重用代码的函数构建起来的。在面向对象的语言中,程序是由数据和功能组合而成的对象构建起来的。与其余主要的语言如C++和Java相比,Python以一种很是强大又简单的方式实现面向对象编程。
可扩展性
若是你须要你的一段关键代码运行得更快或者但愿某些算法不公开,你能够把你的部分程序用C或C++编写,而后在你的Python程序中使用它们。
可嵌入性
你能够把Python嵌入你的C/C++程序,从而向你的程序用户提供脚本功能。
2.Python基本概念
查看python的版本:
Shell$ python –V
交互式:使用带提示符的解释器
注意,>>>是你键入Python语句的提示符。
若是你使用的是Linux/BSD shell,那么按Ctrl-d退出提示符。若是是在Windows命令行中,则按Ctrl-z再按Enter,或者输入exit()执行退出。
Python是大小写敏感的
$ python helloworld.py
Hello World
默认没有安装python-docs,经过按照套件python-docs-2.4.3-1.1.noarch.rpm来实现。
rpm -ivh python-docs-2.4.3-1.1.noarch.rpm
$ env PYTHONDOC=/usr/share/doc/python-docs-2.4.3/html/
对于编辑器的基本要求之一是语法加亮功能,利用这一功能,你的Python程序的不一样部分被标以不一样的颜色,这样你能够更好看清楚你的程序,使它的运行显得形象化。
在Python中有4种类型的数——整数、长整数、浮点数和复数。
3.23和52.3E-4是浮点数的例子。E标记表示10的幂。在这里,52.3E-4表示52.3 * 10-4。
单引号(')
双引号(")在双引号中的字符串与单引号中的字符串的使用彻底相同
三引号('''或""")利用三引号,你能够指示一个多行的字符串。你能够在三引号中自由的使用单引号和双引号。
天然字符串
若是你想要指示某些不须要如转义符那样的特别处理的字符串,那么你须要指定一个天然字符串。天然字符串经过给字符串加上前缀r或R来指定。例如r"Newlines are indicated by \n"。
给C/C++程序员的注释
在Python中没有专门的char数据类型。
给Perl/PHP程序员的注释
记住,单引号和双引号字符串是彻底相同的——它们没有在任何方面有不一样。
给正则表达式用户的注释
必定要用天然字符串处理正则表达式。不然会须要使用不少的反斜杠。
天然字符串
若是你想要指示某些不须要如转义符那样的特别处理的字符串,那么你须要指定一个天然字符串。天然字符串经过给字符串加上前缀r或R来指定。例如r"Newlines are indicated by \n"。
Unicode字符串
Unicode是书写国际文本的标准方法。若是你想要用你的母语如北印度语或阿拉伯语写文本,那么你须要有一个支持Unicode的编辑器。相似地,Python容许你处理Unicode文本——你只须要在字符串前加上前缀u或U。例如,u"This is a Unicode string."。
变量只是你的计算机中存储信息的一部份内存。
变量是标识符的例子。 标识符是用来标识某样东西的名字。在命名标识符的时候,你要遵循这些规则:
● 标识符的第一个字符必须是字母表中的字母(大写或小写)或者一个下划线(‘_’)。
● 标识符名称的其余部分能够由字母(大写或小写)、下划线(‘_’)或数字(0-9)组
成。
● 标识符名称是对大小写敏感的。例如,myname和myName不是一个标识符。注意前者中
的小写n和后者中的大写N。
● 有效标识符名称的例子有i、__my_name、name_23和a1b2_c3。
● 无效标识符名称的例子有2things、this is spaced out和my-name。
变量能够处理不一样类型的值,称为数据类型。基本的类型是数和字符串.
给C/C++程序员的注释
使用变量时只须要给它们赋一个值。不须要声明或定义数据类型。
这意味着同一层次的语句必须有相同的缩进。每一组这样的语句称为一个块。
你须要记住的同样东西是错误的缩进会引起错误
如何缩进
不要混合使用制表符和空格来缩进,由于这在跨越不一样的平台的时候,没法正常工做。我强
烈建议你在每一个缩进层次使用 单个制表符或两个或四个空格 。
选择这三种缩进风格之一。更加剧要的是,选择一种风格,而后一向地使用它,即只使用这一种风格。
3.运算符与表达式
'a' + 'b'获得'ab'。
'a' 'b'获得'ab'。
*:两个数相乘或是返回一个被重复若干次的字符串
2 * 3获得6。'la' * 3获得'lalala'。
** 幂 返回x的y次幂
4/3获得1(整数的除法获得整数结果)。4.0/3或4/3.0获得1.3333333333333333
// 取整除返回商的整数部分4 // 3.0获得1.0
% 取模返回除法的余数8%3获得2。-25.5%2.25获得1.5
返回x是否小于y。全部比较运算符返回1表示真,返回0表示假。这分别与特殊的变量True和False等价。注意,这些变量名的大写。
x = 2; y = 2; x == y返回True。x = 'str'; y ='stR'; x == y返回False。x = 'str'; y = 'str'; x== y返回True。
!= 不等于比较两个对象是否不相等x = 2; y = 3; x != y返回True。
运算符一般由左向右结合,即具备相同优先级的运算符按照从左向右的顺序计算。例如,2 +
3 + 4被计算成(2 + 3) + 4。一些如赋值运算符那样的运算符是由右向左结合的,即a = b = c被处理为a = (b = c)。
4.Python的流程控制
if语句用来检验一个条件, 若是 条件为真,咱们运行一块语句(称为 if-块 ), 不然 咱们处理另一块语句(称为 else-块 )。 else 从句是可选的。
注意if语句在结尾处包含一个冒号——咱们经过它告诉Python下面跟着一个语句块。
elif和else从句都必须在逻辑行结尾处有一个冒号,下面跟着一个相应的语句块(固然还包括正确的缩进)。
if number==guess:
print "your guess is ok!"
elif number > guess:
print "your guess is lower!"
else:
print "your guess is higher!"
给C/C++程序员的注释
在Python中没有switch语句。你可使用if..elif..else语句来完成一样的工做(在某些场合,使用字典会更加快捷。)
guess=int(raw_input('please input a number:'))
内建的raw_input函数提供一个字符串,这个字符串被打印在屏幕上,而后等待用户的输
入。一旦咱们输入一些东西,而后按回车键以后,函数返回输入.
当while循环条件变为False的时候,else块才被执行——这甚至也多是在条件第一次被检验的时候。若是while循环有一个else从句,它将始终被执行,除非你的while循环将永远循环下去不会结束!
else块事实上是多余的,由于你能够把其中的语句放在同一块(与while相同)中,跟在while语句以后,这样能够取得相同的效果。
给C/C++程序员的注释
记住,你能够在while循环中使用一个else从句。
for循环在这个范围内递归——for i in range(1,5)等价于for i in [1, 2, 3, 4],这就如同把序列中的每一个数(或对象)赋值给i,一次一个,而后以每一个i的值执行这个程序块。
记住,else部分是可选的。若是包含else,它老是在for循环结束后执行一次,除非遇到break语句。
输入字符串的长度经过内建的len函数取得。
记住,break语句也能够在for循环中使用。break的做用是跳过剩下的判断退出for循环。
记住,for..in循环对于任何序列都适用。这里咱们使用的是一个由内建range函数生成的数的列表,可是广义说来咱们可使用任何种类的由任何对象组成的序列。
break语句是用来终止循环语句的,即哪怕循环条件没有称为False或序列尚未被彻底递归,也中止执行循环语句。
一个重要的注释是,若是你从for或while循环中 终止 ,任何对应的循环else块将不执行。
continue语句被用来告诉Python跳过当前循环块中的剩余语句,而后继续进行下一轮循环。
注意,continue语句对于for循环也有效。
5.函数
函数经过def关键字定义。def关键字后跟一个函数的标识符名称,而后跟一对圆括号。圆括号之中能够包括一些变量名,该行以冒号结尾。接下来是一块语句,它们是函数体。
global语句被用来声明x是全局的——所以,当咱们在函数内把值赋给x的时候,这个变化也反映在咱们在主块中使用x的值的时候。
你可使用同一个global语句指定多个全局变量。例如global x, y, z。
你能够在函数定义的形参名后加上赋值运算符(=)和默认值,从而给形参指定默认参数值。
重要
只有在形参表末尾的那些参数能够有默认参数值,即你不能在声明函数形参的时候,先声明有默认值的形参然后声明没有默认值的形参。这是由于赋给形参的值是根据位置而赋值的。例如,def func(a, b=5)是有效的,可是def func(a=5, b)是无效的。
若是你的某个函数有许多参数,而你只想指定其中的一部分,那么你能够经过命名来为这些参数赋值——这被称做 关键参数 ——咱们使用名字(关键字)而不是位置(咱们前面所一直使用的方法)来给函数指定实参。
这样作有两个 优点 ——一,因为咱们没必要担忧参数的顺序,使用函数变得更加简单了。2、
假设其余参数都有默认值,咱们能够只给咱们想要的那些参数赋值。
return语句用来从一个函数 返回 即跳出函数。咱们也可选从函数返回一个值 。
注意,没有返回值的return语句等价于return None。None是Python中表示没有任何东西的特殊类型。例如,若是一个变量的值为None,能够表示它没有值。
除非你提供你本身的return语句,每一个函数都在结尾暗含有return None语句。经过运行print
someFunction(),你能够明白这一点,函数someFunction没有使用return语句,如同:
def someFunction():
pass
pass语句在Python中表示一个空的语句块。
文档字符串的惯例是一个多行字符串,它的首行以大写字母开始,句号结尾。第二行是空行,
从第三行开始是详细的描述。 强烈建议 你在你的函数中使用文档字符串时遵循这个惯例。
你可使用__doc__(注意双下划线)调用printMax函数的文档字符串属性(属于函数的名
称)。请记住Python把 每同样东西 都做为对象,包括这个函数。
6.模块
模块基本上就是一个包含了全部你定义的函数和变量的文件。为了在其余程序中重用模块,模块的文件名必须以.py为扩展名。
用Python标准库:sys.argv sys.path
sys模块包含了与Python解释器和它的环境有关的函数。
当Python执行import sys语句的时候,它在sys.path变量中所列目录中寻找sys.py模块。若是找到了这个文件,这个模块的主块中的语句将被运行,而后这个模块将可以被你使用 。注意,初始化过程仅在咱们 第一次 输入模块的时候进行。
脚本的名称老是sys.argv列表的第一个参数。
sys.argv包含了命令行参数的列表,即便用命令行传递给你的程序的参数。
注意,Python从0开始计数,而非从1开始。
sys.path包含输入模块的目录名列表。咱们能够观察到sys.path的第一个字符串表示当前目录也是sys.path的一部分,这与PYTHONPATH环境变量是相同的。这意味着你能够直接输入位于当前目录的模块。不然,你得把你的模块放在sys.path所列的目录之一。
每一个Python模块都有它的__name__,若是它是'__main__',这说明这个模块被用户单独运行,咱们能够进行相应的恰当操做。
每一个Python程序也是一个模块。你已经确保它具备.py扩展名了。
记住这个模块应该被放置在咱们输入它的程序的同一个目录中,或者在sys.path所列目录之一。
你可使用内建的dir函数来列出模块定义的标识符。标识符有函数、类和变量。
当你为dir()提供一个模块名的时候,它返回模块定义的名称列表。若是不提供参数,它返回当前模块中定义的名称列表。
不给dir函数传递参数而使用它——默认地,它返回当前模块的属性列表
del的一点注释——这个语句在运行后被用来删除 一个变量/名称
7.数据结构
在Python中有三种内建的数据结构——列表、元组和字典
list是处理一组有序项目的数据结构,即你能够在一个列表中存储一个 序列的项目。
列表中的项目应该包括在方括号中,这样Python就知道你是在指明一个列表。一旦你建立了一个列表,你能够添加、删除或是搜索列表中的项目。因为你能够增长或删除项目,咱们说列表是 可变的 数据类型,即这种类型是能够被改变的。
Python为list类提供了append方法,这个方法让你在列表尾添加一个项目。例如mylist.append('an item')列表mylist中增长那个字符串。注意,使用点号来使用对象的方法。
#!/usr/bin/python
shoplist=['bbb','aaa','ccc','ddd']
print 'I have',len(shoplist),'items to purchase!'
print 'These items are:'
for item in shoplist:
print item,
print '\nI have to buy rice'
shoplist.append('rice')
print 'My shoplist now is:',shoplist
print 'I will sort my shoplist now'
shoplist.sort()
print 'Stored shopping list is:',shoplist
print 'The first item I will buy is:',shoplist[0]
olditem=shoplist[0]
del shoplist[0]
print 'I bought the item is:',olditem
print 'My Shopping list is now:',shoplist
for..in循环在列表中各项目间递归
在print语句的结尾使用了一个 逗号 来消除每一个print语句自动打印的换行符
append方法在列表中添加了一个项目
用列表的sort方法来对列表排序。须要理解的是,这个方法影响列表自己,而不是返回一个修改后的列表
要删除列表中的第一个元素,所以咱们使用del shoplist[0](记住,Python从0开始计数)。
元组和列表十分相似,只不过元组和字符串同样是 不可变的 即你不能修改元组。元组经过圆括号中用逗号分割的项目定义。元组一般用在使语句或用户定义的函数可以安全地采用一组值的时候,即被使用的元组的值不会改变。
一个空的元组由一对空的圆括号组成,如myempty = ()。然而,含
有单个元素的元组就不那么简单了。你必须在第一个(惟一一个)项目后跟一个逗号,这样Python才能区分元组和表达式中一个带圆括号的对象。即若是你想要的是一个包含项目2的元组的时候,你应该指明singleton = (2 , )。
给Perl程序员的注释
列表之中的列表不会失去它的身份,即列表不会像Perl中那样被打散。一样元组中的元组,或列表中的元组,或元组中的列表等等都是如此。只要是Python,它们就只是使用另外一个对象存储的对象。
print语句可使用跟着%符号的项目元组的字符串。这些字符串具有定制的功能。定制让输出知足某种特定的格式。定制能够是%s表示字符串或%d表示整数。元组必须按照相同的顺序来对应这些定制。
Python在这里所作的是把元组中的每一个项目转换成字符串而且用字符串的值替换定制的位置。在第二个print语句中,咱们使用了一个定制,后面跟着%符号后的单个项目——没有圆括号。这只在字符串中只有一个定制的时候有效。
注意,你只能使用不可变的对象(好比字符串)来做为字典的键,可是你能够把不可变或可变的对象做为字典的值。基本说来就是,你应该只使用简单的对象做为键。
注意,键必须是惟一的
键值对在字典中以这样的方式标记:d = {key1 : value1, key2 : value2 }。注意它们的键/值对用冒号分割,而各个对用逗号分割,全部这些都包括在花括号中。
记住字典中的键/值对是没有顺序的。若是你想要一个特定的顺序,那么你应该在使用前本身对它们排序。
字典是dict类的实例/对象。
使用字典的items方法,来使用字典中的每一个键/值对。这会返回一个元组的列表,其中每一个元组都包含一对项目——键与对应的值。咱们抓取这个对,而后分别赋给for..in循环中的变量name和address而后在for-块中打印这些值。
序列的两个主要特色是索引操做符和切片操做符。索引操做符让咱们能够从序列中抓取一个特定项目。切片操做符让咱们可以获取序列的一个切片,即一部分序列
索引一样能够是负数,在那样的状况下,位置是从序列尾开始计算的。所以,shoplist[-1]表示序列的最后一个元素而shoplist[-2]抓取序列的倒数第二个项目。
切片操做符是序列名后跟一个方括号,方括号中有一对可选的数字,并用冒号分割。注意这与你使用的索引操做符十分类似。记住数是可选的,而冒号是必须的。
切片操做符中的第一个数(冒号以前)表示切片开始的位置,第二个数(冒号以后)表示切片到哪里结束。若是不指定第一个数,Python就从序列首开始。若是没有指定第二个数,则Python会中止在序列尾。注意,返回的序列从开始位置开始 ,恰好在 结束 位置以前结束。即开始位置是包含在序列切片中的,而结束位置被排斥在切片外。
序列的神奇之处在于你能够用相同的方法访问元组、列表和字符串。
当你建立一个对象并给它赋一个变量的时候,这个变量仅仅 引用 那个对象,而不是表示这个对象自己!也就是说,变量名指向你计算机中存储那个对象的内存。这被称做名称到对象的绑定。
大多数解释已经在程序的注释中了。你须要记住的只是若是你想要复制一个列表或者相似的序列或者其余复杂的对象(不是如整数那样的简单 对象 ),那么你必须使用切片操做符来取得拷贝。若是你只是想要使用另外一个变量名,两个名称都 引用 同一个对象,那么若是你不当心的话,可能会引来各类麻烦。
给Perl程序员的注释
记住列表的赋值语句不建立拷贝。你得使用切片操做符来创建序列的拷贝。
经常使用的序列方法:
Len(mylist)
Mylist.sort()
Mylist.append(‘one’)
Del mylist[1]
Ab.items()
Ab.has_key(‘one’)
经常使用的字符串方法:
Str.startswith(‘aa’)
‘aa’ in str
Str.find(‘aa’) != -1(若是找不到指定的字符返回-1)
Delimiter.join(mylist)
备份python脚本:
source_path=['/opt/shell','/opt/expect5.45']
print time.strftime("%Y%m%d%H%M%S")
target=target_path+time.strftime("%Y%m%d%H%M%S")+'.tar.gz'
bk_command='tar -zcvf %s %s'%(target_name,' '.join(source))
result=os.system(command)
咱们使用os.system函数 运行 命令,利用这个函数就好像在 系统 中运行命令同样。即在
shell中运行命令——若是命令成功运行,它返回0,不然它返回错误号
给Windows用户的注释
你能够把source列表和target目录设置成任何文件和目录名,可是在Windows中你得当心一些。问题是Windows把反斜杠(\)做为目录分隔符,而Python用反斜杠表示转义符!
因此,你得使用转义符来表示反斜杠自己或者使用天然字符串。例如,使用'C:\\Documents'或r'C:\Documents'而不是'C:\Documents'——你在使用一个不知名的转义符\D!
注意os.sep变量的用法——这会根据你的操做系统给出目录分隔符,即在Linux、Unix下它
是'/',在Windows下它是'\\',而在Mac OS下它是':'。使用os.sep而非直接使用字符,会使咱们的程序具备移植性,能够在上述这些系统下工做。
tar = 'tar -cvzf %s %s -X /home/swaroop/excludes.txt' % (target, ' '.join(srcdir))
选项解释以下:
● -c表示建立一个归档。
● -v表示交互,即命令更具交互性。
● -z表示使用gzip滤波器。
● -f表示强迫建立归档,即若是已经有一个同名文件,它会被替换。
● -X表示含在指定文件名列表中的文件会被排除在备份以外。例如,你能够在文件中指定
*~,从而不让备份包括全部以~结尾的文件。