您是PHP开发人员。 您可能在过去五年(或更长时间)内一直在编写应用程序,并且您已经构建了几乎可以想象的所有东西-电子商务系统,简单的内容管理系统,Twitter和Facebook集成以及许多自定义实用程序。 您可能还维护了很多代码-从简单的显示页面到带有成千上万行别人编写的自定义应用程序的所有内容。
因为您花了很多时间在PHP中工作,所以您是否有可能跳到另一种语言就值得怀疑了。 但您也知道,静止不动是该领域灾难的必经之路。 如果没有别的,学习一种新语言就像是出国旅行:您会看到新事物,品尝新食物,享受不同的文化,与不同的人进行刺激性的交谈,看到整洁的东西,然后回到家重新评估自己的平常生活的环境。
本文使您对Python有一些了解。 它假定您不了解该编程语言,因此在此处阅读的内容似乎有些基础。 它着重于将Python与PHP进行比较和对比—并不是因为一种语言比另一种语言要好,而是因为一个简单的道理:通过引用已有的知识来学习新事物通常会更容易。
本文的目标很简单:为您提供Python的快速使用知识,希望您自己进一步深入研究。 幸运的是,您会发现Python与您以前使用的并没有太大不同。 为了扩展旅行的隐喻,您并不会真正去遥远的异国,而只是在隔壁的每个人都说与您使用相同语言的国家。
什么是Python?
Python被归类为“通用的高级编程语言”。 它以令人难以置信的简洁和易于阅读而闻名,它是您将遇到的空白和缩进实际上很重要的几种语言之一。 Python的主要作者Guido Van Rossum在社区中仍然非常活跃,并被戏称为“仁慈的独裁者生命”。
Python的优点之一就是它的灵活性和紧凑性。 它支持面向对象,结构化,面向方面和功能编程以及其他方法。 Python的设计具有一个小的核心和大量的扩展库,这使得该语言非常紧凑和灵活。
从语法的角度来看,您会发现Python非常干净-稀疏性几乎像寺院一样和Zen。 PHP开发人员会对这种方法产生很大的兴趣,可以从语法学的角度寻求缓解,或者发现它具有限制性。 这只取决于您的前景。 Python社区明确倡导这种特殊的审美观,而不是聪明的hack来重视美观和简单性。 那些来自Perl传统(“不止一种方法”)PHP开发人员(像我本人)将面临完全相反的哲学(“只有一种明显的方法”)。
实际上,社区中的代码术语遵循一种首选样式: pythonic。 说您的代码是pythonic就是说它很好地使用了Python习惯用法,或者您显示的是语言的自然流利程度。 本文不会试图成为一名Pythonista (或Pythoneer ),但是如果您想继续沿着Python的道路前进,则需要注意这一点。 就像有某些类似于PHP的工作方式和类似于Perl的工作方式一样,采用Python意味着最终您需要开始使用该语言进行思考。
另一个简短的说明:在撰写本文时,Python的版本最高为V3.0,但是本文重点介绍Python V2.6。 Python V3.0与早期版本不向后兼容,并且看来V2.6是最常用的版本。 当然,您可以自由使用所需的任何东西。
Python与PHP有何不同?
一般来说,PHP是一种Web开发语言。 是的,它具有命令行界面,甚至可以用于开发嵌入式应用程序,但是在大多数情况下,PHP用于Web开发。 相反,Python是一种通用的脚本语言,也可以用于Web开发。 这样-我知道我会为此大吼大叫-它比PHP更接近Perl。 (当然,在其他所有方面,它的确没有什么不同。但是,让我们继续前进。)
PHP的语法充满了美元符号( $
)和花括号( {}
),而Python则更加简洁明了。 PHP有一个switch
, do...while
构造时do...while
Python没有。 PHP具有三元运算符( foo?bar:baz
)和巨大(且笨拙)的函数名列表,并具有各种命名约定; 您会发现Python更加清洁。 PHP的数组类型可以兼作简单列表和字典或哈希值; Python将两者分开。
Python还具有可变性和不变性的概念:例如,一个元组是一个不变的列表。 您创建了元组,之后便无法更改。 这个概念需要一点时间来适应,但这是避免错误的绝妙方法。 当然,更改元组的唯一方法是复制它,因此,如果您发现自己对不可变对象进行了许多更改,则需要重新考虑您的方法。
如前所述,Python中的缩进具有一定的意义:使用该语言的前几天,您将很难学到这一点。 您还可以使用基于关键字的参数创建函数和方法,这与您在PHP中看到的标准位置参数完全不同。 面向对象的纯粹主义者将享受Python的真正面向对象以及“一流”的类和函数。 如果您使用非英语语言,那么您会喜欢Python强大的国际化和Unicode支持。 您还将喜欢Python的多线程功能; 这是最初吸引我的功能之一。
综上所述,PHP和Python在许多方面彼此相似。 创建变量,循环,使用条件和创建函数将没有任何麻烦。 创建可重用模块甚至不会有太多麻烦。 两种语言的用户社区都很活跃和热情。 PHP的安装基数要大得多,但这与其在托管服务器上的普及以及对Web的关注有关,而不是其他方面。
OK-介绍材料就足够了。 让我们来谈谈案例。
使用Python
清单1展示了一个入门的基本Python脚本。
清单1.一个简单的Python脚本
for i in range(20):
print(i)
清单2显示了不可避免的结果。
清单2.清单1的结果
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
让我们先看几件事,然后再从变量开始。
变数
如您所见,没有特殊字符表示变量。 变量i
只是普通的i
,没什么特别的。 也没有特殊字符(如分号和花括号)表示代码块或语句结尾。 只是一个简单的冒号( :
)上for
线。 还要注意,缩进告诉Python什么属于for
循环。 例如,清单3中的代码在循环中的每个数字之后打印一个注释。
清单3.在每个循环中添加一条语句
for i in range(20):
print(i)
print('all done?')
相反,清单4中的代码在循环的末尾添加了一个注释。
清单4.在循环之后添加一条语句
for i in range(20):
print(i)
print('all done!')
现在,我第一次看这样的东西,我以为那是纯粹的疯狂。 什么? 相信换行符和缩进可以使我的代码不仅结构化而且可以运行? 相信我,过了一会儿,您会习惯的(尽管我不得不承认我一直在寻找那个分号来完成声明)。 如果您正在与其他开发人员合作处理Python项目,那么您将发现这种可读性是一个巨大的好处。 您将获得更少的机会,“现在这个聪明的家伙在这里尝试做什么?”
在PHP中,您可以使用=
运算符为变量分配一个值(请参见清单5)。 在Python中,您使用相同的运算符,只是说您要标记或指向一个值。 对我来说,这只是分配,所以我不用太担心行话。
清单5.创建变量
yorkie = 'Marlowe' #meet our Yorkie Marlowe!
mutt = 'Kafka' #meet our mutt Kafka
print(mutt) #prints Kafka
Python变量名称约定类似于PHP:创建变量名称时,只能使用字母,数字和下划线字符( _
)。 同样,变量名称的第一个字符不能是数字。 Python变量名称区分大小写,并且您不能使用某些Python关键字(例如if, else, while, def, or, and, not, in,
和is,
对于初学者)作为变量名。 没有什么大的惊喜。
Python允许您执行任意数量的基于字符串的操作。 清单6中的大多数操作对您来说都是熟悉的。
清单6.常见的基于字符串的操作
yorkie = 'Marlowe'
mutt = 'Kafka'
ylen = len(yorkie) #length of variable yorkie
print(ylen) #prints 7
print(len(yorkie)) #does the same thing
len(yorkie) #also does the same thing, print is implicit
print(yorkie.lower()) #lower cases the string
print(yorkie.strip('aeiou')) #removes vowels from end of string
print(mutt.split('f')) #splits "Kafka" into ['Ka', 'ka']
print(mutt.count('a')) #prints 2, the number of a's in string
yorkie.replace('a','4') #replace a's with 4's
有条件的
您已经知道如何使用for
循环。 现在让我们讨论条件。 您会发现条件与PHP中的条件几乎相同:您将可以访问清单7中所示的熟悉的if/else
-type结构。
清单7.一个简单的条件测试
yorkie = 'Marlowe'
mutt = 'Kafka'
if len(yorkie) > len(mutt):
print('The yorkie wins!')
else:
print('The mutt wins!')
您还可以使用if/elif/else
( elif
与PHP的elseif
等效)构建更复杂的条件测试,如清单8所示。
清单8.更复杂的条件测试
yorkie = 'Marlowe'
mutt = 'Kafka'
if len(yorkie) + len(mutt) > 15:
print('The yorkie and the mutt win!')
elif len(yorkie) + len(mutt) > 10:
print('Too close to tell!')
else:
print('Nobody wins!')
如您所知,到目前为止,这里没有什么太令人兴奋的。 这几乎就是您所期望的。 现在来看一下Python如何处理列表。 您会发现两种语言之间有相当大的差异。
清单
列表的一种常见类型称为元组,并且如上所述,它是不可变的。 一旦使用一系列值加载元组,就无法更改它。 元组可以包含数字,字符串,变量,甚至其他元组。 如您所料,元组的索引为0; 您可以使用-1
索引访问最后一项。 您还可以在元组上运行很多功能。
清单9.元组
items = (1, mutt, 'Honda', (1,2,3))
print items[1] #prints Kafka
print items[-1] #prints (1,2,3)
items2 = items[0:2] #items2 now contains (1, 'Kafka') thanks to slice operation
'Honda' in items #returns TRUE
len(items) #returns 4
items.index('Kafka') #returns 1, because second item matches this index location
列表就像元组,只是可变的。 创建它们后,您可以添加,减去和更新列表中的值。 使用方括号代替括号( ()
),如清单10所示。
清单10.清单
groceries = ['ham','spam','eggs']
len(groceries) #returns 3
print groceries[1] #prints spam
for x in groceries:
print x.upper() #prints HAM SPAM EGGS
groceries[2] = 'bacon'
groceries #list is now ['ham','spam','bacon']
groceries.append('eggs')
groceries #list is now ['ham', 'spam', 'bacon', 'eggs']
groceries.sort()
groceries #list is now ['bacon', 'eggs', 'ham', 'spam']
字典就像一个关联数组或哈希:它使用键值对来存储和检索信息。 但是使用花括号代替括号或括号。 像列表一样,字典也是可变的,这意味着您可以在其中添加,减去和更新值。
清单11.字典
colorvalues = {'red' : 1, 'blue' : 2, 'green' : 3, 'yellow' : 4, 'orange' : 5}
colorvalues #prints {'blue': 2, 'orange': 5, 'green': 3, 'yellow': 4, 'red': 1}
colorvalues['blue'] #prints 2
colorvalues.keys() #retrieves all keys as a list:
#['blue', 'orange', 'green', 'yellow', 'red']
colorvalues.pop('blue') #prints 2 and removes the blue key/value pair
colorvalues #after pop, we have:
#{'orange': 5, 'green': 3, 'yellow': 4, 'red': 1}
用Python创建一个简单的脚本
既然您已经接触过Python,那么让我们构建一个简单的Python脚本。 该脚本读取服务器的/ tmp目录中PHP会话文件数,然后将摘要报告写入日志文件。 在此脚本中,您将学习如何导入用于特定功能的模块,如何使用文件以及如何写入日志文件。 您还将设置许多变量来跟踪您收集的信息。
清单12显示了整个脚本。 打开一个编辑器,然后将代码粘贴到其中,并将文件另存为tmp.py在系统上的某个位置。 然后在该文件上运行chmod + x
使其可执行(假设您在UNIX®系统上)。
清单12. tmp.py
#!/usr/bin/python
import os
from time import strftime
stamp = strftime("%Y-%m-%d %H:%M:%S")
logfile = '/path/to/your/logfile.log'
path = '/path/to/tmp/directory/'
files = os.listdir(path)
bytes = 0
numfiles = 0
for f in files:
if f.startswith('sess_'):
info = os.stat(path + f)
numfiles += 1
bytes += info[6]
if numfiles > 1:
title = 'files'
else:
title = 'file'
string = stamp + " -- " + str(numfiles) + " session " \
+ title +", " + str(bytes) + " bytes\n"
file = open(logfile,"a")
file.writelines(string)
file.close()
在第一行,您会看到所谓的hash-bang line ,它标识了Python解释器的位置。 在我的系统上,它位于/ usr / bin / python。 根据您的系统需求进行调整。
接下来的两行将导入有助于您完成工作的特定模块。 鉴于脚本需要处理文件夹和文件,您需要导入os
模块,因为它包含各种功能和方法,可以帮助您列出文件,读取文件以及使用文件夹。 您还将写入日志文件,因此,为条目添加时间戳记是一个好主意-因此,需要使用时间函数。 您不需要所有这些,因此只需导入strftime
函数。
在接下来的六行中,您将设置变量。 第一个称为stamp
,包含一个日期字符串。 您可以使用strftime
函数创建具有特定格式的时间戳-在这种情况下,该时间戳看起来像2010-01-03 12:43:03
。
接下来,创建一个名为logfile
的变量,并放入logfile
的路径(该文件尚不存在),您将在其中实际存储日志文件消息。 为了简单起见,我将日志文件放在/ logs文件夹中,但是您可以将它们放在任何位置。 同样,您需要一个名为path
的变量,其中包含/ tmp目录的路径。 只要以斜杠( /
)结尾,它就可以是任何路径。
接下来的三个变量非常简单:一个files
列表,其中包含位于指定路径的所有文件和文件夹,以及两个变量,分别为bytes
和numfiles
。 这些变量都设置为0
; 脚本在处理文件时会增加这些值。
毕竟,脚本的核心才是:一个简单的for
循环,用于处理文件列表中的每个文件。 每次循环时,脚本都会评估文件名。 如果以sess_开头,则脚本在文件上运行os.stat()
以提取有关文件的数据(例如创建时间,修改时间和字节大小),增加numfiles
计数器,并增加此文件的字节数到运行总计。
循环完成运行后,脚本将检查numfiles
变量是否包含大于1的值。如果是,它将为files
设置一个名为title
的新变量。 否则, title
设置为单数形式的file
。
脚本的最后一部分很简单:创建一个名为string
的最终变量,并在其中放置一行数据,该数据行以图章开头,并以numfiles
(转换为字符串)和bytes(也转换为一个字符串)。 注意连续字符( \
); 它允许代码运行到下一行。 了解可读性是一个好技巧。
然后,您可以使用open()
函数以追加模式打开日志文件(毕竟您想继续向该文件添加行), writelines()
函数将字符串添加至日志文件,以及close()
功能关闭文件。
现在,您已经创建了一个简单的Python脚本,可以执行任何操作。 例如,您可以将cron
作业设置为每小时运行一次此脚本,以帮助您跟踪全天使用多少PHP会话。 您还可以使用jQuery或其他JavaScript框架使用Ajax将此脚本连接起来,以为您提供日志文件供稿(如果是,则需要使用print
命令来返回数据)。
结论
作为开发人员,我们花费大量时间投资于有关特定语言和方法的知识。 有时,这样做会引发关于一种语言优于另一种语言的争论。 我参加了许多辩论,你们中的一些人也参加了。 我必须承认,这些讨论中的大多数都趋于落入同一个旧车辙中-“您可以做的我可以做得更好” –这没有任何用处。
但是,一旦您开始仔细研究另一种语言,就会发现大多数语言都有类似的工具,理念和方法。 学习您的第一语言可能很困难,但是如果您将所学知识应用到另一种语言中,则可以使学习体验变得更加轻松。 即使您并不真正使用第二语言,也可以增加接触点的知识和方法,以提高自己的技巧。
幸运的是,本文为您提供了一些有关Python的见解。 我希望您会继续学习并继续研究这种出色的语言。 您可能永远都不会离开PHP的世界(毕竟,这可能是摆在桌上的东西),但是继续学习永远不会有伤害。
翻译自: https://www.ibm.com/developerworks/opensource/library/os-php-pythonbasics/index.html