Python 学习三 Python字符串拼接详解

文章目录

  • Python字符串拼接详解
  • 现代C++字符串拼接方法
    • [1. 使用`+`运算符(最基础)](#1. 使用+运算符(最基础))
    • [2. 使用`+=`运算符(原地拼接,高效)](#2. 使用+=运算符(原地拼接,高效))
    • [3. 使用`append()`方法](#3. 使用append()方法)
    • [4. 使用`std::ostringstream`(最灵活)](#4. 使用std::ostringstream(最灵活))
    • [5. 使用`std::format()`(C++20,推荐)](#5. 使用std::format()(C++20,推荐))
    • [6. 性能优化:预分配空间](#6. 性能优化:预分配空间)
    • [7. 字符串视图`std::string_view`(C++17,避免拷贝)](#7. 字符串视图std::string_view(C++17,避免拷贝))
    • [8. 高级示例:字符串拼接工具函数](#8. 高级示例:字符串拼接工具函数)
    • [9. 性能比较示例](#9. 性能比较示例)
    • [10. 最佳实践总结](#10. 最佳实践总结)
    • 实用建议

Python字符串拼接详解

1. 使用"+"号完成字符串拼接

基本示例

py 复制代码
# 1. 字符串变量之间的拼接
str1 = "你好,"
str2 = "世界!"
result = str1 + str2
print(result)  # 输出:你好,世界!

# 2. 字符串变量与字面量的拼接
name = "小明"
greeting = "你好," + name + "!"
print(greeting)  # 输出:你好,小明!

# 3. 多个字符串拼接
sentence = "Python" + "是" + "一门" + "强大的" + "编程语言"
print(sentence)  # 输出:Python是一门强大的编程语言

2. 注意事项:无法和非字符串类型直接拼接

❌ 错误示例

py 复制代码
# 尝试将字符串与整数拼接 - 会报错
age = 25
# message = "我今年" + age + "岁"  # TypeError: can only concatenate str to str

# 尝试将字符串与浮点数拼接 - 会报错
price = 19.99
# info = "价格:" + price  # TypeError: can only concatenate str to str

# 尝试将字符串与布尔值拼接 - 会报错
is_active = True
# status = "状态:" + is_active  # TypeError: can only concatenate str to str

3. 解决方案

方法1:使用str()函数进行类型转换

py 复制代码
# 将非字符串类型转换为字符串后再拼接
age = 25
message = "我今年" + str(age) + "岁"
print(message)  # 输出:我今年25岁

price = 19.99
info = "价格:" + str(price) + "元"
print(info)  # 输出:价格:19.99元

is_active = True
status = "状态:" + str(is_active)
print(status)  # 输出:状态:True

方法2:使用f-string(Python 3.6+推荐)

py 复制代码
# 使用f-string,自动处理类型转换
name = "张三"
age = 30
height = 175.5
is_student = False

info = f"姓名:{name},年龄:{age},身高:{height}cm,是否学生:{is_student}"
print(info)  # 输出:姓名:张三,年龄:30,身高:175.5cm,是否学生:False

方法3:使用format()方法

py 复制代码
# 使用format()方法
quantity = 3
item = "苹果"
price = 5.5

order = "我买了{}个{},总共{}元".format(quantity, item, price)
print(order)  # 输出:我买了3个苹果,总共5.5元

方法4:使用%格式化

py 复制代码
# 使用%格式化(旧式,但仍可用)
score = 95.5
result = "考试得分:%.1f分" % score
print(result)  # 输出:考试得分:95.5分

方法5:使用join()方法连接字符串列表

py 复制代码
# 特别适合连接多个字符串
words = ["Python", "是", "一门", "优秀的", "编程语言"]
sentence = "".join(words)
print(sentence)  # 输出:Python是一门优秀的编程语言

# 可以指定分隔符
numbers = ["1", "2", "3", "4", "5"]
result = "-".join(numbers)
print(result)  # 输出:1-2-3-4-5

4. 综合示例

py 复制代码
# 综合示例:用户信息格式化
def format_user_info(name, age, city, balance):
    """格式化用户信息"""
    # 使用f-string(推荐)
    info1 = f"用户:{name},{age}岁,来自{city},账户余额:{balance}元"
    
    # 使用+和str()转换
    info2 = "用户:" + name + "," + str(age) + "岁,来自" + city + ",账户余额:" + str(balance) + "元"
    
    # 使用format()
    info3 = "用户:{},{}岁,来自{},账户余额:{}元".format(name, age, city, balance)
    
    return info1, info2, info3

# 测试
user_info1, user_info2, user_info3 = format_user_info("李四", 28, "北京", 1500.75)
print("f-string方式:", user_info1)
print("+拼接方式:", user_info2)
print("format方式:", user_info3)

5. 性能比较

py 复制代码
import time

# 测试不同拼接方式的性能
def test_performance():
    iterations = 100000
    
    # 测试+拼接
    start = time.time()
    result = ""
    for i in range(iterations):
        result = "数字:" + str(i)
    time1 = time.time() - start
    
    # 测试f-string
    start = time.time()
    for i in range(iterations):
        result = f"数字:{i}"
    time2 = time.time() - start
    
    # 测试format
    start = time.time()
    for i in range(iterations):
        result = "数字:{}".format(i)
    time3 = time.time() - start
    
    print(f"+拼接耗时:{time1:.4f}秒")
    print(f"f-string耗时:{time2:.4f}秒")
    print(f"format耗时:{time3:.4f}秒")

test_performance()

总结

  1. "+"号拼接:简单直接,但遇到非字符串类型需要显式转换

  2. f-string:Python 3.6+推荐,代码简洁,自动类型转换,性能好

  3. format():功能强大,支持复杂格式化

  4. join():适合连接字符串列表,效率高

建议:在Python 3.6+版本中,优先使用f-string进行字符串格式化,它既简洁又高效,还能自动处理类型转换问题。

现代C++字符串拼接方法

1. 使用+运算符(最基础)

cpp 复制代码
#include <iostream>
#include <string>

int main() {
    // 1. 使用+运算符拼接字符串
    std::string str1 = "Hello, ";
    std::string str2 = "World!";
    std::string result = str1 + str2;
    std::cout << result << std::endl;  // 输出: Hello, World!
    
    // 2. 字符串与字面量拼接
    std::string name = "Alice";
    std::string greeting = "Hello, " + name + "!";
    std::cout << greeting << std::endl;  // 输出: Hello, Alice!
    
    return 0;
}

2. 使用+=运算符(原地拼接,高效)

cpp 复制代码
#include <iostream>
#include <string>

int main() {
    std::string text = "开始";
    
    // 使用+=进行原地拼接,避免创建临时对象
    text += "添加";
    text += "更多";
    text += "内容";
    
    std::cout << text << std::endl;  // 输出: 开始添加更多内容
    
    return 0;
}

3. 使用append()方法

cpp 复制代码
#include <iostream>
#include <string>

int main() {
    std::string str = "C++";
    
    // 1. 追加字符串
    str.append(" Programming");
    std::cout << str << std::endl;  // 输出: C++ Programming
    
    // 2. 追加子字符串
    str.append(" is awesome!", 3, 8);  // 从位置3开始,取8个字符
    std::cout << str << std::endl;  // 输出: C++ Programming awesome
    
    // 3. 追加多个相同字符
    str.append(5, '!');
    std::cout << str << std::endl;  // 输出: C++ Programming awesome!!!!!
    
    return 0;
}

4. 使用std::ostringstream(最灵活)

cpp 复制代码
#include <iostream>
#include <sstream>
#include <string>

int main() {
    std::ostringstream oss;
    
    // 可以混合不同类型,自动转换
    std::string name = "Bob";
    int age = 25;
    double score = 95.5;
    
    oss << "姓名: " << name 
        << ", 年龄: " << age 
        << ", 分数: " << score;
    
    std::string result = oss.str();
    std::cout << result << std::endl;
    // 输出: 姓名: Bob, 年龄: 25, 分数: 95.5
    
    return 0;
}

5. 使用std::format()(C++20,推荐)

cpp 复制代码
#include <iostream>
#include <string>
#include <format>

int main() {
    // C++20 引入的std::format,类似Python的f-string
    std::string name = "Charlie";
    int age = 30;
    double salary = 85000.50;
    
    // 格式化字符串
    std::string info = std::format("员工: {}, 年龄: {}, 薪资: {:.2f}", 
                                   name, age, salary);
    std::cout << info << std::endl;
    // 输出: 员工: Charlie, 年龄: 30, 薪资: 85000.50
    
    return 0;
}

6. 性能优化:预分配空间

cpp 复制代码
#include <iostream>
#include <string>
#include <vector>

int main() {
    // 如果需要拼接大量字符串,预分配空间可以提高性能
    std::vector<std::string> words = {"This", "is", "a", "long", "sentence", 
                                      "that", "needs", "to", "be", "concatenated"};
    
    // 方法1: 使用reserve预分配空间
    std::string result1;
    result1.reserve(100);  // 预分配100字节空间
    for (const auto& word : words) {
        result1 += word + " ";
    }
    std::cout << result1 << std::endl;
    
    // 方法2: 使用ostringstream
    std::ostringstream oss;
    for (const auto& word : words) {
        oss << word << " ";
    }
    std::string result2 = oss.str();
    std::cout << result2 << std::endl;
    
    return 0;
}

7. 字符串视图std::string_view(C++17,避免拷贝)

cpp 复制代码
#include <iostream>
#include <string>
#include <string_view>

std::string create_message(std::string_view prefix, 
                          std::string_view name, 
                          std::string_view suffix) {
    // 使用string_view避免不必要的字符串拷贝
    std::string result;
    result.reserve(prefix.size() + name.size() + suffix.size());
    result.append(prefix);
    result.append(name);
    result.append(suffix);
    return result;
}

int main() {
    std::string name = "David";
    
    // 传递string_view,不会复制字符串
    auto message = create_message("Hello, ", name, "! Welcome!");
    std::cout << message << std::endl;
    // 输出: Hello, David! Welcome!
    
    return 0;
}

8. 高级示例:字符串拼接工具函数

cpp 复制代码
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <type_traits>

// 1. 可变参数模板拼接(C++11及以上)
template<typename... Args>
std::string concat(Args&&... args) {
    std::ostringstream oss;
    (oss << ... << std::forward<Args>(args));  // 折叠表达式(C++17)
    return oss.str();
}

// 2. 拼接字符串列表,可指定分隔符
std::string join(const std::vector<std::string>& strings, 
                const std::string& delimiter = ", ") {
    if (strings.empty()) return "";
    
    std::ostringstream oss;
    oss << strings[0];
    for (size_t i = 1; i < strings.size(); ++i) {
        oss << delimiter << strings[i];
    }
    return oss.str();
}

int main() {
    // 使用可变参数模板
    std::string name = "Eve";
    int age = 28;
    double height = 1.75;
    
    auto info = concat("姓名: ", name, 
                      ", 年龄: ", age, 
                      ", 身高: ", height, "m");
    std::cout << info << std::endl;
    
    // 使用join函数
    std::vector<std::string> fruits = {"苹果", "香蕉", "橙子", "葡萄"};
    std::string fruit_list = join(fruits, " | ");
    std::cout << "水果: " << fruit_list << std::endl;
    // 输出: 水果: 苹果 | 香蕉 | 橙子 | 葡萄
    
    return 0;
}

9. 性能比较示例

cpp 复制代码
#include <iostream>
#include <string>
#include <sstream>
#include <chrono>
#include <vector>

void test_performance() {
    const int iterations = 100000;
    
    // 测试1: 使用+运算符
    auto start = std::chrono::high_resolution_clock::now();
    std::string result1;
    for (int i = 0; i < iterations; ++i) {
        result1 = "数字: " + std::to_string(i);
    }
    auto time1 = std::chrono::duration_cast<std::chrono::milliseconds>(
        std::chrono::high_resolution_clock::now() - start);
    
    // 测试2: 使用+=运算符
    start = std::chrono::high_resolution_clock::now();
    std::string result2;
    for (int i = 0; i < iterations; ++i) {
        result2 = "数字: ";
        result2 += std::to_string(i);
    }
    auto time2 = std::chrono::duration_cast<std::chrono::milliseconds>(
        std::chrono::high_resolution_clock::now() - start);
    
    // 测试3: 使用ostringstream
    start = std::chrono::high_resolution_clock::now();
    for (int i = 0; i < iterations; ++i) {
        std::ostringstream oss;
        oss << "数字: " << i;
        std::string result3 = oss.str();
    }
    auto time3 = std::chrono::duration_cast<std::chrono::milliseconds>(
        std::chrono::high_resolution_clock::now() - start);
    
    std::cout << "性能测试结果(" << iterations << "次迭代):" << std::endl;
    std::cout << "+ 运算符: " << time1.count() << "ms" << std::endl;
    std::cout << "+= 运算符: " << time2.count() << "ms" << std::endl;
    std::cout << "ostringstream: " << time3.count() << "ms" << std::endl;
}

int main() {
    test_performance();
    return 0;
}

10. 最佳实践总结

方法 适用场景 优点 缺点
+运算符 简单拼接少量字符串 语法简单直观 创建临时对象,性能较差
+=运算符 逐步构建字符串 原地修改,效率较高 代码可能冗长
append() 需要追加子串或重复字符 功能丰富 语法相对复杂
std::ostringstream 混合类型拼接 自动类型转换,非常灵活 性能开销较大
std::format()(C++20) 格式化字符串 类似Python f-string,现代化 需要C++20支持
预分配空间 大量字符串拼接 避免重复分配,性能最好 需要预估大小

实用建议

  1. 简单拼接 :少量字符串用++=

  2. 混合类型 :用std::ostringstreamstd::format()(C++20)

  3. 性能关键 :预分配空间,使用reserve()+append()

  4. 现代C++ :优先使用std::format()(C++20)和std::string_view

  5. 避免拷贝 :传递大字符串时使用const std::string&std::string_view

cpp 复制代码
// 现代C++最佳实践示例
#include <format>  // C++20
#include <string_view>

void process_data(std::string_view input) {
    // 使用string_view避免拷贝
    // 使用format进行格式化
    auto message = std::format("处理数据: {}, 长度: {}", 
                              input, input.length());
    std::cout << message << std::endl;
}
相关推荐
其美杰布-富贵-李10 小时前
SpaceClaim流体域创建学习笔记
笔记·学习
诸葛老刘10 小时前
next.js 框架中的约定的特殊参数名称
开发语言·javascript·ecmascript
测试老哥10 小时前
Postman接口测试基本操作
自动化测试·软件测试·python·测试工具·测试用例·接口测试·postman
冬夜戏雪10 小时前
【java学习日记】【2025.12.6】【6/60】
学习
霸王大陆10 小时前
《零基础学 PHP:从入门到实战》模块十:从应用到精通——掌握PHP进阶技术与现代化开发实战-2
android·开发语言·php
winfredzhang10 小时前
基于wxPython的TodoList任务管理器开发详解
python·wxpython·todolist·持久
行云流水200010 小时前
青少年编程学习:考级与竞赛结合提升能力的方法
人工智能·学习·青少年编程
釉色清风10 小时前
在openEuler玩转Python
linux·开发语言·python
han_hanker10 小时前
这里使用 extends HashMap<String, Object> 和 类本身定义变量的优缺点
java·开发语言