byteofpython
获得人生中的成功需要的专注与坚持不懈多过天才与机会。
1.Python入门
Python的官方介绍是:
Python是一种简单易学,功能强大的编程语言,它有高效率的高层数据结构,简单而有效地实现面向对象编程。Python简洁的语法和对动态输入的支持,再加上解释性语言的本质,使得它在大多数平台上的许多领域都是一个理想的脚本语言,特别适用于快速的应用程序开发。
Python是一种代表简单主义思想的语言。阅读一个良好的Python程序就感觉像是在读英语一样,尽管这个英语的要求非常严格!Python的这种伪代码本质是它最大的优点之一。它使你能够专注于解决问题而不是去搞明白语言本身。
解释性
一个用编译性语言比如C或C++写的程序可以从源文件(即C或C++语言)转换到一个你的计算机使用的语言(二进制代码,即0和1)。这个过程通过编译器和不同的标记、选项完成。当你运行你的程序的时候,连接/转载器软件把你的程序从硬盘复制到内存中并且运行。
而Python语言写的程序不需要编译成二进制代码。你可以直接从源代码运行程序。在计算机内部,Python解释器把源代码转换成称为字节码的中间形式,然后再把它翻译成计算机使用的机器语言并运行。事实上,由于你不再需要担心如何编译程序,如何确保连接转载正确的库等等,所有这一切使得使用Python更加简单。由于你只需要把你的Python程序拷贝到另外一台计算机上,它就可以工作了,这也使得你的Python程序更加易于移植。
面向对象
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)是无效的。
如果你的某个函数有许多参数,而你只想指定其中的一部分,那么你可以通过命名来为这些参数赋值——这被称作 关键参数 ——我们使用名字(关键字)而不是位置(我们前面所一直使用的方法)来给函数指定实参。
这样做有两个 优势 ——一,由于我们不必担心参数的顺序,使用函数变得更加简单了。二、
假设其他参数都有默认值,我们可以只给我们想要的那些参数赋值。
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表示含在指定文件名列表中的文件会被排除在备份之外。例如,你可以在文件中指定
*~,从而不让备份包括所有以~结尾的文件。
本文转自 yubowei 51CTO博客,原文链接:http://blog.51cto.com/samyubw/625187