Practical Python教程:深入理解Python序列操作

Practical Python教程:深入理解Python序列操作

practical-python Practical Python Programming (course by @dabeaz) practical-python 项目地址: https://gitcode.com/gh_mirrors/pr/practical-python

序列数据类型概述

Python中有三种主要的序列数据类型,它们都是有序的、可通过整数索引访问,并且具有长度属性:

  1. 字符串(String):由字符组成的序列,如 'Hello'
  2. 列表(List):可变元素序列,如 [1, 4, 5]
  3. 元组(Tuple):不可变元素序列,如 ('GOOG', 100, 490.1)
# 序列基础操作示例
greeting = 'Hello'             # 字符串
numbers = [1, 4, 5]            # 列表
stock_info = ('GOOG', 100, 490.1)  # 元组

# 索引访问
print(greeting[0])    # 输出 'H'
print(numbers[-1])    # 输出 5
print(stock_info[1])  # 输出 100

# 获取长度
print(len(greeting))  # 输出 5

序列操作技巧

序列复制与连接

序列支持乘法操作实现复制,以及加法操作实现同类型序列的连接:

# 序列复制
msg = 'Hi'
print(msg * 3)  # 输出 'HiHiHi'

nums = [1, 2]
print(nums * 2)  # 输出 [1, 2, 1, 2]

# 序列连接
a = (1, 2)
b = (3, 4)
print(a + b)  # 输出 (1, 2, 3, 4)

注意:不同类型序列不能直接连接,会引发TypeError。

切片操作详解

切片是获取子序列的强大工具,语法为 s[start:end],包含start索引,不包含end索引:

data = [0,1,2,3,4,5,6,7,8]

print(data[2:5])  # 输出 [2,3,4]
print(data[-5:])  # 输出 [4,5,6,7,8] (最后5个元素)
print(data[:3])   # 输出 [0,1,2] (前3个元素)

切片特性:

  • 省略start默认为0,省略end默认为序列长度
  • 支持负索引,从末尾开始计数
  • 切片结果包含start索引元素,不包含end索引元素

切片重新赋值

列表切片支持重新赋值和删除操作:

# 切片重新赋值
nums = [0,1,2,3,4,5]
nums[1:3] = [10,11,12]  # 替换切片并可以改变长度
print(nums)  # 输出 [0,10,11,12,3,4,5]

# 切片删除
del nums[2:4]
print(nums)  # 输出 [0,10,3,4,5]

序列迭代与控制流

基本迭代与循环控制

# 基本迭代
values = [1, 4, 9, 16]
for val in values:
    print(val)

# break中断循环
for name in names:
    if name == 'Target':
        break
    print(name)

# continue跳过当前迭代
for line in content:
    if not line.strip():  # 跳过空行
        continue
    process(line)

数值范围迭代

range()函数生成数值序列,常用于计数循环:

# 基本range用法
for i in range(5):      # 0到4
    print(i, end=' ')   # 输出 0 1 2 3 4

# 指定起始和步长
for i in range(10,0,-1): # 10到1,步长-1
    print(i, end=' ')    # 输出 10 9 8 ... 1

for i in range(0,10,2):  # 0到8,步长2
    print(i, end=' ')    # 输出 0 2 4 6 8

实用序列工具函数

enumerate() 获取索引和值

names = ['Alice', 'Bob', 'Charlie']
for index, name in enumerate(names, start=1):
    print(f"{index}. {name}")

# 输出:
# 1. Alice
# 2. Bob
# 3. Charlie

zip() 并行迭代多个序列

headers = ['name', 'shares', 'price']
values = ['AAPL', 100, 542.3]

# 创建键值对
record = dict(zip(headers, values))
print(record)  
# 输出: {'name': 'AAPL', 'shares': 100, 'price': 542.3}

# 多序列并行迭代
a = [1, 2, 3]
b = ['a', 'b', 'c']
for num, char in zip(a, b):
    print(num, char)

实际应用案例

处理CSV数据

# 使用zip处理CSV头部和数据行
import csv

def process_portfolio(filename):
    with open(filename) as f:
        rows = csv.reader(f)
        headers = next(rows)  # 读取标题行
        for rowno, row in enumerate(rows, 1):
            try:
                record = dict(zip(headers, row))
                # 处理记录...
            except ValueError as e:
                print(f"Row {rowno}: Bad data - {row}")

字典键值反转

prices = {'GOOG': 490.1, 'AAPL': 123.5}

# 反转键值对
inverted = list(zip(prices.values(), prices.keys()))
print(min(inverted))  # 输出 (123.5, 'AAPL')
print(max(inverted))  # 输出 (490.1, 'GOOG')

最佳实践建议

  1. 避免C风格索引循环:不要使用for i in range(len(data)),直接迭代序列元素或使用enumerate

  2. 利用序列解包:在迭代元组列表时,可以直接解包到多个变量

  3. zip处理不等长序列:注意zip会在最短序列结束时停止

  4. 序列操作选择

    • 需要修改数据:使用列表
    • 数据不变:使用元组
    • 文本处理:使用字符串

通过掌握这些序列操作技巧,可以编写出更简洁、高效的Python代码,特别是在数据处理任务中。

practical-python Practical Python Programming (course by @dabeaz) practical-python 项目地址: https://gitcode.com/gh_mirrors/pr/practical-python

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白来存

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值