Python 基础语法与常见算法代码示例
前言
对于初学者而言,编程往往显得神秘且复杂。实际上,编程语言的核心在于逻辑构建与基本语法的组合。本文整理了 Python 语言中常用的基础语法片段以及数据结构相关的经典算法实现,旨在帮助开发者快速掌握核心代码模式。以下内容涵盖循环控制、列表操作、枚举使用及顺序表算法等实用场景。
本文整理了 Python 基础语法与常见算法代码示例,涵盖 for 循环 else 用法、列表操作、枚举、随机数生成、素数判断及顺序表算法(如奇偶重排、逆置、删除最小值等)。内容包含详细代码解析与注意事项,旨在帮助初学者掌握核心编程模式与数据结构操作技巧。

对于初学者而言,编程往往显得神秘且复杂。实际上,编程语言的核心在于逻辑构建与基本语法的组合。本文整理了 Python 语言中常用的基础语法片段以及数据结构相关的经典算法实现,旨在帮助开发者快速掌握核心代码模式。以下内容涵盖循环控制、列表操作、枚举使用及顺序表算法等实用场景。
在 Python 的 for 循环中,可以配合 else 子句使用。当循环正常结束(即没有被 break 中断)时,else 块中的代码才会执行。这常用于搜索任务,例如检查列表中是否存在满足特定条件的元素。
numbers = [2, 4, 6, 8, 1]
for number in numbers:
if number % 2 == 1:
print(number)
break
else:
print("No odd numbers")
上述代码遍历列表查找奇数。若找到则打印并跳出循环;若遍历完未找到,则执行 else 分支输出提示信息。
处理用户输入并进行数值计算是编程的基础。以下示例展示了如何接收字符串输入,转换为浮点数后求和。
# Filename : test.py
# 用户输入数字
num1 = input('输入第一个数字:')
num2 = input('输入第二个数字:')
# 求和
sum_val = float(num1) + float(num2)
# 显示计算结果
print('数字 {0} 和 {1} 相加结果为:{2}'.format(num1, num2, sum_val))
注意:input() 函数返回的是字符串类型,必须通过 float() 或 int() 进行类型转换才能进行数学运算。
Python 标准库 random 提供了丰富的随机数生成功能。randint(a, b) 用于生成 [a, b] 范围内的整数。
import random
print(random.randint(0, 9))
每次执行该代码将返回 0 到 9 之间的一个随机整数。这在模拟测试、游戏开发或数据打乱场景中非常有用。
使用解包操作符 * 可以将列表中的元素展开为多个独立参数。这对于需要不定数量参数的函数调用特别方便。
my_list = [1, 2, 3, 4]
print(my_list) # 输出列表对象:[1, 2, 3, 4]
print(*my_list) # 输出解包后的元素:1 2 3 4
此特性不仅可用于打印,更常用于函数调用,如 func(*args)。
利用序列解包语法,可以轻松提取列表中间的子集,忽略首尾元素。
_, *elements_in_the_middle, _ = [1, 2, 3, 4, 5, 6, 7, 8]
print(elements_in_the_middle) # 输出:[2, 3, 4, 5, 6, 7]
这里 _ 代表丢弃首尾元素,*elements_in_the_middle 捕获中间所有剩余元素。
Python 支持元组解包赋值,允许在一行内同时初始化多个变量。
one, two, three, four = 1, 2, 3, 4
这种写法简洁高效,避免了重复声明变量的过程。
列表对象的 clear() 方法用于移除列表中所有元素,使列表变为空。
RUNOOB = [6, 0, 4, 1]
print('清空前:', RUNOOB)
RUNOOB.clear()
print('清空后:', RUNOOB)
执行后列表内存被释放但对象依然存在,适合需要复用列表容器的场景。
枚举(Enum)将一组符号名称绑定到唯一的常量值上,提高代码的可读性和安全性。
from enum import Enum
class Status(Enum):
NO_STATUS = -1
NOT_STARTED = 0
IN_PROGRESS = 1
COMPLETED = 2
print(Status.IN_PROGRESS.name) # 输出成员名:IN_PROGRESS
print(Status.COMPLETED.value) # 输出成员值:2
相比使用魔法数字,枚举使得状态管理更加清晰且不易出错。
使用乘法运算符 * 可以直接复制字符串内容。
name = "Banana"
print(name * 4) # 输出:BananaBananaBananaBanana
这在生成占位符、分隔线或重复文本格式时非常便捷。
calendar 模块提供了处理日期和时间的功能。monthrange(year, month) 返回一个元组,包含当月第一天是星期几以及当月的总天数。
import calendar
monthRange = calendar.monthrange(2016, 9)
print(monthRange)
输出结果为 (3, 30),表示 2016 年 9 月 1 日是星期四(索引 3),该月共有 30 天。
判断素数是经典的算法问题。以下代码实现了区间内的素数筛选。
lower = int(input("输入区间最小值: "))
upper = int(input("输入区间最大值: "))
for num in range(lower, upper + 1):
if num > 1:
for i in range(2, num):
if (num % i) == 0:
break
else:
print(num)
逻辑说明:大于 1 的数才可能是素数。内部循环尝试用 2 到 num-1 之间的数去除 num,若能整除则不是素数。若内部循环未触发 break,则说明是素数。
定义函数计算差值时,需注意参数顺序。使用命名参数可以避免因位置不同导致的逻辑错误。
def subtract(a, b):
return a - b
print((subtract(1, 3))) # 输出:-2
print((subtract(3, 1))) # 输出:2
# 使用命名参数确保顺序明确
print((subtract(a=1, b=3))) # 输出:-2
print((subtract(b=3, a=1))) # 输出:-2
这是一个典型的数据结构原地重排问题。目标是将顺序表中所有奇数移动到偶数之前,要求时间复杂度 O(n),空间复杂度 O(1)。
算法思路:使用双指针,左指针向右寻找偶数,右指针向左寻找奇数,交换两者位置,直到指针相遇。
// 伪代码示意
void move(SqList &L)
{
int i = 0, j = L.length - 1, k;
ElemType temp;
while(i < j)
{
// 从左向右找偶数
while(L.data[i] % 2 == 1)
i++;
// 从右向左找奇数
while(L.data[j] % 2 == 0)
j--;
if(i < j)
{
temp = L.data[i];
L.data[i] = L.data[j];
L.data[j] = temp;
}
}
}
将顺序表中的元素顺序反转,同样要求空间复杂度 O(1)。
算法思路:首尾对称交换。只需扫描前半部分,将第 i 个元素与倒数第 i 个元素交换。
void reverse(SqList &L)
{
int i;
ElemType x;
// 只扫描前半部分
for(i = 0; i < L.length / 2; i++)
{
x = L.data[i];
// 交换对应元素
L.data[i] = L.data[L.length - i - 1];
L.data[L.length - i - 1] = x;
}
}
注意:循环条件应为 i < L.length / 2,避免重复交换或越界。
从顺序表中删除最小值元素,并用最后一个元素填补空缺。
算法思路:遍历查找最小值及其下标,删除后将末尾元素移至该位置,长度减一。
bool Delete_Min(SqList &L, ElemType &value)
{
if(L.length == 0)
return false;
value = L.data[0];
int pos = 0;
int i;
// 查找最小值
for(i = 1; i < L.length; i++)
{
if(L.data[i] < value)
{
value = L.data[i];
pos = i;
}
}
// 删除位置由最后一个元素填补
L.data[pos] = L.data[L.length - 1];
L.length--;
return true;
}
扩展上一题,删除区间 [x, y] 内的所有元素。
算法思路:使用快慢指针。慢指针 k 记录保留元素的位置,快指针 i 遍历数组。若当前元素不在区间内,则复制到 k 位置并递增 k。
void del_xy(SqList &L, ElemType x, ElemType y)
{
int i = 0, k = 0;
while(i < L.length)
{
if(L.data[i] >= x && L.data[i] <= y)
k++;
else
L.data[i - k] = L.data[i];
}
L.length = L.length - k;
}
原代码中存在笔误 L.data[j],已修正为 L.data[i]。此方法保证了 O(n) 的时间复杂度和 O(1) 的空间复杂度。
这是编程入门的经典练习,考察嵌套循环的使用。
for i in range(1, 10):
for j in range(1, i + 1):
print('{}x{}={}\t'.format(j, i, i * j), end='')
print()
外层循环控制行数,内层循环控制列数。end='' 参数确保在同一行输出,每行结束后换行。
在实际开发中应用上述代码时,建议遵循以下规范以提升代码质量:
以上代码片段涵盖了 Python 基础语法及常见的线性表算法操作。掌握这些基础模式有助于构建更复杂的程序逻辑。建议在实际项目中结合具体需求灵活应用,并注意边界条件的处理。通过不断练习与总结,开发者能够逐步建立起扎实的编程思维体系。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online