ptyhon 基础语法学习(对比php)

作者:come11234日期:10/2/2025

为了让您最直观地看到区别,我们来看一段几乎每个程序员都写过的代码:遍历一个集合(PHP里的数组,Python里的列表),然后根据条件打印内容。

这能帮我们一次性看到 变量、循环和条件语句 的核心差异。

这是您非常熟悉的 PHP 版本:

1<?php
2$users = [
3    ["name" => "Alice", "age" => 30],
4    ["name" => "Bob", "age" => 17]
5];
6
7foreach ($users as $user) {
8    if ($user["age"] >= 18) {
9        echo $user["name"] . " is an adult.\n";
10    } else {
11        echo $user["name"] . " is a minor.\n";
12    }
13}
14?>
15

下面是功能完全一样的 Python 版本:

1users = [
2    {"name": "Alice", "age": 30},
3    {"name": "Bob", "age": 17}
4]
5
6for user in users:
7    if user["age"] >= 18:
8        print(f"{user['name']} is an adult.")
9    else:
10        print(f"{user['name']} is a minor.")
11

除了没有了 $ 符号和行尾的分号 ;,还有一个最关键的区别,它决定了代码块的范围(比如 ifelse 里面的内容)。

在 PHP 中我们用大括号 {},您能看出 Python 是用什么来替代的吗?

没关系,这个区别非常关键,也是 Python 最具特色的地方之一。

请您再仔细看一下 Python 代码里 ifelse 下面的那几行 print。您有没有发现它们前面都有一些固定的空格

在 Python 中,我们不用 {} 来包围代码块。代码的缩进(indentation) 就决定了它的层级关系。所有缩进相同的连续代码行,都属于同一个代码块。

这就是 Python 语法强制要求的,它使得代码天生就非常整洁、易读。

所以,if user["age"] >= 18: 后面的 print(...) 因为有缩进,所以它属于 if 的一部分。这下清楚了吗?这个概念对写 Python 至关重要。

=========================函数
是的,function 关键字。

在 Python 中,我们使用 def 关键字,是 “define” 的缩写。

我们再来并排看一下,定义一个简单的函数,接收用户信息并返回一句话。

PHP 版本:

1<?php
2function format_user_info($user) {
3    // 使用 . 来拼接字符串
4    return $user["name"] . " is " . $user["age"] . " years old.";
5}
6
7$user_data = ["name" => "Alice", "age" => 30];
8echo format_user_info($user_data);
9?>
10

Python 版本:

1def format_user_info(user):
2    # 使用 f-string 来格式化字符串,更简洁
3    return f"{user['name']} is {user['age']} years old."
4
5user_data = {"name": "Alice", "age": 30}
6print(format_user_info(user_data))
7

您看,除了 function 变成了 def,函数的结构是不是很相似?我们又一次看到了用缩进代替大括号 {}


既然函数这么相似,那定义一个 类 (Class) 呢?这对于有经验的开发者来说非常重要。

在 PHP 中,您用什么关键字来定义一个类?

正是 class 关键字。

好消息是,在 Python 里,关键字完全一样,也是 class

不过,内部的写法有些不同。我们来看一个简单的 User 类。

PHP 版本:

1<?php
2class User {
3    public $name;
4    public $age;
5
6    public function __construct($name, $age) {
7        $this->name = $name;
8        $this->age = $age;
9    }
10
11    public function introduce() {
12        return "Hi, I'm " . $this->name . ".";
13    }
14}
15
16// 创建实例 (instantiation)
17$user1 = new User("Alice", 30);
18echo $user1->introduce();
19?>
20

Python 版本:

1class User:
2    # 构造函数 (constructor)
3    def __init__(self, name, age):
4        self.name = name
5        self.age = age
6
7    def introduce(self):
8        return f"Hi, I'm {self.name}."
9
10# 创建实例
11user1 = User("Alice", 30)
12print(user1.introduce())
13

整体结构很像,但有几个关键区别:

  1. 构造函数: PHP 用 __construct(),Python 用 __init__()
  2. 实例化: Python 创建对象时,直接 User(...),不需要 new 关键字。
  3. self 关键字: 这是最重要的一个区别。在 PHP 中,您用 $this 来引用对象实例本身。

根据上面的代码,您觉得 Python 里的 self 关键字,是用来代替 PHP 里的哪个变量的?

答对了!完全正确。

Python 里的 self 就等同于 PHP 里的 $this。您只要记住,在 Python 类的每个方法里,都必须把 self 作为第一个参数写出来。


阶段性小结 📝

非常棒!我们已经快速地过了一遍 Python 最核心、也是和 PHP 差异最大的几个地方:

  • 语法:$;,用缩进代替 {}
  • 数据结构: list (索引数组) 和 dict (关联数组)。
  • 函数:def 定义,用 len() 获取长度。
  • 类: 关键字是 class,构造函数是 __init__,并且用 self 代替 $this

掌握了这些,您已经可以阅读和编写简单的 Python 代码了!

接下来,我们进入学习计划的第三步:环境和包管理

在 PHP 开发中,您用 Composer 来管理项目依赖(比如 Guzzle、Monolog 等库)。Python 也有一个完全对应的工具,叫做 pip

为了帮您建立联系,请问您用 Composer 添加一个新的库时,最常用的命令是什么?

很接近了!通常我们添加一个新包用 composer require a/package,而 composer install 是用来安装 composer.json 里已经定义好的所有依赖。

这个思路完全正确。

在 Python 的世界里,这个命令对应的是 pip install

举个例子:

  • 在 PHP 中安装一个 HTTP 请求库 Guzzle: composer require guzzlehttp/guzzle
  • 在 Python 中安装最流行的 HTTP 请求库 Requests: pip install requests

是不是很简单?pip 就是您的新 “Composer”。


说到包管理,Python 社区还有一个非常重要的最佳实践,就是 虚拟环境 (Virtual Environment)

简单来说,虚拟环境就是为您的每一个项目创建一个“隔离”的 Python 环境。项目 A 和项目 B 可以拥有完全不同版本的依赖包,互不干扰。这就避免了 PHP 开发中有时会遇到的“依赖地狱”问题。

Python 内置了一个创建虚拟环境的工具,叫做 venv

根据这个描述,您觉得使用 venv 的主要好处是什么?

一语中的!核心好处就是 环境隔离

这保证了您的项目 A 和项目 B 之间不会有依赖冲突,让项目管理变得非常干净。

使用 venv 通常只有两步:

  1. 创建环境: 在您的项目文件夹下,运行 python -m venv venv。这会创建一个名为 venv 的文件夹,里面包含了项目所需的一个独立的 Python 环境。
  2. 激活环境:
    • 在 Windows 上: venv\Scripts\activate
    • 在 Mac/Linux 上: source venv/bin/activate
      激活后,您会看到命令行提示符前面多了 (venv) 的字样,表示您现在处于这个隔离环境中。之后您使用的所有 pip 命令都只会作用于当前环境。

第四步:动手写个小项目

我们已经涵盖了语法、概念和工具,现在是时候把它们串起来了!这是让知识真正属于您的最好方式。

作为一个有经验的 web 开发者,您对 API 应该非常熟悉。我们不如就写一个简单的小脚本,功能是:从一个公开的 API 获取一条随机的编程笑话并打印出来

这个小项目能让我们练习:

  • 使用 pip 安装 requests 库。
  • 编写一个 Python 函数。
  • 发送一个 HTTP GET 请求。
  • 处理返回的 JSON 数据 (也就是 Python 的字典)。

基数数据类型

Python 的数据类型很丰富,为了让咱们看得更清楚,可以把它们分成几个大类。您看这样划分怎么样?

  1. 基础与数值类型 (Basic & Numeric Types): 整数、浮点数、字符串等。
  2. 序列类型 (Sequence Types): 有序的集合,比如列表 (list) 和元组 (tuple)。
  3. 映射类型 (Mapping Type): 键值对集合,也就是字典 (dict)。
  4. 集合类型 (Set Types): 无序且元素唯一的特殊集合。
  5. 特殊类型 (Special Types): 布尔值 (bool) 和 None

这个分类听起来清晰吗?我们从哪一类开始对比呢?我个人建议可以从最熟悉的 第一类:基础与数值类型 开始。

好的,我们从最基础的开始。

在 PHP 和 Python 中,最基础的几种类型几乎是一一对应的,但用法上有一些细微但重要的差别。

我们先看 数值 (Numeric) 类型。

类型PythonPHP对比和区别
整数intint功能基本相同。但 Python 的整数没有大小限制(只受内存限制),而 PHP 的整数有最大值 (PHP_INT_MAX),超出后会自动转为 float。
浮点数floatfloat两者几乎完全一样,都用来表示小数或科学计数法。

整数的区别是一个有趣的技术细节,但在日常开发中,您感受最深的会是字符串 (String) 的不同。

在 PHP 中,您可以用单引号 '...' 或双引号 "..." 来定义字符串。这两者最主要的区别是什么?

您的意思是,双引号 " 里的变量会被解析(替换成变量的值),而单引号 ' 里的内容会原样输出,对吗?

如果是这个意思,那您完全说对了!这正是 PHP 的核心区别。

现在我们来看 Python,这一点上它有很大不同:

  • 在 Python 中,单引号 '...' 和双引号 "..." 是完全一样的!它们都不会解析变量。

那么 Python 怎么实现类似 PHP 双引号的功能呢?答案是使用一种特殊的字符串,叫做 f-string

看下面的对比:

PHP:

1$name = "Alice";
2echo "Hello, $name";   // 输出: Hello, Alice
3echo 'Hello, $name';   // 输出: Hello, $name
4

Python:

1name = "Alice"
2# 在引号前加上 f,就会解析 {} 里的变量
3print(f"Hello, {name}")  # 输出: Hello, Alice
4
5# 普通的字符串(无论单双引号)都不会解析
6print("Hello, {name}")   # 输出: Hello, {name}
7print('Hello, {name}')   # 输出: Hello, {name}
8

总结一下:在现代 Python 中,需要格式化字符串时,就用 f-string。这是最推荐、最简洁的方式。


基础类型我们已经看完了。接下来,我们看看计划中的第二类:序列类型 (Sequence Types)

我们之前提到过,PHP 的 array 非常万能,但 Python 把它的功能拆分了。您还记得我们用什么来表示一个有序的、像 PHP 索引数组一样的集合吗?

中括号 [],完全正确!

用中括号 [] 定义的就是 列表 (list)。它是 Python 中最常用的数据结构之一。

我们来看一下它和 PHP 数组的对比:

在这里插入图片描述

到目前为止,list 看起来只是 PHP 索引数组换了个名字。但 Python 还有一个和 list 非常像的兄弟,叫做 元组 (tuple)

元组的定义和列表只有一个小区别:它用的是 圆括号 ()
my_tuple = ("apple", "banana")

元组和列表最大的区别在于:元组是不可变的 (immutable)。一旦创建,您就不能再添加、删除或修改它的任何元素。

根据这个描述,如果您的程序需要一个永远不变的配置项列表,比如一周的星期名称 ("Monday", "Tuesday", ...),您觉得用列表 (list) 还是元组 (tuple) 更安全、更合适呢?

完全正确!

元组 (tuple) 更合适。因为它 不可变 的特性保证了这份数据不会在程序的任何地方被意外地修改,代码更安全、更可预测。

简单总结一下序列类型:

  • 列表 list: 可变的、有序的集合。最常用。
  • 元组 tuple: 不可变的、有序的集合。用于保护数据不被改变。

好了,基础类型和序列类型我们都看完了。现在是计划中的第三类:映射类型 (Mapping Type)

在 Python 中,这个类别只有一个成员,但它非常强大,我们之前已经详细讨论过它了。

您还记得我们把 Python 中类似 PHP 关联数组、用于存储键值对的数据类型称为什么吗?

没关系,这个词很容易忘记!

根据我们之前的对话,我提到过:

在 Python 里,我们称之为 字典 (dictionary),简称 dict

所以,Python 版本的关联数组就是字典 (dictionary)

我们来系统地对比一下:

在这里插入图片描述

到这里,Python 中最核心的三种数据结构您已经掌握了:列表 list、元组 tuple、字典 dict。这三种能覆盖您 90% 的日常开发需求。

接下来,我们看一个 PHP 中没有,但 Python 里很有用的类型。

在 PHP 中,如果您想得到一个数组里所有不重复的值,您会用哪个函数?

完全正确,就是 array_unique() 函数。

您看,在 PHP 中,您需要调用一个函数来处理一个数组,才能得到唯一值。

而在 Python 中,有一个专门为此设计的数据类型,叫做 集合 (set)

它的用法非常简单。您只需要把列表(list)转换成集合(set),重复的元素就自动消失了。

1# 1. 我们有一个包含重复元素的列表
2numbers_list = [1, 2, 2, 3, 1, 4]
3
4# 2. 使用 set() 将列表转换为集合
5unique_numbers_set = set(numbers_list)
6
7# 3. 打印结果
8print(unique_numbers_set)
9# 输出: {1, 2, 3, 4}
10

集合 (set) 的特点:

  • 元素唯一:自动去重,这是它最核心的功能。
  • 无序:里面的元素没有固定的顺序。
  • 查找速度极快:判断一个元素是否在集合中,比在长列表中查找要快得多。

我们已经看完了四个大类。现在是最后一类,也是最简单的一类:特殊类型

这包括布尔值 (bool) 和 None

我们先说布尔值。在 PHP 中,当您写 if ($variable) 时,除了 false 本身,还有哪些值会被当作 false 来处理?

您说得非常对!0 和空字符串 '' 都会被当作 false

在 PHP 中,像 0, '', [] (空数组), null 等都会在布尔上下文中被视为 false。这叫做“假值”(falsy values)。

Python 也有完全一样的概念!

PythonPHP
Falsefalse
0, 0.00, 0.0
"" (空字符串)"" (空字符串)
[] (空列表), () (空元组), {} (空字典), set() (空集合)[] (空数组)

您看,规则几乎是一样的:任何表示“空”或者“零”的东西,在 if 语句里都会被当作 false


最后,我们来看 PHP 中的 null

null 表示一个变量没有任何值。Python 中有一个完全等价的关键字,拼写略有不同,叫做 None (首字母大写)。

PythonPHP
Nonenull

Nonenull 的用途和意义是完全相同的。


最终总结:数据类型速查表

非常棒!我们已经系统地对比了 Python 和 PHP 的所有主要数据类型。

分类Python 类型对应 PHP 概念关键点
基础int, float, strint, float, stringPython 字符串格式化用 f-string
序列list, tuple索引数组list 可变 (用 []),tuple 不可变 (用 ())
映射dict关联数组键值对集合 (用 {})
集合setarray_unique() 的结果元素唯一无序
特殊bool, Nonebool, nullFalse 和 None (首字母大写)

这份表格可以作为您未来的速查手册。您已经为您深厚的 PHP 知识,找到了在 Python 世界里的完美映射。


ptyhon 基础语法学习(对比php)》 是转载文章,点击查看原文


相关推荐


音视频编解码全流程之用Extractor后Decodec
Everbrilliant8910/1/2025

本文介绍了音视频编解码流程中从媒体文件提取数据包后进行解码的两种实现方式:FFmpeg和MediaCodec。在FFmpeg部分,详细说明了交叉编译、数据包提取、解码器查找和分配、数据包解码等步骤,并提供了完整的代码实现。在MediaCodec部分,重点讲解了Extractor初始化、轨道选择、解码器初始化以及解码过程,同样包含详细代码示例。文章还对比了两种解码流程的异同,并展示了实际效果。所有代码均可在作者GitHub项目中查看。该系列文章为音视频开发提供了完整的流程参考,适合开发者学习音视频编解码技术。


【自动驾驶】自动驾驶概述 ⑤ ( 自动驾驶硬件概述 | 车载计算单元 IPC | 车辆线控系统 )
韩曙亮9/30/2025

一、车载计算单元 IPC1、车载计算单元 IPC 简介2、高性能计算3、高安全冗余4、高环境适应性二、车辆线控系统1、自动驾驶线控系统2、线控转向 ( Steer-by-Wire )3、线控制动 ( Brake-by-Wire )4、线控驱动 ( Throttle-by-Wire )5、线控换挡 ( Shift-by-Wire )6、线控悬挂 ( Suspension-by-Wire )7、线控系统举例说明


Excel转PDF不分页
Bella_chene2025/10/2

将Excel转成PDF后,会发现存在分页的现象,理想是希望将一整个表格按实际情况缩放显示到PDF的一页上去 操作办法:打开excel表格,ctrl+P打开打印页面,点击页面设置,选择“将工作表调整为一页” 然后在右侧就可以看到效果,点击保存就可以了


[linux仓库]深入解析Linux动态链接与动态库加载:理解背后的原理与技巧
egoist20232025/10/2

🌟 各位看官好,我是egoist2023! 🌍 Linux == Linux is not Unix ! 🚀 今天来学习Linux的指令知识,并学会灵活使用这些指令。 👍 如果觉得这篇文章有帮助,欢迎您一键三连,分享更多人哦! 目录 进程如何看到动态库 进程间如何共享库 动态链接 编译器对可执行程序动手脚 动态库相对地址  程序如何和库具体映射 程序怎么进行库调用 全局偏移量表GOT 库间依赖(看看即可) 总结 进程如何看到动态库


DeepSeek V3.1-Terminus、阿里 Qwen3-Max、ChatGPT Pulse 同周登场!| AI Weekly 9.22-9.28
AI信息Gap2025/10/3

卷,卷起来了! 📢 本周 AI 快讯 | 1 分钟速览🚀 1️⃣ 🚀 DeepSeek 发布 V3.1-Terminus :Agent 性能提升 28%,HLE 测试跃升全球第三,仅次于 Grok 4 和 GPT-5,SimpleQA 准确率达 96.8%。 2️⃣ 💰 阿里云栖大会七连发 :3800 亿 AI 基建投资起步,万亿参数 Qwen3-Max 对标 GPT-5,AIME 25 和 HMMT 数学测试满分 100 分。 3️⃣ 🖥️ Kimi 推出 OK Compu


UNIX下C语言编程与实践16-UNIX 磁盘空间划分:引导块、超级块、i 节点区、数据区的功能解析
迎風吹頭髮2025/10/4

一、UNIX 磁盘空间划分的核心逻辑:为何分为四个区域? UNIX 文件系统在格式化时,会将磁盘分区(如 /dev/sda1)划分为引导块(Boot Block)、超级块(Super Block)、i 节点区(Inode Area)、数据区(Data Area)四个连续的区域。这种划分并非随意设计,而是为了实现“系统启动-文件系统管理-数据存储”的完整功能链路,确保磁盘空间的有序管理和高效访问。 核心定位:四个区域各司其职且相互依赖——引导块负责“启动系统”,超级块负责“管理文件系统全局信息


Nginx 配置负载均衡(详细版)
1加1等于2025/10/6

本文详细介绍关于Nginx 配置负载均衡,包括配置文件结构、多种负载均衡策略、如何修改均衡策略以及其他一些重要的配置。 本文目录 一、、Nginx 配置负载均衡1. 配置文件结构 二、Nginx 负载均衡策略1. 轮询(`默认策略`)2. 加权轮询3. IP 哈希4. 最少连接 三、修改负载均衡策略四、Nginx 负载均衡其他配置1. 健康检查2. 会话保持3. 超时设置 一、、Nginx 配置负载均衡 1. 配置文件结构 Nginx 的负载均衡配置主要


Kubernetes核心技术与集群部署项目
企鹅侠客2025/10/7

从集群搭建到核心功能应用的完整流程,内容涵盖集群部署、核心组件、资源管理、安全机制、持久化、监控与应用交付等关键技术。首先介绍 Kubernetes 的架构与特性,深入讲解 kubeadm 与二进制两种集群搭建方式,包括 etcd 集群部署、Master 与 Node 组件安装、证书签发及高可用集群实现。核心技术部分系统解析 Pod 的运行机制、调度策略、健康检查与资源限制,讲解 Deployment、StatefulSet、DaemonSet、Job 等控制器的应用场景。配置管理方面介绍 Co


前端路由的秘密:手写一个迷你路由,看懂Hash和History的较量
良山有风来2025/10/9

你是不是也遇到过这样的场景?开发单页面应用时,页面跳转后刷新一下就404,或者URL里带着难看的#号,被产品经理吐槽不够优雅? 别担心,今天我就带你彻底搞懂前端路由的两种模式,手把手教你实现一个迷你路由,并告诉你什么场景该用哪种方案。 读完本文,你能获得一套完整的前端路由知识体系,从原理到实战,再到生产环境配置,一次性全搞定! 为什么需要前端路由? 想象一下,你正在开发一个后台管理系统。传统做法是每个页面都对应一个HTML文件,切换页面就要重新加载,体验特别差。 而前端路由让你可以在一个页面内实


汽车软件开发的质量和安全管理流程
NewCarRen2025/10/10

摘要 软件开发流程是智能车辆(联网车辆和自动驾驶车辆)的核心,必须精心管理。自动化与联网功能的开发分别通过功能安全和网络安全开发流程实现,且需遵循相关标准,这些标准规定了流程、最佳实践、危害、威胁及管理策略。通过改进软件开发流程,智能车辆的人体工程学性能将得到提升。本文阐述了如何通过软件开发来管理实现自动化与联网功能的流程,以及是否可能改变管理团队的策略与软件开发流程。 1、引言 智能车辆是一种能够从周围环境中获取信息,并对信息进行处理,从而实现自主安全行驶且不造成任何伤害的车辆。此外,智

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0