Python学习——安装配置python环境+入门
本篇中我们将开始一个新内容的学习:Python
相比于C++那种强调性能与规范的开发模式,python则是一个强调开发效率的语言。作为解释形语言的一部分,尽管它并没有C++那样极致的性能,但是作为一门胶水语言,python具有很低的学习成本和很高的开发效率,在web、脚本、数据分析、AI领域广泛使用。
而下图所示的就是最新的2025年8月常用编程语言排行榜。
接下来就让我们一起来学习这门编程语言吧!。
相关代码已经上传至作者的个人gitee:楼田莉子/Python 学习喜欢请点个赞谢谢。
python的介绍
python的来源
吉多·范罗苏姆(Guido van Rossum) 是一个荷兰程序员(人称龟叔, 名字前三个字母是 Gui)
。龟叔在 1989 年圣诞节的时候(当时 33 岁), 因为在家里待着无聊, 为了打发时间, 开始了 Python 的开发.第一个正式版本发布于 1991 年.
python的应用
-
数据科学与人工智能(AI)
-
为什么? 拥有无比强大的生态库(NumPy, Pandas, Matplotlib)。在机器学习和深度学习领域,Scikit-learn, TensorFlow, PyTorch 等框架几乎成为了行业标准。
-
做什么? 数据分析、预测模型、图像识别、自然语言处理(ChatGPT就大量使用Python)、推荐系统等。
-
-
Web开发
-
为什么? 拥有Django(功能全面,好比“开箱即用的航母”)和Flask(轻量灵活,好比“灵活的乐高积木”)等优秀框架。
-
做什么? 快速构建从个人博客到大型电商平台的各种网站和后端API服务。
-
-
自动化与运维
-
为什么? 语法简单,编写速度快,被誉为“胶水语言”。
-
做什么? 写一个简单的脚本,就能自动处理Excel表格、批量重命名文件、自动发送邮件、管理服务器等,将人们从重复性劳动中解放出来。
-
-
网络爬虫
-
为什么? 库生态丰富,Requests 用于获取网页,BeautifulSoup 和 Scrapy 用于解析数据,非常简单高效。
-
做什么? 自动化地从网站上收集、分析和存储所需的数据。
-
-
教育与科学计算
-
为什么? 语法接近自然英语,可读性强,非常适合编程初学者建立逻辑思维。科学家们也常用它来进行模拟和计算。
-
-
其他领域
-
游戏开发(Pygame)、图形界面(GUI)开发(Tkinter, PyQt)、嵌入式开发(MicroPython)等,也能看到Python的身影。
-
python的优缺点
优点(为什么选择Python?)
-
👍 语法简单,易学易读: 代码就像在读英语,强制缩进的规则使得代码非常整洁规范,对初学者极其友好。
-
👍 功能强大,生态丰富: 正如上文所说,它有海量的第三方库(PyPI),你想实现的绝大多数功能,可能都已经有人为你写好了库,“人生苦短,我用Python”正是由此而来。
-
👍 解释型语言,平台无关: 写好的代码可以在Windows、macOS、Linux等系统上直接运行,无需修改(前提是安装了解释器)。
缺点(Python的痛点)
-
👎 运行速度相对较慢: 作为解释型语言,它的执行效率通常低于C++、Java等编译型语言。但这对于大多数现代应用(如网络服务、数据分析)来说并非核心瓶颈,且可以通过使用C库或JIT(即时编译)等技术来优化。
-
👎 全局解释器锁(GIL): 这限制了Python在多线程环境下的CPU性能,使得多线程并不能充分利用多核CPU。对于CPU密集型的多任务,通常需要通过多进程来解决。
-
👎 不适合移动端和游戏开发: 在移动应用(iOS/Android)和大型3D游戏开发领域,Python并非主流选择。
搭建python环境
要想能够进行 Python 开发, 就需要搭建好 Python 的环境.需要安装的环境主要是两个部分:
运行环境: Python
开发环境: PyCharm
安装python
官网链接:欢迎来到 Python.org
其中我们会发现有稳定版本和预先版本。推荐稳定版本
注意: Python 的版本在持续迭代更新中. 同学们看到的版本不一定和我这里完全一致, 但是基本不影响学习使用.
关于 Python 版本的补充
现在主流使用的 Python 版本是 Python 3 系列. 但是同学们以后在公司中, 接触到一些比较老的项目, 可能还在使用 Python 2 .
3 系列 和 2 系列 之间的语法还是存在不小差别的. 我们学习的内容主要是依据 Python 3 系列为主
下载好后双击安装即可。
python安装好后可以点击.exe就可以在控制台进行书写
直接输入
print("hello world");
可以看到如下效果
不过这样是不适合做项目的,因此我们需要python的编辑器:pycharm
安装pycharm
虽然通过交互式解释器可以执行 Python 代码了, 但是代码写起来并不方便. 就需要更专业的开发工具来编写 Python 代码.
目前业界常用的 Python 开发工具, 主要有下列选项:
其中最主流的开发工具就是 PyCharm 和 VS Code 了.
两者之间的区别在此
特性 | PyCharm (专业版) | VSCode |
---|---|---|
定位 | 专业的Python IDE | 轻量级代码编辑器(通过插件强化) |
开箱即用 | ⭐⭐⭐⭐⭐(极致) | ⭐⭐(需要配置) |
资源占用 | 高(重型) | 低(轻量) |
智能补全/导航 | 极强(深度理解Python) | 很强(依赖Pylance等插件) |
多语言支持 | 良好(但核心是Python) | 极好(一站式解决所有语言) |
定制化程度 | 高 | 极高(一切皆可配置) |
价格 | 社区版免费,专业版付费 | 完全免费 |
本期我们来介绍pycharm的安装
pycharm官网:PyCharm: The only Python IDE you need
下载安装后双击安装即可
运行hello world
基本配置
(1)字体大小设置
PyCharm 默认的字体比较小, 看起来很费眼睛.
可以设置大一点.选择 File -> Settings
找到 Editor -> Font, 把字体 Size 和 Line height 都适当调整.
Size 表示字体大小. 数字越大文字越大.
Line height 表示行高, 数字越大则两行文字之间的间隔就越大.
python的基础语法
常量和表达式
print(1+2-3)
print(1+2*3)
print(1+2/3)
结果为:
形如 1 + 2 - 3 这样是算式, 在编程语言中称为 表达式, 算式的运算结果, 称为 表达式的返回值
其中 1 , 2 , 3 这种称为 字面值常量, + - * / 这种称为 运算符 或者 操作符.
在之前学习C++的时候我们直到int类型进行触发的时候默认是把小数位取出,比如C/C++中2/3结果为0,但是在python中为0.6666665.这点要注意
变量
有的时候, 我们需要进行的计算可能更复杂一些, 需要把一些计算的中间结果保存起来. 这个时候就需要用到 变量.
变量可以视为是一块能够容纳数据的空间. 这个空间往往对应到 "内存" 这样的硬件设备上.
1、定义变量
int a=10
创建变量的语句非常简单, 其中
a 为变量名. 当我们创建很多个变量的时候, 就可以用名字来进行区分.
= 为赋值运算符, 表示把 = 右侧的数据放到 = 左侧的空间中.
注意: 变量的名字要遵守一定规则.
硬性规则(务必遵守)
变量名由数字字母下划线构成.数字不能开头.
变量名不能和 "关键字" 重复.
变量名大小写敏感. num 和 Num 是两个不同的变量名.
软性规则(建议遵守)
变量名使用有描述性的单词来表示, 尽量表达出变量的作用
一个变量名可以由多个单词构成, 长一点没关系, 但是含义要清晰
变量名含多个单词的时候建议使用驼峰命名法。
#读取变量的值
a = 10
print(a)
#修改变量的值
a = 20
print(a)
注意: 在 Python 中, 修改变量也是使用 = 运算, 看起来和定义变量没有明显区别.
2、变量的类型
变量里面存储的不仅仅是数字, 还可以存储其它种类的数据. 为了区分不同种类的数据, 我们引入了 "类型"这样的概念
注意: 和 C++ / Java 等语言不同, Python 变量的类型不需要显式指定, 而是在赋值的时候确定的.
整数
a = 10
print(type(a))
结果:
type()是一个内置函数,可以使用 type 来查看一个变量的类型.
注意: 和 C++ / Java 等语言不同, Python 的 int 类型变量, 表示的数据范围是没有上限的. 只要内存足够大,理论上就可以表示无限大小的数据.
浮点数
a = 0.5
print(type(a))
结果为:
注意: 和 C++ / Java 等语言不同, Python 的小数只有 float 一种类型, 没有 double 类型. 但是实际上Python 的 float 就相当于 C++ / Java 的 double, 表示双精度浮点数.
字符串
a = 'hello'
print(type(a))
使用 ' ' 或者 " " 引起来的, 称为 字符串. 可以用来表示文本.
结果为:
注意: 在 Python 中, 单引号构成的字符串和双引号构成的字符串, 没有区别. 'hello' 和 "hello" 是完全等价的.
可以使用 len 函数来获取字符串的长度.
#求字符串长度
a = 'hello'
print(len(a))
结果为:
可以发现,python中字符串是没有'\0'的
可以使用 + 针对两个字符串进行拼接
#字符串拼接
a = 'hello'
b = 'world'
print(a + b)
此处是两个字符串相加. 不能拿字符串和整数/浮点数相加.
字符串作为开发中最常用到的数据类型, 支持的操作方式也是非常丰富的
布尔类型
布尔类型是一个特殊的类型, 取值只有两种, True (真) 和 False (假).
PS: 布尔类型也是数学上的一个概念. 我们初中就学过一个概念叫做 "命题" , 进一步的就可以判定命题的真假.
a = True
print(type(a))
b = False
print(type(b))
结果为:
3、容器类型
python中也存在类似于C++的容器类型
C++ STL 容器 | Python 等效类型 | 核心功能与特点 |
---|---|---|
std::vector | list | 动态数组 。支持索引访问、追加(append )、插入(insert )、弹出(pop )。与vector 不同,Python列表可存放不同类型对象。 |
std::list | collections.deque | 双端队列。适合在队列两端进行高效的插入和删除(时间复杂度O(1)),但在中间位置的操作效率相对较低。 |
std::deque | collections.deque | 双端队列。同样适用于在队列两端进行高效的插入和删除。 |
std::stack | list (利用方法模拟) | 栈。通常使用列表的append() (压栈)和pop() (弹栈)来模拟后进先出(LIFO)的栈行为。 |
std::queue | collections.deque | 队列。使用deque 的append() (入队)和popleft() (出队)来模拟先进先出(FIFO)的队列行为。 |
std::priority_queue | heapq (模块) | 优先队列(堆)。heapq 是一个基于列表的二叉堆模块,提供最小堆实现。使用heapq.heappush() 和heapq.heappop() 等方法操作。 |
std::set | set | 无序集合 。存储唯一且不可变的元素,支持交集(& )、并集(| )、差集(- )等数学运算 。 |
std::multiset | collections.Counter | 多重集合(或计数器)。Counter 是dict 的子类,用于计数可哈希对象。它自动处理元素的计数,非常适合需要统计元素频率的场景。 |
std::map | dict | 字典(关联数组)。存储键值对(key-value pairs),键必须是可哈希的类型(通常为不可变类型)。 |
std::unordered_map | dict | 字典。在Python中,普通的dict 自Python 3.7起就保持插入顺序 ,但其本质是通过哈希表实现,因此查找、插入、删除操作的平均时间复杂度为O(1)。 |
std::unordered_set | set | 无序集合。如前所述,Python的set 是基于哈希表实现的无序集合,用于存储唯一元素 。 |
为什么要有这么多类型?
(1) 类型决定了数据在内存中占据多大空间.
例如 float 类型在内存中占据 8 个字节.
PS: 计算机里面使用二进制来表示数据. 也就是每个位只能表示 0 或者 1.
1 个二进制位, 就称为是一个 "比特", 8 个二进制位, 就称为一个 "字节" (Byte)
一个 float 变量在内存中占据 8 个字节空间, 也就是 64 个二进制位.
我的电脑有 16GB 的内存空间, 也就是一共有 1024 * 1024 * 1024 * 8 这么多的二进制位.
(2) 类型其实约定了能对这个变量做什么样的操作.
例如 int / float 类型的变量, 可以进行 + - * / 等操作
而 str 类型的变量, 只能进行 + (并且行为是字符串拼接), 不能进行 - * / , 但是还能使用 len 等其他操作。
总结: 类型系统其实是在对变量进行 "归类". 相同类型的变量(数据) 往往具有类似的特性和使用规则.
动态类型特性
在 Python 中, 一个变量是什么类型, 是可以在 "程序运行" 过程中发生变化的. 这个特性称为 "动态类型"
a = 10
print(type(a))
a = 'hello'
print(type(a))
结果为:
我们观察到,在程序执行过程中, a 的类型刚开始是 int, 后面变成了 str.
C++/Java 这样的语言则不允许这样的操作. 一个变量定义后类型就是固定的了. 这种特性则称为 "静态类型".
动态类型特性是一把双刃剑.
对于中小型程序, 可以大大的解约代码量(比如写一段代码就可以同时支持多种类型).
对于大型程序, 则提高了模块之间的交互成本. (程序猿 A 提供的代码难以被 B 理解).
注释
注释是一种特殊的代码, 它不会影响到程序的执行, 但是能够起到解释说明的作用, 能够帮助程序猿理解程序代码的执行逻辑.
PS: 写代码是一件比较烧脑的事情, 读代码同样也非常烧脑. 相比于一板一眼的代码, 一些口语化的描述能更好的帮助程序猿理解程序
注释的语法
(1) 注释行
使用 # 开头的行都是注释
# 这是一行注释.
(2) 文档字符串
使用三引号引起来的称为 "文档字符串", 也可以视为是一种注释.
可以包含多行内容,
一般放在 文件/函数/类 的开头. """ 或者 ''' 均可 (等价).
"""
这是文档字符串
这是文档字符串
"""
输入输出
程序需要和用户进行交互.
用户把信息传递给程序的过程, 称为 "输入".程序把结果展示给用户的过程, 称为 "输出".
输入输出的最基本的方法就是控制台. 用户通过控制台输入一些字符串, 程序再通过控制台打印出一些字符串.
输入输出的最常见方法是图形化界面. 如我们平时用到的 QQ, 浏览器, steam 等, 都不需要用户输入命令,而只是通过鼠标点击窗口点击按钮的方式来操作.
控制台输出
python中我们用print进行输出
print('hello')
实际运用中我们通常需要多种类型输出
num = 10
print(f'num = {num}')
注意:
使用 f 作为前缀的字符串, 称为 f-string
里面可以使用 { } 来内嵌一个其他的变量/表达式.
控制台输入
python中可以使用input进行控制台输入
num = 0
num = input('请输入一个整数: ')
print(f'你输入的整数是 {num}')
注意:
input 的参数相当于一个 "提示信息", 也可以没有.
input 的返回值就是用户输入的内容. 是字符串类型.
a = input('请输入第一个整数: ')
b = input('请输入第二个整数: ')
print(f'a + b = {a + b}')
此处为字符串拼接,如果要计算要先转换类型
a = input('请输入第一个整数: ')
b = input('请输入第二个整数: ')
a = int(a)
b = int(b)
print(f'a + b = {a + b}')
运算符
算术运算符
运算符 | 名称 | 功能描述 | 示例 | 结果 |
---|---|---|---|---|
+ | 加法 | 对两个操作数进行相加 | 5 + 3 | 8 |
- | 减法 | 从左操作数减去右操作数 | 10 - 4 | 6 |
* | 乘法 | 将两个操作数相乘 | 7 * 6 | 42 |
/ | 除法 | 左操作数除以右操作数,返回浮点数 | 15 / 4 | 3.75 |
// | 整除 | 左操作数除以右操作数,返回整数部分 | 15 // 4 | 3 |
% | 取模 | 左操作数除以右操作数,返回余数 | 15 % 4 | 3 |
** | 幂运算 | 左操作数的右操作数次幂 | 2 ** 3 | 8 |
+ (一元) | 正号 | 保持操作数的符号不变 | +5 | 5 |
- (一元) | 负号 | 改变操作数的符号 | -5 | -5 |
注意1: / 中不能用 0 作为除数. 否则会 抛出异常
异常 是编程语言中的一种常见机制, 表示程序运行过程中, 出现了一些 "意外情况", 导致程序不能继续往下执行了.
注意2: ** 是求乘方. 不光能算整数次方, 还能算小数次方
print(4 ** 2) #16
print(4 ** 0.5) #2
注意3: // 是取整除法(也叫地板除). 整数除以整数, 结果还是整数(舍弃小数部分, 并向下取整. 不是四舍五入
print(7 // 2) #3
print(-7 // 2)#-4
关系运算符
运算符 | 名称 | 功能描述 | 示例 | 结果 |
---|---|---|---|---|
== | 等于 | 检查两个操作数的值是否相等 | 5 == 5 | True |
!= | 不等于 | 检查两个操作数的值是否不相等 | 5 != 3 | True |
> | 大于 | 检查左操作数是否大于右操作数 | 5 > 3 | True |
< | 小于 | 检查左操作数是否小于右操作数 | 5 < 3 | False |
>= | 大于等于 | 检查左操作数是否大于或等于右操作数 | 5 >= 5 | True |
<= | 小于等于 | 检查左操作数是否小于或等于右操作数 | 5 <= 3 | False |
is | 对象标识相等 | 检查两个操作数是否引用同一个对象 | a is b | 取决于对象标识 |
is not | 对象标识不等 | 检查两个操作数是否引用不同对象 | a is not b | 取决于对象标识 |
(1) 如果关系符合, 则表达式返回 True. 如果关系不符合, 则表达式返回 False
(2) 关系运算符不光针对整数/浮点数进行比较, 还能针对字符串进行比较.
a = 'hello'
b = 'world'
print(a < b)
print(a <= b)
print(a > b)
print(a >= b)
print(a == b)
print(a != b)
结果为:
(3) 对于浮点数来说, 不要使用 == 判定相等.
print(0.1 + 0.2 == 0.3)
结果为:
注意: 浮点数在计算机中的表示并不是精确的! 在计算过程中, 就容易出现非常小的误差
print(0.1)
print(0.2)
print(0.3)
print(0.1 + 0.2)
正确的比较方式: 不再严格比较相等了, 而是判定差值小于允许的误差范围
a = 0.1 + 0.2
b = 0.3
print(-0.000001 < (a - b) < 0.000001)
实际工程实践中, 误差在所难免, 只要保证误差在合理范围内即可
逻辑运算符
运算符 | 名称 | 功能描述 | 示例 | 结果 | 计算规则 |
---|---|---|---|---|---|
and | 逻辑与 | 如果两个操作数都为真,则结果为真 | True and False | False | 返回第一个假值或最后一个真值 |
or | 逻辑或 | 如果任一操作数为真,则结果为真 | True or False | True | 返回第一个真值或最后一个假值 |
not | 逻辑非 | 反转操作数的逻辑状态 | not True | False | 返回操作数的相反布尔值 |
特殊写法:
a < b and b < c 这个操作等价于 a < b < c . 这个设定和大部分编程语言都不相同
关于短路求值
和其他编程语言类似, Python 也存在短路求值的规则.
对于 and, 如果左侧表达式为 False, 则整体一定为 False, 右侧表达式不再执行.对于 or, 如果左侧表达式为 True, 则整体一定为 True, 右侧表达式不再执行.
print(10 > 20 and 10 / 0 == 1)
print(10 < 20 or 10 / 0 == 1)
结果为:
赋值运算符
运算符 | 名称 | 功能描述 | 示例 | 等价于 |
---|---|---|---|---|
= | 简单赋值 | 将右操作数的值赋给左操作数 | x = 5 | x = 5 |
+= | 加法赋值 | 将右操作数加到左操作数 | x += 3 | x = x + 3 |
-= | 减法赋值 | 从左操作数减去右操作数 | x -= 3 | x = x - 3 |
*= | 乘法赋值 | 将左操作数乘以右操作数 | x *= 3 | x = x * 3 |
/= | 除法赋值 | 将左操作数除以右操作数 | x /= 3 | x = x / 3 |
//= | 整除赋值 | 将左操作数整除右操作数 | x //= 3 | x = x // 3 |
%= | 取模赋值 | 将左操作数对右操作数取模 | x %= 3 | x = x % 3 |
**= | 幂赋值 | 将左操作数的右操作数次幂 | x **= 3 | x = x ** 3 |
&= | 按位与赋值 | 将左操作数与右操作数按位与 | x &= 3 | x = x & 3 |
|= | 按位或赋值 | 将左操作数与右操作数按位或 | x |= 3 | x = x | 3 |
^= | 按位异或赋值 | 将左操作数与右操作数按位异或 | x ^= 3 | x = x ^ 3 |
<<= | 左移位赋值 | 将左操作数左移右操作数指定的位数 | x <<= 2 | x = x << 2 |
>>= | 右移位赋值 | 将左操作数右移右操作数指定的位数 | x >>= 2 | x = x >> 2 |
注意: 像 C++ / Java 中, 存在 ++ -- 这样的自增/自减运算符. Python 中则不支持这种运算. 如果需要使用, 则直接使用 += 1 或者 -= 1
++ -- 最大的问题就是容易分不清前置和后置的区别. 这一点 Python 语法在设计的时候就进行
了规避, 避免出现这种不直观, 并且容易混淆的语法.
科普:字符串比较大小是按照“字典序”比的
什么是“字典序”?
字典序(Lexicographical Order),又称词典序或字母序,是一种基于字符在特定字符集(如ASCII、Unicode)中出现的先后顺序来比较字符串大小的方法。
它的核心规则可以概括为:从左到右,逐个字符比较,直到分出大小,或直到一个字符串结束。
字典序的详细比较规则
我们可以将比较过程分解为以下几步,这个表格清晰地展示了整个决策流程:
比较步骤 | 规则描述 | 示例:比较 "apple" 和 "banana" |
---|---|---|
1. 逐字符比较 | 从两个字符串的第一个字符开始,逐个比较对应位置上的字符。 | 比较第1位:'a' vs 'b' |
2. 决定大小 | 如果在某个位置,两个字符不同,则根据这两个字符的编码值(如ASCII码)大小决定整个字符串的大小。此位置之后的所有字符不再重要。 | 'a' (97) < 'b' (98),所以 "apple" < "banana" |
3. 处理前缀 | 如果比较完所有对应字符都相同,但一个字符串比另一个更短,则较短的字符串被视为更小。 | 比较 "cat" 和 "catalog" :前3字符相同,但 "cat" 更短,所以 "cat" < "catalog" |
4. 完全相等 | 只有当两个字符串长度相同,且每个对应位置的字符都完全一样时,两个字符串才相等。 | "hello" == "hello" |
核心要点与常见误区
-
基于编码,而非语言
比较的依据是字符在计算机中的编码值(如ASCII码、Unicode码点),而不是我们口语中的字母表顺序。-
数字 < 大写字母 < 小写字母
-
例如:
'9'
(57) <'A'
(65) <'Z'
(90) <'a'
(97) <'z'
(122) -
所以:
"999"
<"ABC"
<"abc"
-
-
-
大小写敏感
由于大写字母和小写字母的编码值不同,所以字典序是区分大小写的。-
"A"
(65) <"a"
(97),所以"Apple"
<"apple"
-
-
长度不是第一优先级
很多人误以为更长的字符串就更大,这是不对的。只有在前面所有字符都相同的情况下,长度才起作用。-
"z"
(122) >"aa"
(97, 97) // 因为第一个字符'z'
>'a'
,直接得出结果,不再看长度。
-
本期python的内容到这里就结束啦,感谢各位的观看,喜欢请点个赞谢谢
封面图自取: