python 中的 f 字符串及其常见用法

本文围绕 Python 的 f-string 展开,介绍其是自 Python 3.6 起可用的字符串格式化最新语法,具有更快、易读等优点。还对比了 Python 常见的三种格式化方法,详细汇总了 f-string 的常见用法,如接收表达式、对字典取值等,强调需 Python 3.6 以上版本支持。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有个小伙伴看到之前写的Faker库相关文章中出现了f'{}' 这个东东,他问我是啥意思?

实际上,这个是使用到了 f-string 作为格式化的方法,为此简单罗列了一下 f-string 及其常见用法,给小伙伴们作为参考。

一、f-string是什么?

Python f-string 是执行字符串格式化的最新 Python 语法。自 Python 3.6 起可用。
Python f 字符串提供了一种更快,更易读,更简明且不易出错的在 Python 中格式化字符串的方式。f 字符串的前缀为f,并使用{}括号评估值。在冒号后指定用于类型,填充或对齐的格式说明符。例如:f'{price:.3f}',其中price是变量名, .3f 表明精度(保留三位小数)。

二、格式化常见用法

Python中常见的格式化方法有三种,分别是:

1. % 符号+格式指定符

2. format()函数

3. f-string

下面举个例子,结果都是“【张三】今年【18】岁”,但是使用了不同的格式化方法:

name = "张三"
age = 18

# 最原始提供的字符串替换方法,使用了 % 运算符和经典字符串格式指定,如 %s %d 等
print("【%s】今年【%d】岁" % (name, age))  # 【张三】今年【18】岁

# Python 3.0 新增了 format() 函数,可以提供高级的格式化选项
print("【{}】今年【{}】岁".format(name, age))  # 【张三】今年【18】岁

# Python 3.6 f-string出现,使得格式化方法更加灵活,字符串前缀为 f,并使用 {} 评估值
print(f"【{name}】今年【{age}】岁")  # 【张三】今年【18】岁

三、f-string常见用法汇总

下面分别举例说明 f-string的一些常见用法

1. f-string 中接收表达式

num = 12
price = 6
# f-string 中可以接收表达式
print(f'【{num}】个苹果,每个【{price}】元,一共要花【{num * price}】元')
# 【12】个苹果,每个【6】元,一共要花【72】元

2. f-string 可以对字典取值

user = {"name": "Ace", "job": "teacher"}
print(f'【{user["name"]}】的工作是【{user["job"]}】')
# 【Ace】的工作是【teacher】

3. f-string 针对多行数据进行格式化

name = "李四"
age = 28
job = "码农"
msg = (
    f'Name: {name}\n'
    f'Age: {age}\n'
    f'Job: {job}'
)  # 注意 msg 使用了 () 进行包裹
print(msg)
# Name: 李四
# Age: 28
# Job: 码农

4. f-string 中调用函数

def my_max(x, y):
    """
    三目运算比较两个数字大小
    :param x: int x
    :param y: int y
    :return: x 和 y 中较大的数字
    """
    return x if x > y else y


a = 3
b = 4
print(f'【{a}】和【{b}】中较大的是【{my_max(a, b)}】')
# 【3】和【4】中较大的是【4】

5. f-string 转义用法

print(f"Python 使用 {{}} 来计算f-string中的变量")
# Python 使用 {} 来计算f-string中的变量

print(f'你真的很\'厉害\'')  # 注意:单引号中想继续使用单引号,那就需要进行转义
# 你真的很'厉害'

6. f-string 格式化浮点数

val = 11
# 通过 : 后跟 浮点数标识 ,可以实现格式化浮点数
print(f'{val:.3f}')  # 11.000
print(f'{val:.4f}')  # 11.0000

7. f-string 格式化宽度

for i in range(1, 11):
    print(f'{i:02} {i * i:3} {i * i * i:4}')
# 01   1    1
# 02   4    8
# 03   9   27
# 04  16   64
# 05  25  125
# 06  36  216
# 07  49  343
# 08  64  512
# 09  81  729
# 10 100 1000

8. f-string 对齐字符串

s1 = 'a'
s2 = 'ab'
s3 = 'abc'
s4 = 'abcd'
# 将输出的宽度设置为十个字符。 使用 > 符号,让输出结果右对齐。
print(f'{s1:>10}')
print(f'{s2:>10}')
print(f'{s3:>10}')
print(f'{s4:>10}')
#          a
#         ab
#        abc
#       abcd
# 实际上,只要大于最大的字符串长度,就可以实现右对齐,感兴趣可以试下小于最大字符串长度会有什么表现

9. f-string 格式化时间

import datetime

now = datetime.datetime.now()
print(f'{now:%Y-%m-%d %H:%M}')
# 2023-04-02 21:07

10. f-string 接收对象 ,注意:对象必须定义了__str__()或__repr__()函数

class User:
    def __init__(self, name, job):
        self.name = name
        self.job = job

    def __repr__(self):
        return f"{self.name} is a {self.job}"


u = User('Ace', 'teacher')

print(f'{u}')
# Ace is a teacher

以上就是 f-string 常见的一些用法,使用f-string格式化数据可以更加灵活,满足多样化的需求,但注意,一定要Python3.6以上的版本才支持!

注意:Python3.6以上的版本才支持!

注意:Python3.6以上的版本才支持!

注意:Python3.6以上的版本才支持!

<think>嗯,用户想了解Python常见字符串面试题。首先,我得回忆一下常见的考点。字符串Python里是基础但重要的类型,面试题通常涉及基本操作、特性以及算法应用。 首先想到的是字符串的不可变性。这个点经常被考到,比如修改字符串中的某个字符,或者拼接字符串的效率问题。需要解释为什么字符串不可变,以及这样设计的优缺点。例如,使用加号拼接字符串和join方法的区别,可能涉及到内存和性能的问题。 然后是反转字符串,这应该是一个常见的题目。可能有多种方法,比如切片[::-1],或者使用循环逆序拼接。还有递归的方法,不过可能效率不高。此外,要考虑Unicode字符的情况,比如处理包含多字节字符的字符串,比如emoji或者中文,这时候反转会不会出问题? 接下来是字符串的常用方法,比如split()、strip()、replace()、find()、startswith()、endswith()等。这些方法在面试中可能会被问到具体用法或者应用场景。比如如何去除字符串两边的空格,如何分割字符串,替换子串等等。 字符串的格式化也是一个考点,包括旧式的%格式化,str.format()方法,以及Python3.6引入的f-string。需要比较它们的优缺点,比如f-string的可读性和执行效率更高。 检查字符串是否由数字构成,这个问题可能涉及到isdigit()方法,但也要注意全角数字或者其他语言中的数字字符的情况,这时候可能需要更全面的判断方法,比如尝试转换成float或者int,捕获异常来判断。 回文串的判断也是一个经典题目。回文是指正读反读都一样的字符串,比如"level"。常见的方法是将字符串反转后比较,或者用双指针法从两端向中间检查。需要注意大小写的处理,以及是否忽略空格和标点符号,不同的题目要求可能不同。 统计字符出现次数,可以用字典或者collections模块的Counter类。比如统计每个字符出现的次数,或者找出出现最多的字符。这可能需要遍历字符串,然后使用哈希表来记录频率。 字符串的排列组合问题,比如找出所有可能的排列,或者检查两个字符串是否为彼此的排列(即字符相同但顺序不同)。这可能涉及到排序后比较,或者用哈希表统计各字符的出现次数是否一致。 子串查找问题,比如实现类似str.find()的功能,或者KMP算法解决高效查找。不过在实际面试中,可能更关注暴力解法或者对内置方法的了解,以及时间复杂度分析。 字符串的编码问题,比如ASCII、Unicode、UTF-8的区别,如何处理中文字符,编码和解码的方法。可能还会问到字符串Python2和Python3中的区别,比如Python3的str是Unicode,而bytes是字节序列。 另外,内存管理方面的问题,比如字符串驻留(interning),小字符串的缓存机制。例如,a = 'hello'和b = 'hello'是否指向同一个对象,而大字符串可能不会。这涉及到Python的优化机制。 还有,字符串和列表的转换,比如将字符串转换为列表进行修改后再转回字符串。例如,处理不可变字符串时,可能需要先转成列表,修改特定位置字符,再join成字符串。 可能还有一些算法题,比如最长不重复子串、最长回文子串、字符串转换整数(atoi)等。这些题目需要更复杂的逻辑和算法设计,比如滑动窗口、动态规划等。 需要分门别类,把这些知识点整理出来,用清晰的例子说明。比如反转字符串,给出不同的实现方法,比较它们的优缺点。对于字符串方法,举几个常用的例子,说明应用场景。在检查回文时,指出可能的陷阱,比如大小写和空格的处理。 还要注意,Python中的字符串是不可变的,所以每次操作都会生成新的字符串对象,这在涉及大量字符串拼接时会影响性能,这时候应该使用join方法而不是多次加号拼接。 可能还需要提到正则表达式的应用,比如用re模块进行复杂的字符串匹配和替换,这在处理复杂模式时非常有用,比如验证电子邮件格式、提取URL等。 最后,总结常见的面试题类型,帮助用户系统地复习字符串相关的知识点,并给出练习的建议,比如刷LeetCode上的相关题目,或者手动实现一些字符串操作函数来加深理解。</think>以下是一些Python常见字符串相关面试题及解析,按知识点分类整理: --- ### 一、基础操作与特性 1. **字符串不可变性** Q: 为什么说Python字符串是不可变的? A: 字符串对象创建后无法修改,任何操作(如拼接、替换)都会生成新对象。 ```python s = "hello" s[0] = 'H' # 报错:TypeError ``` 2. **拼接效率** Q: `s1 + s2` 和 `"".join([s1, s2])` 哪个更高效? A: `join()` 更高效,因为`+`会反复创建新对象,而`join()`一次性分配内存。 --- ### 二、反转字符串 1. **切片法** ```python s = "hello" reversed_s = s[::-1] # "olleh" ``` 2. **递归法** ```python def reverse_str(s): return reverse_str(s[1:]) + s[0] if s else "" ``` 3. **Unicode字符处理** 注意多字节字符(如emoji)的反转可能出错,需确保正确处理Unicode。 --- ### 三、字符串方法应用 1. **常用方法** ```python " abc ".strip() # "abc" "a,b,c".split(",") # ["a", "b", "c"] "hello".replace("l", "x") # "hexxo" ``` 2. **格式化方法** ```python name = "Alice" f_str = f"Hello {name}" # f-string(推荐) ``` --- ### 四、算法问题 1. **回文判断** ```python def is_palindrome(s): s = s.lower().replace(" ", "") return s == s[::-1] ``` 2. **最长不重复子串** **滑动窗口法**: ```python def length_of_longest_substring(s): char_map = {} left = max_len = 0 for right, c in enumerate(s): if c in char_map and char_map[c] >= left: left = char_map[c] + 1 char_map[c] = right max_len = max(max_len, right - left + 1) return max_len ``` --- ### 五、编码与内存 1. **编码问题** ```python s = "你好" bytes_s = s.encode("utf-8") # b'\xe4\xbd\xa0\xe5\xa5\xbd' ``` 2. **字符串驻留(Interning)** Python会缓存小字符串(如单单词),`a = "hello"; b = "hello"`,`a is b` 返回`True`。 --- ### 六、其他高频问题 1. **检查字符串是否为数字** ```python def is_number(s): try: float(s) return True except ValueError: return False ``` 2. **统计字符频率** ```python from collections import Counter s = "abracadabra" counter = Counter(s) print(counter) # Counter({'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1}) ``` --- ### 练习建议 - 刷题平台:LeetCode(如题目:反转字符串、有效括号、字符串转换整数等)。 - 手动实现:`split()`、`strip()`等基础方法,加深理解底层逻辑。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值