Python 入门指南:从基础到实践
Python 语言简介
Python 是一种面向对象、解释型的编程语言,由荷兰程序员 Guido van Rossum 在 1989 年圣诞节期间开始开发,首个公开版本于 1991 年发布。Python 的名称源自 Guido 喜爱的喜剧电视剧《Monty Python's Flying Circus》。
根据 2017 年的 TIOBE 排行榜,Python 已经跻身编程语言前四名。它广泛应用于数据分析、Web 开发、自动化运维、人工智能、科学计算、金融量化交易等多个领域。许多知名公司,如 Google、YouTube、Dropbox、知乎、豆瓣、百度、腾讯等,都在大量使用 Python 进行产品开发。
主要应用领域
- 云计算: OpenStack 等主流平台广泛采用 Python。
- Web 开发: 框架丰富(如 Django、Flask),支撑了 YouTube、Dropbox 等大型网站。
- 科学计算与人工智能: 借助 NumPy、SciPy、Pandas、Matplotlib 等库,成为数据科学领域的首选语言。
- 系统运维: 运维自动化脚本编写的重要工具。
- 金融: 在量化交易、策略回测等领域表现出色。
- 图形界面: 支持 PyQt、Tkinter 等 GUI 框架。
Python 与其他语言的区别
编程语言可以从不同角度进行分类,了解这些分类有助于理解 Python 的特性:
编译型 vs. 解释型
编译型语言(如 C、C++)的代码在运行前会被整体编译成机器码,因此执行效率高,但修改后需要重新编译,且跨平台性较差。而 解释型语言(如 Python)在运行时由解释器逐行翻译成机器码,每次执行都需要翻译,因此速度相对较慢,但跨平台性好,开发灵活。Python 属于解释型语言。
静态语言 vs. 动态语言
静态类型语言(如 C、Java)要求在编译时声明变量的数据类型,类型检查在编译阶段进行。动态类型语言(如 Python、Ruby)则在运行时才进行类型检查,变量可以随时被赋值为不同类型的数据。Python 是动态类型语言。
强类型 vs. 弱类型
强类型语言(如 Python、Java)禁止不同类型的数据隐式转换。例如,在 Python 中,不能将字符串"123"直接与整数1相加,必须先进行显式类型转换。弱类型语言(如 JavaScript、VBScript)则允许这些操作。Python 是强类型语言,它保证了程序的类型安全性。
Python 的优缺点
优点
- 简洁易读: 代码风格优雅,可读性强,入门门槛低。
- 高效开发: 拥有丰富的标准库和第三方库,可以快速实现复杂功能。
- 高级语言: 自动管理内存,无需开发者处理底层细节。
- 可移植性: 几乎所有主流平台都支持 Python 运行。
- 可扩展性: 关键代码可用 C/C++ 编写以提高性能,再被 Python 调用。
- 可嵌入性: Python 可以作为脚本语言嵌入到 C/C++ 程序中。
缺点
- 运行速度: 相比 C 或 Java,执行速度较慢。但对于大多数应用场景,这种差异用户难以察觉。
- 加密困难: 作为解释型语言,源码以明文形式存在,难以加密。
- 全局解释器锁(GIL): 在多线程编程中,GIL 使得同一时刻只有一个线程能执行,限制了多核 CPU 的利用。但可通过多进程或异步编程来规避。
Python 解释器
Python 代码需要解释器来执行。常见的解释器包括:
- CPython: 官方默认的解释器,使用最广泛,由 C 语言实现。在命令行输入
python启动的就是它。 - IPython: 基于 CPython 的增强交互式解释器,提供更丰富的功能,但执行 Python 代码的内核与 CPython 相同。
- PyPy: 旨在提高执行速度,通过 JIT(即时编译)技术将 Python 代码编译成机器码。
- Jython: 运行在 Java 平台,可将 Python 代码编译为 Java 字节码。
- IronPython: 运行在 .NET 平台,可将 Python 代码编译为 .NET 字节码。
小结: 对于绝大多数开发者,选择 CPython 即可。需要与 Java 或 .NET 平台集成时,通常建议通过网络通信而非使用 Jython 或 IronPython。
开发环境搭建
Windows 安装
- 访问 Python 官网下载对应版本(例如 3.x 或 2.7)。
- 运行安装包,安装到指定目录(如
C:\python3)。 - 将 Python 安装路径(如
C:\python3和C:\python3\Scripts)添加到系统环境变量Path中。
Linux 安装(以 CentOS 为例)
# 查看默认版本
python -V
# 安装编译工具
yum install gcc -y
# 下载源码包(以 Python 2.7 为例)
wget https://www.python.org/ftp/python/2.7.x/Python-2.7.x.tgz
# 解压并进入目录
tar -zxvf Python-2.7.x.tgz
cd Python-2.7.x
# 配置、编译、安装
./configure
make all
make install
# 检查新版本
/usr/local/bin/python2.7 -V
# 替换系统默认 Python 版本(谨慎操作)
mv /usr/bin/python /usr/bin/python2.6
ln -s /usr/local/bin/python2.7 /usr/bin/python
# 修复 yum 因版本问题无法运行
vi /usr/bin/yum
# 将文件头部的 #!/usr/bin/python 改为 #!/usr/bin/python2.6
基础语法结构
代码缩进
Python 使用缩进来定义代码块,而非花括号或关键字。同一层次的代码必须保持相同的缩进量,通常推荐使用四个空格。
Linux 下在 Vim 中配置自动缩进:
# 编辑 ~/.vimrc
set ai
set tabstop=4
注释
使用 # 符号表示单行注释,从该符号开始到行尾的内容都会被解释器忽略。
文档字符串
文档字符串是多行注释的一种,通常位于模块、类或函数定义的开头,用三引号包裹。它们可以通过 help() 函数查看。
#!/usr/bin/env python
"""star module: 一个示例模块,仅包含一个简单函数"""
def print_stars():
"不接受参数,打印 50 个星号"
print('*' * 50)
# 加载模块后可通过 help(star) 查看文档
Python 入门实践
编写第一行代码
创建一个名为 hello.py 的文件,输入:
print("hello, world")
在终端执行 python hello.py,即可看到输出。
如果需要像执行 Shell 脚本一样运行(./hello.py),需在文件首行添加解释器声明并赋予执行权限:
#!/usr/bin/env python
print("hello, world")
执行 chmod 755 hello.py 后,即可通过 ./hello.py 运行。
字符编码
Python 2 默认使用 ASCII 编码,这会导致非英文字符(如中文)出现错误。Python 3 默认使用 UTF-8 编码,但为兼容老代码,建议在文件开头明确声明编码:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
print("你好,世界")
编码声明必须放在文件的第一行或第二行。常用的格式包括:
# coding=<编码名># -*- coding: <编码名> -*-# vim: set fileencoding=<编码名>
模块初识
Python 拥有丰富的模块,包括内置模块、第三方模块和自定义模块。通过 import 语句导入模块。
例如,使用内置的 sys 模块获取脚本启动参数:
import sys
print(sys.argv) # 打印传递给脚本的命令行参数列表
.pyc 字节码文件
执行 Python 程序时,如果导入了外部模块,解释器会将其编译成字节码,并存储为同名的 .pyc 文件。这是为后续加载该模块时提高速度。
变量
命名规则
- 变量名由字母、数字、下划线组成。
- 不能以数字开头。
- 大小写敏感。
- 不能使用 Python 保留关键字。
查看全部关键字:
import keyword
print(keyword.kwlist) # 列出所有关键字
print(keyword.iskeyword('if')) # 判断是否为关键字,输出 True
变量赋值
name = "hello" # 字符串赋值
x, y, z = 1, 2, "abc" # 多元赋值
x = y = 1 # 链式赋值
x += 1 # 增量赋值,等同于 x = x + 1
# 交换变量值
x, y = y, x
获取用户输入(Python 3)
username = input("请输入用户名:")
print(f"您好,{username}!")
在 Python 2 中,使用 raw_input() 获取字符串输入。Python 3 的 input() 功能相当于 raw_input()。
流程控制与循环
条件语句 (if)
age = 20
if age < 18:
print("未成年人")
elif age >= 60:
print("老年人")
else:
print("成年人")
条件表达式(三元运算符)
outcome = "及格" if score >= 60 else "不及格"
while 循环
count = 0
while count < 5:
print(f"计数:{count}")
count += 1
for 循环
fruits = ["苹果", "香蕉", "橘子"]
for fruit in fruits:
print(fruit)
for i in range(5): # range(5) 生成 0,1,2,3,4
print(i)
break 语句
用于跳出当前循环。
for i in range(10):
if i == 5:
break # 当 i 等于 5 时退出循环
print(i) # 输出 0-4
continue 语句
跳过本次循环的剩余部分,进入下次循环。
for i in range(10):
if i % 2 == 0:
continue # 偶数跳过,不打印
print(i) # 输出 1,3,5,7,9
pass 语句
空操作,通常用作占位符,保持结构完整。
def not_implemented_yet():
pass # 函数体暂时为空
else 与循环配合
在 while 或 for 循环后可以跟 else 子句,当循环正常结束(未通过 break 中断)时,执行该子句。
for num in range(2, 10):
for divisor in range(2, num):
if num % divisor == 0:
break
else:
print(f"{num} 是质数")
迭代与推导式
迭代
迭代是访问序列元素的一种方式。Python 中,任何实现了 __iter__() 方法的对象都是可迭代对象。
my_list = [1, 2, 3]
for element in my_list: # my_list 是可迭代对象
print(element)
列表解析(List Comprehension)
列表解析是一种简洁创建列表的方法,可看作生成列表的语法糖。
# 生成 0 到 9 的平方列表
squares = [x**2 for x in range(10)]
print(squares) # 输出 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
# 带条件的列表解析
even_squares = [x**2 for x in range(10) if x % 2 == 0]
print(even_squares) # 输出 [0, 4, 16, 36, 64]
生成器表达式(Generator Expression)
生成器表达式在语法上与列表解析相似,但使用圆括号而非方括号,且它返回的是生成器对象,按需生成元素,节省内存。
squares_gen = (x**2 for x in range(10))
print(type(squares_gen)) # 输出 <class 'generator'>
# 通过循环取用生成器元素
for value in squares_gen:
print(value) # 依次打印 0,1,4,9...
提示: 生成器在数据量很大时非常有用,因为它在内存中只保留当前元素,不会一次性生成全部数据。