作者:禅与计算机程序设计艺术
1.背景介绍
概述
“Python”是一种面向对象的、解释型的、动态语言,具有强大的功能特性及简单易用性。作为一种高级语言,它可以用来进行Web开发、科学计算、系统脚本等领域的快速开发,特别适合数据分析和机器学习方面的应用场景。在Python中有丰富的标准库和第三方库可供选择,也支持多种编程模式(面向过程、命令式、函数式),能够灵活应对各种项目需求。因此,掌握Python编程技术至关重要。
本教程将对Python编程中的一些基本语法知识、数据结构和算法、模块、类等关键概念进行讲解,并提供详实的代码实例帮助读者理解这些知识点的运用。希望通过本教程,读者能够了解到如何利用Python进行编程以及遇到的坑、技巧、注意事项等知识,从而在实际工作中有所收获。
本教程内容
本教程的内容包括:
- 函数概述
- 变量作用域
- 数据类型
- 流程控制
- 列表、字典和集合
- 文件I/O
- 模块和包管理
- 异常处理
- 输入输出
- 正则表达式
2.核心概念与联系
函数概述
函数就是封装好的代码片段,可以通过函数名调用执行该段代码。函数分为两大类:内置函数和自定义函数。内置函数指的是Python内置的函数,例如print()函数用于打印字符串;自定义函数则是在程序运行前定义的函数。自定义函数一般由用户自己编写,它的优点是可以提高代码的复用性和可维护性。
函数的基本形式如下:
def 函数名(参数):
函数体
return 返回值
其中函数名是用户定义的函数名称,参数是传递给函数的参数,函数体是函数要执行的逻辑语句,return返回值是函数执行结束后返回的值。函数可以有无数个参数,多个参数以逗号隔开即可。函数也可以没有参数。
函数声明:函数的声明语句的格式如下:
def function_name():
'''
function description and comments here...
'''
#function body goes here...
def关键字表示定义函数function_name是函数的名称,命名规则遵循标识符的命名规范。()括号里列出了函数的参数,如果没有参数,则为空。:冒号表示函数头部结束,后续跟着函数的说明注释和代码。
函数调用:函数的调用语句的格式如下:
function_name(argument1, argument2,...)
function_name是已定义的函数名。argument1, argument2,...是函数所需的各个参数,个数不限。- 当函数有返回值时,可以直接赋值给一个变量。
函数参数:函数的参数有以下几种类型:
- 位置参数:在调用函数时按顺序传入参数,需要指定参数的类型。
- 默认参数:在定义函数时为参数设置默认值,调用函数时可以省略该参数,但如果未指定该参数,则会使用默认值。
- 可变参数:定义时在参数名前加上一个星号
*,表示这个位置的参数可以接受零个或多个值。 - 关键字参数:关键字参数通过参数名指定参数值,在定义函数时在参数名前加上两个星号
**,代表接收任意数量的关键字参数。
函数参数总结:
| 参数类型 | 描述 |
|---|---|
| 位置参数 | 指定位置参数的值。 |
| 默认参数 | 如果函数调用时没有给定参数,则使用默认值。 |
| 可变参数 | 可以传入任意多个参数,而且可以在函数内部通过一个元组接受。 |
| 关键字参数 | 通过参数名指定参数值,在调用时可使用任意顺序的关键字参数。 |
| 组合参数 | 将以上两种参数结合使用。 |
| 任意参数 | 以元组的形式传递任意数量的参数,参数名不要重复。 |
| 不定长参数 | 装饰器函数可以用*args来接收除关键字参数外的所有参数。 |
| 不定长关键字参数 | 装饰器函数可以用**kwargs来接收所有关键字参数。 |
| 函数注解 | 在函数定义中添加注解,能够让阅读者更容易理解函数的用法。 |
变量作用域
变量作用域是指变量在哪些区域或者范围内有效。Python 中存在全局变量和局部变量。
全局变量:使用 global 关键字声明的变量拥有全局作用域,可以在整个程序范围内访问。
局部变量:如果变量在函数体或其他作用域内声明,则拥有局部作用域,只能在当前函数体内访问,外部无法引用。
局部变量和全局变量之间的区别如下:
| 变量类型 | 生命周期 | 访问方式 |
|---|---|---|
| 全局变量 | 整个程序期间都存在 | 使用全局变量名称就可以直接访问 |
| 局部变量 | 函数体执行完毕后销毁 | 需要使用 global 关键字才能访问 |
数据类型
Python 有五种基本的数据类型:
- 整型(int):整数,如 1, -2, 3, 45, 0, etc。
- 浮点型(float):浮点数,如 3.14, -9.01, 1e-10, etc。
- 布尔型(bool):布尔值,只有两个值 True 和 False。
- 字符型(str):字符串,如 "hello", 'world', "1 + 2 = 3"。
- 空值(NoneType):空值,只有一个值 None。
Python 中的数据类型转换可以使用 type() 或 isinstance() 方法实现。
| 数据类型 | 转换方法 |
|---|---|
| 整型 | int(), str().isdigit() 判断是否为数字 |
| 浮点型 | float(), str().replace(',', '.').isdigit() 判断是否为数字 |
| 布尔型 | bool() |
| 字符型 | str() |
| 空值 | type(None) |
流程控制
Python 中的流程控制有三种结构:条件语句(if...elif...else)、循环语句(for...in...while)、分支语句(try...except...finally)。
if...elif...else
条件语句是判断条件是否成立,然后根据条件结果决定是否执行相应的代码。Python 的条件语句由 if, elif(可选),else(可选) 三个关键字组成。
num = 10
if num > 0:
print("Positive number")
elif num == 0:
print("Zero")
else:
print("Negative number")
示例代码中,首先判断 num 是否大于 0,如果是的话就输出 "Positive number",否则判断 num 是否等于 0,如果是的话就输出 "Zero",最后输出 "Negative number"。
for...in...while
循环语句允许迭代遍历某一数据集,比如列表、字典、集合,并按照一定顺序依次访问每一项。Python 的循环语句由 for、in、while 三个关键字组成。
for...in...range()
range() 函数用于生成一个整数序列,其中的元素从指定的第一个值(默认为0)开始,到指定的第二个值(不包括)结束,步长为 1(默认为1)。
for i in range(1, 10):
print(i)
示例代码输出 1 到 9。
for...in...enumerate()
enumerate() 函数用于枚举某个可迭代对象,返回一个索引-元素对,也就是 (index, value) 的形式。
fruits = ["apple", "banana", "orange"]
for index, fruit in enumerate(fruits):
print(index+1, fruit)
示例代码输出 1 apple 2 banana 3 orange。
while...break...continue
while 循环用于一直循环执行某段代码,直到满足某个条件才退出循环。当满足条件时,可以通过 break 跳出循环,通过 continue 跳过剩余的语句执行下一次循环。
count = 0
while count < 5:
count += 1
if count % 2 == 0:
continue
else:
print(count)
if count == 3:
break
示例代码中,先初始化 count 为 0,然后用 while 循环检查 count 是否小于 5,如果不是则继续执行 count += 1,如果是偶数,则用 continue 跳转到下一次循环;如果不是偶数,则输出 count 的值,并且判断 count 是否等于 3,如果是的话则用 break 终止循环。
try...except...finally
分支语句允许捕获并处理异常。Python 的分支语句由 try,except(可选),finally(可选) 三个关键字组成。
try...except
try 语句用于尝试执行一段代码,如果发生错误,则转入 except 语句进行处理,如果没有错误,则执行 except 语句之后的代码。
try:
a = 1 / 0
b = [1, 2, 3]
c = b[3]
except ZeroDivisionError as e:
print("division by zero:", e)
except IndexError as e:
print("list index out of range:", e)
except Exception as e:
print("unknown error:", e)
示例代码中,分别尝试除以 0、取不存在的元素、其他错误,并分别处理。
try...except...finally
finally 语句用于总是执行的语句,不管是否发生异常,都会执行该语句。
try:
f = open('test.txt')
data = f.read()
except IOError:
print('File not found!')
except Exception as e:
print('Error:', e)
finally:
if f:
f.close()
示例代码中,打开文件,读取内容,关闭文件,如果发生错误则打印提示信息,无论是否出错都会执行 finally 语句,释放资源。
列表、字典和集合
Python 提供了列表、字典和集合三种容器类型,用于存储和组织数据。
列表
列表是一种有序集合,元素之间用逗号分隔,且可以容纳不同类型的元素。列表支持数字索引和切片运算。
fruits = ['apple', 'banana', 'orange']
numbers = [1, 2, 3, 4, 5]
mixed = ['a', 1, 'b', {'x': 1}, lambda x: x+1]
创建列表
列表是创建后便可修改的对象,可以直接使用 [] 来表示。
empty_list = []
filled_list = list([1, 2, 3])
示例代码中,创建了一个空列表和一个初始值为 [1, 2, 3] 的列表。
添加元素
使用 append() 方法可以添加单个元素到列表末尾,使用 extend() 方法可以一次添加多个元素到列表末尾。
fruits.append('peach')
fruits.extend(['grape','mango'])
删除元素
使用 remove() 方法可以删除列表中某个值的第一次出现的元素,使用 pop() 方法可以删除指定位置的元素并返回值。
numbers.remove(3)
last_fruit = fruits.pop(-1)
示例代码中,移除列表 numbers 中的 3,弹出列表 fruits 末尾的元素。
更新元素
使用 insert() 方法可以插入指定位置的元素,使用 sort() 方法可以排序列表元素。
fruits.insert(1, 'pineapple')
fruits.sort()
示例代码中,在列表 fruits 中插入 'pineapple',并对列表 fruits 进行升序排列。
查询元素
使用 index() 方法可以查询某个值的第一次出现的索引,使用 count() 方法可以查询某个值的出现次数。
first_idx = numbers.index(2)
elem_cnt = fruits.count('banana')
示例代码中,获取列表 numbers 中第一个 2 的索引和列表 fruits 中 'banana' 的出现次数。
分片运算
列表支持切片运算,使用 [start:end:step] 的方式指定切片起始位置、结束位置和步长。
sublist = mixed[::2]
示例代码中,创建一个包含 mixed 中所有奇数索引的子列表。
字典
字典是一种映射关系表,由键和值组成,键必须是唯一的,值可以是相同类型或者不同类型。字典不记录元素的顺序。
student = {
'name': 'John Doe',
'age': 20,
'score': {
'math': 90,
'english': 80
}
}
创建字典
字典是创建后便可修改的对象,可以直接使用 {} 来表示。
empty_dict = {}
filled_dict = dict({'key1': 'value1', 'key2': 2})
示例代码中,创建了一个空字典和一个初始值为 { 'key1': 'value1', 'key2': 2 } 的字典。
添加元素
使用 update() 方法可以更新字典,如果键已存在,则覆盖旧值。
student['gender'] ='male'
student['score']['history'] = 85
示例代码中,向字典 student 添加新字段 'gender' 和新的键值对 'history:85'。
删除元素
使用 del 语句可以删除字典中的元素。
del student['age']
del student['score']['math']
示例代码中,删除字典 student 中键 'age' 和键'math'。
查询元素
使用 get() 方法可以查询某个键对应的值,如果不存在,则返回 None。
name = student.get('name')
grade = student.get('grade', 'unknown')
示例代码中,获取字典 student 中键 'name' 的值,如果不存在则返回 'unknown'。
集合
集合是一个无序不重复集合,主要用于快速查找和删除重复元素。
nums = set([1, 2, 3, 3, 2, 1])
创建集合
集合也是创建后便可修改的对象,可以直接使用 set() 来表示。
empty_set = set()
filled_set = set({1, 2, 3})
示例代码中,创建了一个空集合和一个初始值为 {1, 2, 3} 的集合。
操作集合
集合的操作包括添加元素(add())、删除元素(remove())、求交集(intersection())、求并集(union())和差集(difference())。
nums.add(4)
nums.remove(2)
result = nums & {3, 4, 5}
示例代码中,向集合 nums 中添加 4、删除 2、求交集,得到 {3}。
修改集合
集合不可修改,只能创建新集合来保存修改后的结果。