用python打印九九乘法表的20种方式!

文章详细列举了20种不同的方法来打印九九乘法表,包括基础循环、字符串操作、列表推导、函数应用等,并分析了它们的特点、优点和缺点。尽管时间复杂度基本相同,但选择方法时需考虑代码简洁性和可读性。

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

下面是20种方法↓↓↓(文章末尾有分类)

目录

方法一:普通嵌套循环

方法二:使用字符串格式化和join方法

方法三:使用嵌套列表推导式

方法四:使用format方法

方法五:使用f-string和end参数

方法六:使用str.format和sep参数

方法七:使用列表推导式

方法八:使用while循环

方法九:使用嵌套列表和列表解析

方法十:使用itertools.product

方法十一:使用字符串乘法

方法十二:使用递归函数

方法十三:使用map函数和lambda表达式

方法十四:使用numpy数组

方法十五:使用pandas DataFrame

方法十六:使用exec函数

方法十七:使用字符串拼接

方法十八:使用模板字符串

方法十九:使用zip函数和星号解包

方法二十:使用内置函数reduce

总结:

附:分类:


方法一:普通嵌套循环

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 为九九乘法表的边长,由于字符串拼接会涉及到多次复制字符串的操作,因此时间复杂度较高。

在实际应用中,我们也可以考虑其他因素,比如代码的简洁性、可读性、执行效率等。一些方法可能在执行效率上稍微好一些,但是这些差异相对较小,不会对整体性能产生显著影响。因此,在选择方法时,应该综合考虑以上因素,选择最适合具体情况的方法。

附:分类:

  1. 基础循环方法:

    • 方法一:普通嵌套循环
    • 方法八:使用while循环
  2. 字符串格式化方法:

    • 方法二:使用字符串格式化和join方法
    • 方法四:使用format方法
    • 方法五:使用f-string和end参数
    • 方法六:使用str.format和sep参数
  3. 列表推导式方法:

    • 方法三:使用嵌套列表推导式
    • 方法七:使用列表推导式
  4. 其他Python特性方法:

    • 方法十一:使用字符串乘法
    • 方法十三:使用map函数和lambda表达式
    • 方法十七:使用字符串拼接
    • 方法十八:使用模板字符串
    • 方法十九:使用zip函数和星号解包
    • 方法二十:使用内置函数reduce
  5. 使用第三方库方法:

    • 方法十四:使用numpy数组
    • 方法十五:使用pandas DataFrame
  6. 高级方法:

    • 方法九:使用嵌套列表和列表解析
    • 方法十:使用itertools.product
    • 方法十二:使用递归函数
    • 方法十六:使用exec函数
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值