PHP和Python都是解释性语言,用过PHP一般再学Python就比较容易,毕竟很多概念都一样。
当然,反过来也一样,会Python再入手PHP,也很简答。
不过如果要使用框架,那就得稍微多用些力气。
这里我们以语言本身为主,就暂不讨论框架。
我是先用PHP,再学Python,所以对他们的用途也算清楚。
PHP以WEB服务起家,而且多年来都是以这个为重点,所以PHP在WEB方面是个强项。
Linux + Nginx/Aapche + MySQL + PHP环境(俗称LNMP/LAMP)以部署简单、性能高效著称,是各个服务器厂商的必装套件。
可以这样说,PHP是世界上最好的WEB后端语言。
Python在WEB上比PHP起步晚,这方面略逊一筹。
不过Python简单易用,所以用途广泛,运维、计算科学、人工智能、WEB几乎各个计算机领域都有它的存在。
特别是这几年人工智能的崛起,Python更是如日冲天。
趁着这股热劲,我们也花个10分钟,把它学到手吧。
我们以具体的程序来展示PHP和Python之间的区别,这比直接用文字直观些。
起步最佳程序是hello world,我们就从hello Word程序开始。
如下,左边是helloword.php,右边是helloworld.py。
<?php function helloWorld() { $a = 'Hello World'; echo $a; } helloWorld();
def hello_world(): a = 'Hello World' print(a) hello_world()
用 php helloworld.php和 python helloworld.py分别执行这两个文件,打印结果是一样的。
字符串是所有程序中非常重要的特性,PHP和Python处理字符串的方式相差很大。
PHP以函数处理字符串,Python中字符串是一个对象。
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)
$a = 'PHP to Python'; echo $a; # 输出完整字符串 echo $a{1}; # 输出:H echo substr($a, 4, 2); # 输出:to echo substr($a, 4); # 输出:to Python echo substr($a, 0, 6); # 输出:PHP to echo str_repeat($a, 2); # 输出:PHP to PythonPHP to Python echo strpos($a, 'PHP') !== false; # 输出:true echo strpos($a, 'Java') === false; # 输出:true
a = 'PHP to Python' print(a) # 输出完整字符串 print(a[1]) # 输出:H,通过索引获取字符 print(a[4:6]) # 输出:to,截取字符串 print(a[4:]) # 输出:to Python,截取字符串 print(a[:6]) # 输出:PHP to,截取字符串 print(a*2) # 输出:PHP to PythonPHP to Python,重复字符串 print('PHP' in a) # 输出:true,判断字符串包含 print('Java' not in a) # 输出:true,判断字符串不包含
说明已经写在注释上了。
对于截取字符串,PHP的函数是offset加length,Python是start加end,但不包括end项。
还是以上面的程序为例,我们加上注释。
<?php /** * 这是PHP的多行注释 */ function helloWorld() { $a = 'Hello World'; // 这是PHP的单行注释 echo $a; } # 这是PHP的另外一种单行注释 helloWorld();
def hello_world(): """ 这是Python的多行注释,函数注释写在函数体内 :return: """ a = 'Hello World' # 这是Python的单行注释 print(a) # 同样是单行注释 hello_world()
具体区别请看代码。
PHP中的序列类型只有数组。
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') # 根据键名删除元素
可以看到,元组、列表、字典的查询方式都是用中括号:[]
实际使用时,我们还可以转换类型:
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()
class Person: # 类属性,所有方法都可以调用 age = 100 # 构造函数 # 同时定义一个name的类属性,并赋值,所有方法都可以调用 def __init__(self, name): self.name = name # self代表类示例,相当与PHP中的$this def get_name(self): return self.name # 在定义类方法时,必须手动在第一个参数传入类实例, # 名称可以是self,如上一个方法,也可以是别的,如下, # 但是一般建议用self def get_age(this): return this.age class User(Person): # 双下划线开头,private属性,仅类内部可以调用 __country = 'China' # 单下划线开头,protected属性 _address = 'My City No 1' """ User类继承自Person类 用 super().__init__() 方式调用父类构造函数 """ def __init__(self, name, url): super().__init__(name) self.url = url def get_url(self): return self.url def get_country(self): return self.__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())
持续更新中...