下面是20种方法↓↓↓(文章末尾有分类)
目录
方法一:普通嵌套循环
for i in range(1, 10):
for j in range(1, i + 1):
print(f"{j}*{i}={i*j}", end="\t")
print()
-
特点: 简单直观,易于理解和实现。
-
优点: 效率较高,不需要额外的模块或复杂的语法。
-
缺点: 代码量较多,不够简洁。
方法二:使用字符串格式化和join方法
for i in range(1, 10):
print("\t".join(f"{j}*{i}={i*j}" for j in range(1, i+1)))
-
特点: 使用了字符串的
join()
方法,使得代码更简洁。 -
优点: 输出格式清晰,代码结构简单。
-
缺点: 仍然需要嵌套循环,代码量略大。
方法三:使用嵌套列表推导式
[print("\t".join(f"{j}*{i}={i*j}" for j in range(1, i+1))) for i in range(1, 10)]
-
特点: 使用了列表推导式,简洁而优雅。
-
优点: 代码紧凑,结构清晰。
-
缺点: 对于初学者可能不够易懂。
方法四:使用format方法
for i in range(1, 10):
for j in range(1, i + 1):
print('{}*{}={}'.format(j, i, i * j), end='\t')
print()
-
特点: 使用了字符串的
format()
方法,格式化输出。 -
优点: 与方法一类似,直观易懂。
-
缺点: 代码量较大,可读性稍差。
方法五:使用f-string和end参数
for i in range(1, 10):
for j in range(1, i + 1):
print(f"{j}*{i}={i*j}", end='\t')
print()
-
特点: 使用了 Python 3.6 新增的 f-string,简洁明了。
-
优点: 代码简单,易读易懂。
-
缺点: 对于不支持 Python 3.6 的环境可能不兼容。
方法六:使用str.format和sep参数
for i in range(1, 10):
print(*["{}*{}={}".format(j, i, i*j) for j in range(1, i+1)], sep='\t')
-
特点: 使用了
str.format()
方法和sep
参数,输出格式化。 -
优点: 结构清晰,可读性好。
-
缺点: 代码量较大。
方法七:使用列表推导式
[print(*[f"{j}*{i}={i*j}" for j in range(1, i+1)], sep='\t') for i in range(1, 10)]
-
特点: 结合了列表推导式和打印,简洁高效。
-
优点: 代码紧凑,简单易懂。
-
缺点: 可读性较差。
方法八:使用while循环
i = 1
while i < 10:
j = 1
while j <= i:
print(f"{j}*{i}={i*j}", end="\t")
j += 1
print()
i += 1
-
特点: 使用了
while
循环,控制流程清晰。 -
优点: 相比
for
循环,灵活性更高。 -
缺点: 代码量较大。
方法九:使用嵌套列表和列表解析
[[print(f"{j}*{i}={i*j}", end="\t") for j in range(1, i+1)], print()] for i in range(1, 10)]
-
特点: 利用了列表解析,使得代码更加简洁。
-
优点: 结构清晰,代码简洁。
-
缺点: 可读性较差,对于初学者可能不易理解。
方法十:使用itertools.product
import itertools
for i, j in itertools.product(range(1, 10), repeat=2):
if j <= i:
print(f"{j}*{i}={i*j}", end="\t")
if j == i:
print()
-
特点: 使用了 itertools.product 函数,生成笛卡尔积。
-
优点: 简洁高效,利用了 Python 的标准库。
-
缺点: 可读性稍差,对于初学者可能不太熟悉 itertools 模块。
方法十一:使用字符串乘法
for i in range(1, 10):
print('\t'.join(f"{j}*{i}={i*j}" for j in range(1, i+1)))
-
特点: 使用了字符串乘法,构建乘法表行。
-
优点: 简洁明了,无需额外的循环。
-
缺点: 对于初学者可能不够直观。
方法十二:使用递归函数
def print_multiplication_table(n, i=1):
if i > n:
return
print(*[f"{j}*{i}={i*j}" for j in range(1, i+1)], sep='\t')
print_multiplication_table(n, i+1)
print_multiplication_table(9)
-
特点: 使用了递归函数,简洁而巧妙。
-
优点: 代码结构清晰,利用了递归特性。
-
缺点: 可能会造成函数调用栈过深。
方法十三:使用map函数和lambda表达式
for i in range(1, 10):
print(*map(lambda j: f"{j}*{i}={i*j}", range(1, i+1)), sep='\t')
-
特点: 使用了 map 函数和 lambda 表达式,代码紧凑。
-
优点: 简洁高效,结构清晰。
-
缺点: 对于初学者可能不够直观。
方法十四:使用numpy数组
import numpy as np
table = np.fromfunction(lambda i, j: (j+1)*(i+1), (9, 9))
for i in range(9):
print('\t'.join(f"{j+1}*{i+1}={table[i, j]}" for j in range(i+1)))
-
特点: 使用了 NumPy 库,利用数组计算。
-
优点: 高效,适用于大规模数据。
-
缺点: 引入了外部库,可能需要额外安装。
方法十五:使用pandas DataFrame
import pandas as pd
df = pd.DataFrame([[f"{j}*{i}={i*j}" for j in range(1, i+1)] for i in range(1, 10)])
print(df.to_string(index=False, header=False))
-
特点: 使用了 Pandas 库,输出为 DataFrame 格式。
-
优点: 适用于数据分析,易于处理和可视化。
-
缺点: 引入了外部库,可能需要额外安装。
方法十六:使用exec函数
for i in range(1, 10):
exec(f"print({' + '.join([f'{j}*{i}={i*j}' for j in range(1, i+1)])})")
-
特点: 使用了 exec 函数,动态执行字符串代码。
-
优点: 灵活性高,可以动态生成代码。
-
缺点: 安全性较差,容易引发安全问题。
方法十七:使用字符串拼接
for i in range(1, 10):
row = ""
for j in range(1, i+1):
row += f"{j}*{i}={i*j}\t"
print(row)
-
特点: 使用了字符串拼接,构建乘法表行。
-
优点: 简单直观,易于理解。
-
缺点: 性能较差,不够高效。
方法十八:使用模板字符串
from string import Template
for i in range(1, 10):
row = ""
for j in range(1, i+1):
row += Template("$j*$i=${result}\t").substitute(j=j, i=i, result=i*j)
print(row)
-
特点: 使用了模板字符串,格式化输出。
-
优点: 可以更灵活地控制输出格式。
-
缺点: 代码稍显繁琐,不够简洁。
方法十九:使用zip函数和星号解包
for i in range(1, 10):
row = "\t".join(f"{j}*{i}={i*j}" for j in range(1, i+1))
print(*row.split("\t"))
-
特点: 使用了 zip 函数和星号解包,将字符串分隔符插入每一项。
-
优点: 结构清晰,代码简洁。
-
缺点: 对于不熟悉星号解包的人可能不够直观。
方法二十:使用内置函数reduce
from functools import reduce
for i in range(1, 10):
print(reduce(lambda x, y: f"{x}\t{y}", [f"{j}*{i}={i*j}" for j in range(1, i+1)]))
-
特点: 使用了内置函数 reduce,将每一行的乘法表项合并为一个字符串。
-
优点: 结构清晰,简洁高效。
-
缺点: 对于不熟悉 reduce 函数的人可能不够直观。
总结:
除方法十七外,所有方法的时间复杂度均为O(n^2),其中 n 为九九乘法表的边长,即 9
在打印九九乘法表这个具体问题上,无论使用何种方法,时间复杂度都是至少 O(n^2),其中 n 是九九乘法表的边长,即 9。因为无论如何,都需要打印 81 个乘法表达式。因此,从时间复杂度的角度来看,所有的方法都是相同的,没有明显的时间复杂度最小的方法。
方法十七的时间复杂度为O(n^3),其中 n 为九九乘法表的边长,由于字符串拼接会涉及到多次复制字符串的操作,因此时间复杂度较高。
在实际应用中,我们也可以考虑其他因素,比如代码的简洁性、可读性、执行效率等。一些方法可能在执行效率上稍微好一些,但是这些差异相对较小,不会对整体性能产生显著影响。因此,在选择方法时,应该综合考虑以上因素,选择最适合具体情况的方法。
附:分类:
-
基础循环方法:
- 方法一:普通嵌套循环
- 方法八:使用while循环
-
字符串格式化方法:
- 方法二:使用字符串格式化和join方法
- 方法四:使用format方法
- 方法五:使用f-string和end参数
- 方法六:使用str.format和sep参数
-
列表推导式方法:
- 方法三:使用嵌套列表推导式
- 方法七:使用列表推导式
-
其他Python特性方法:
- 方法十一:使用字符串乘法
- 方法十三:使用map函数和lambda表达式
- 方法十七:使用字符串拼接
- 方法十八:使用模板字符串
- 方法十九:使用zip函数和星号解包
- 方法二十:使用内置函数reduce
-
使用第三方库方法:
- 方法十四:使用numpy数组
- 方法十五:使用pandas DataFrame
-
高级方法:
- 方法九:使用嵌套列表和列表解析
- 方法十:使用itertools.product
- 方法十二:使用递归函数
- 方法十六:使用exec函数