10分钟从PHP到Python
PHP和Python都是解释性语言,用过PHP一般再学Python就比较容易,毕竟很多概念都一样。
当然,反过来也一样,会Python再入手PHP,也很简答。
不过如果要使用框架,那就得稍微多用些力气。
这里我们以语言本身为主,就暂不讨论框架。
1用途
我是先用PHP,再学Python,所以对他们的用途也算清楚。
PHP以WEB服务起家,而且多年来都是以这个为重点,所以PHP在WEB方面是个强项。
Linux+Nginx/Aapche+MySQL+PHP环境(俗称LNMP/LAMP)以部署简单、性能高效著称,是各个服务器厂商的必装套件。
可以这样说,PHP是世界上最好的WEB后端语言。
Python在WEB上比PHP起步晚,这方面略逊一筹。
不过Python简单易用,所以用途广泛,运维、计算科学、人工智能、WEB几乎各个计算机领域都有它的存在。
特别是这几年人工智能的崛起,Python更是如日冲天。
趁着这股热劲,我们也花个10分钟,把它学到手吧。
2语法
我们以具体的程序来展示PHP和Python之间的区别,这比直接用文字直观些。
起步最佳程序是helloworld,我们就从helloWord程序开始。
如下,左边是helloword.php,右边是helloworld.py。
<?php functionhelloWorld() { $a='HelloWorld'; echo$a; } helloWorld();
defhello_world(): a='HelloWorld' print(a) hello_world()
用phphelloworld.php和pythonhelloworld.py分别执行这两个文件,打印结果是一样的。
- PHP文件必须以<?php开头,Python不需要
- PHP用function声明函数,Python用def
- PHP语句必须以分号;结尾,Python不需要以;分号结尾,当然用;结尾也可以,一般在一行内有多个语句的时候用,但是不建议这样写。
- PHP用大括号{}表示一个程序块,Python用4个空格的缩进表示一个程序块
- PHP变量以$符号开头,Python变量不需要$符号开头
- (非强制)PHP依据PSR格式规范,方法名和变量名以小驼峰命名,Python建议函数名用小写,并以下划线分割,函数内变量用小写,函数外变量大小写均可。
3字符串
字符串是所有程序中非常重要的特性,PHP和Python处理字符串的方式相差很大。
PHP以函数处理字符串,Python中字符串是一个对象。
3.1字符串声明和使用
mb_internal_encoding("UTF-8"); $a='谁不会休息,谁就不会工作。'; $b='--列宁'; echo$a.$b; $c='--杜牧'; $d="清明时节雨纷纷, 路上行人欲断魂。 借问酒家何处有? 牧童遥指杏花村。$c"; echo$d;
#coding:utf-8 a='谁不会休息,谁就不会工作。' b='--列宁' print(a+b) c='--杜牧' d="""清明时节雨纷纷, 路上行人欲断魂。 借问酒家何处有? 牧童遥指杏花村。%s"""%c print(d)
- PHP文件内字符串一般以文件编码格式为准,Python一般需要在文件头声明,如上的 #coding:utf-8,所有字符串以utf-8格式编码。PHP也可以用mb_internal_encoding("UTF-8");方法实现同样效果。
- PHP中单行和多行字符串用单引号和双引号都可以,Python中单行字符串用单引号或双引号,多行字符串用三个双引号括住。
- PHP中双引号内可以引用变量,Python中不可以,须用%或format()方法格式化。
- 字符串拼接PHP用点号.,Python用加号+。PHP中如果用点号拼接字符串和整型,整型自动转换为字符串类型再拼接,Python中则不能拼接字符串和整型,必须强制将整型转换为字符串类型后再用+拼接,否则程序出错。
3.2字符串处理
$a='PHPtoPython'; echo$a;#输出完整字符串 echo$a{1};#输出:H echosubstr($a,4,2);#输出:to echosubstr($a,4);#输出:toPython echosubstr($a,0,6);#输出:PHPto echostr_repeat($a,2);#输出:PHPtoPythonPHPtoPython echostrpos($a,'PHP')!==false;#输出:true echostrpos($a,'Java')===false;#输出:true
a='PHPtoPython' print(a)#输出完整字符串 print(a[1])#输出:H,通过索引获取字符 print(a[4:6])#输出:to,截取字符串 print(a[4:])#输出:toPython,截取字符串 print(a[:6])#输出:PHPto,截取字符串 print(a*2)#输出:PHPtoPythonPHPtoPython,重复字符串 print('PHP'ina)#输出:true,判断字符串包含 print('Java'notina)#输出:true,判断字符串不包含
说明已经写在注释上了。
对于截取字符串,PHP的函数是offset加length,Python是start加end,但不包括end项。
4注释
还是以上面的程序为例,我们加上注释。
<?php /** *这是PHP的多行注释 */ functionhelloWorld() { $a='HelloWorld'; //这是PHP的单行注释 echo$a; } #这是PHP的另外一种单行注释 helloWorld();
defhello_world(): """ 这是Python的多行注释,函数注释写在函数体内 :return: """ a='HelloWorld' #这是Python的单行注释 print(a) #同样是单行注释 hello_world()
具体区别请看代码。
5数组
PHP中的序列类型只有数组。
5.1元组、列表和字典
Python中分为3种:元组(tuple)、列表(list)和字典(dictionary)。
a=(1,2,3,'hello') b=[1,2,3,'hello'] c={'name':'gary','url':'www.awaimai.com'}
第一个是元组,元组是不能更改的类型,只能查询,不能增改删元素。
a[3]#查找第4个元素,返回hello字符串
为了和运算符中的括号区别,单个元组也需要在元素后面加一个逗号,如:a=(1,)。
第二行是列表,类似PHP中的数字索引数组,可以增查改删元素如:
b.append(10)#在列表最后增加元素10,列表变为:[1,2,3,'hello',10] b[0]#查找第1个元素,返回数字1 b[2]=10#修改第3个元素为10,列表变为:[1,2,10,'hello'] b.pop()#删除最后一个元素并返回它的值,用pop(0)可以删除第1个元素
第三行是字典,类似PHP中的字符串下标数组,可以增查改删元素:
c['country']='china'#增加一个减值对应元素 c['url']#根据键名查找值,返回字符串www.awaimai.com c['url']='awaimai.com'#修改值 c.pop('name')#根据键名删除元素
可以看到,元组、列表、字典的查询方式都是用中括号:[]
5.2类型转换
实际使用时,我们还可以转换类型:
list(a)#元组转换成列表,可以,返回:[1,2,3,'hello'] dict(a)#元组转换成字典,不可以,出错 tuple(b)#列表转换成元组,可以,返回:(1,2,3,'hello') dict(b)#列表转换成字典,不可以,出错 tuple(c)#字典转换成元组,可以,返回:('url','name') list(c)#字典转换成列表,可以,返回:['url','name'],等同于c.keys() #要返回值列表,请用c.values()
6类和对象
classPerson: #类属性,所有方法都可以调用 age=100 #构造函数 #同时定义一个name的类属性,并赋值,所有方法都可以调用 def__init__(self,name): self.name=name #self代表类示例,相当与PHP中的$this defget_name(self): returnself.name #在定义类方法时,必须手动在第一个参数传入类实例, #名称可以是self,如上一个方法,也可以是别的,如下, #但是一般建议用self defget_age(this): returnthis.age classUser(Person): #双下划线开头,private属性,仅类内部可以调用 __country='China' #单下划线开头,protected属性 _address='MyCityNo1' """ User类继承自Person类 用super().__init__()方式调用父类构造函数 """ def__init__(self,name,url): super().__init__(name) self.url=url defget_url(self): returnself.url defget_country(self): returnself.__country #实例化一个类,并调用其属性和方法 user=User('gary','www.awiamai.com') print(user.name,user.url,user.age) print(user.get_name(),user.get_url(),user.get_age(),user.get_country())
持续更新中...