如何用Python打印上标?

如何用Python打印上标?,python,math,superscript,Python,Math,Superscript,我知道python中的\xb函数,但它似乎不适合我。我知道我可能需要下载一个第三方模块来完成这项工作,如果是的话,哪一个是最好的 我目前正在写一个二项式展开解算器,尝试使用我自己教的技能。当我试图显示用户输入的用于确认的扩展时,问题出现了。目前,我必须打印如下表达式: var1 = input("Enter a: ") var2 = input("Enter b: ") exponent = input("Enter n: ") a

我知道python中的\xb函数,但它似乎不适合我。我知道我可能需要下载一个第三方模块来完成这项工作,如果是的话,哪一个是最好的

我目前正在写一个二项式展开解算器,尝试使用我自己教的技能。当我试图显示用户输入的用于确认的扩展时,问题出现了。目前,我必须打印如下表达式:

var1 = input("Enter a: ")
var2 = input("Enter b: ")
exponent = input("Enter n: ")

a = int(var1)
b = int(var2)
n = int(exponent)

expression = ('(%(1)dx%(2)d)^%(3)d') %\
{'1' : a, '2' : b, '3' : n}

print(expression)

confirmation = input(str("Is this correctt? Y/N "))

这将打印(2x4)^5,而我更喜欢将索引打印为上标。如何做到这一点?

您的Python程序可能是作为控制台应用程序运行的,它只能输出不带格式的字符。你的问题的简单答案是“你做不到”


当然,可以编写GUI应用程序,将我们的输出转换为支持格式化(RTF、HTML、TeX等)的文档格式,但这很可能超出了您正在处理的家庭作业问题的范围。

正如MK已经说过的,您无法在命令行上格式化输出(除了一些颜色和粗体/闪烁(取决于终端)。但是,您可以用用户可能理解的方式编写。如果他们来自学术界,您可以使用乳胶风格的方式来表示上标,例如,
x^2

您使用的是
input()
,因此我认为这是基于控制台的。为此,如前所述,您有两种选择。一种是使用一些格式技巧在实际扩展上方的行上显示指数。另一种是使用这些漂亮的字符,假设您的控制台支持Unicode:

⁰¹²³⁴⁵⁶⁷⁸⁹

您可能需要将字体大小增加一点,以使其清晰易读,但如果有适当的支持,这肯定是一个可行的选择。除此之外,您提到这是一个个人学习体验;为什么不将其与另一个结合起来,学习Pygame的更简单方面呢?它非常简单,文本manipul初始化和键盘事件再简单不过了,而且扩展也不是一个错误的步骤。

您可以使用
symphy
模块为您进行必要的格式化。它支持多种格式,如ascii、unicode、latex、mathml等:

from sympy import pretty_print as pp, latex
from sympy.abc import a, b, n

expr = (a*b)**n
pp(expr) # default
pp(expr, use_unicode=True)
print(latex(expr))
print(expr.evalf(subs=dict(a=2,b=4,n=5)))
输出
你需要使用“格式”类型的东西。使用
{}\u00b2.format(area))“,
{}
变成一个
²”。以下是一个例子:

print("The area of your rectangle is {}cm\u00b2".format(area))
代码末尾将打印
cm²
。您可以将末尾的大2更改为其他数字以获得不同的结果。 但是我不知道如何使用较低的下标。

在Python3.6+(之所以提到这个示例,是因为该示例使用了在以前版本中不可用的f字符串)命名的Unicode字符提供了一种易于编写、易于阅读的方法

例如:

f'\N{GREEK SMALL LETTER GAMMA}={density:.2f} t/m\N{SUPERSCRIPT THREE}'
产生类似于

γ=1.20 t/m³
Unicode字符是解决方案!
有一种非常简单的方法可以使用Unicode字符打印上标和下标。请执行以下操作:

  • 按alt+f2
  • 键入“charmap”
执行此操作时,您将获得大量字符,包括下标、上标等。在窗口的左下角,您将看到类似“U-xxxx”的内容,其中x可以是任何字母数字字符(例如1、2、A、B…)

例如:

  • 如果要打印字符串x^2,则应将该字符串编写为:

    “x\u00b2”,其中u00b2是字符映射中显示的“U+00B2”


这就是我在tkinter代码片段中使用字符映射的方式,它工作时没有任何错误。

对于那些寻找实用(但有点不完美)解决方案的人,使用简单的字符转换表实现:

import string

superscript_map = {
    "0": "⁰", "1": "¹", "2": "²", "3": "³", "4": "⁴", "5": "⁵", "6": "⁶",
    "7": "⁷", "8": "⁸", "9": "⁹", "a": "ᵃ", "b": "ᵇ", "c": "ᶜ", "d": "ᵈ",
    "e": "ᵉ", "f": "ᶠ", "g": "ᵍ", "h": "ʰ", "i": "ᶦ", "j": "ʲ", "k": "ᵏ",
    "l": "ˡ", "m": "ᵐ", "n": "ⁿ", "o": "ᵒ", "p": "ᵖ", "q": "۹", "r": "ʳ",
    "s": "ˢ", "t": "ᵗ", "u": "ᵘ", "v": "ᵛ", "w": "ʷ", "x": "ˣ", "y": "ʸ",
    "z": "ᶻ", "A": "ᴬ", "B": "ᴮ", "C": "ᶜ", "D": "ᴰ", "E": "ᴱ", "F": "ᶠ",
    "G": "ᴳ", "H": "ᴴ", "I": "ᴵ", "J": "ᴶ", "K": "ᴷ", "L": "ᴸ", "M": "ᴹ",
    "N": "ᴺ", "O": "ᴼ", "P": "ᴾ", "Q": "Q", "R": "ᴿ", "S": "ˢ", "T": "ᵀ",
    "U": "ᵁ", "V": "ⱽ", "W": "ᵂ", "X": "ˣ", "Y": "ʸ", "Z": "ᶻ", "+": "⁺",
    "-": "⁻", "=": "⁼", "(": "⁽", ")": "⁾"}

trans = str.maketrans(
    ''.join(superscript_map.keys()),
    ''.join(superscript_map.values()))

'The quick brown fox jumps over the lazy dog'.translate(trans)
# ᵀʰᵉ ۹ᵘᶦᶜᵏ ᵇʳᵒʷⁿ ᶠᵒˣ ʲᵘᵐᵖˢ ᵒᵛᵉʳ ᵗʰᵉ ˡᵃᶻʸ ᵈᵒᵍ
作为奖励,以下是下标对应项:

subscript_map = {
    "0": "₀", "1": "₁", "2": "₂", "3": "₃", "4": "₄", "5": "₅", "6": "₆",
    "7": "₇", "8": "₈", "9": "₉", "a": "ₐ", "b": "♭", "c": "꜀", "d": "ᑯ",
    "e": "ₑ", "f": "բ", "g": "₉", "h": "ₕ", "i": "ᵢ", "j": "ⱼ", "k": "ₖ",
    "l": "ₗ", "m": "ₘ", "n": "ₙ", "o": "ₒ", "p": "ₚ", "q": "૧", "r": "ᵣ",
    "s": "ₛ", "t": "ₜ", "u": "ᵤ", "v": "ᵥ", "w": "w", "x": "ₓ", "y": "ᵧ",
    "z": "₂", "A": "ₐ", "B": "₈", "C": "C", "D": "D", "E": "ₑ", "F": "բ",
    "G": "G", "H": "ₕ", "I": "ᵢ", "J": "ⱼ", "K": "ₖ", "L": "ₗ", "M": "ₘ",
    "N": "ₙ", "O": "ₒ", "P": "ₚ", "Q": "Q", "R": "ᵣ", "S": "ₛ", "T": "ₜ",
    "U": "ᵤ", "V": "ᵥ", "W": "w", "X": "ₓ", "Y": "ᵧ", "Z": "Z", "+": "₊",
    "-": "₋", "=": "₌", "(": "₍", ")": "₎"}


sub_trans = str.maketrans(
    ''.join(subscript_map.keys()),
    ''.join(subscript_map.values()))

'The quick brown fox jumps over the lazy dog'.translate(sub_trans)
# 'ₜₕₑ ૧ᵤᵢ꜀ₖ ♭ᵣₒwₙ բₒₓ ⱼᵤₘₚₛ ₒᵥₑᵣ ₜₕₑ ₗₐ₂ᵧ ᑯₒ₉'

同样地,不是完美的,但可行。

使用
pow
使某物具有力量

例如:

emi = (p * r * pow(1 + r, t)) / (pow(1 + r, t) - 1)
您可以使用以下选项:

def conv_to_super(n):
    super=list(map(chr,[8304,185,178,179,8308,8309,8310,8311,8312,8313]))
    st=""
    for i in str(n):
        st+=super[int(i)]
    return(st)


由于Python中没有字符串理解这样的东西,因此我所能想到的最简单的解决方案就是将通过str()运行数字得到的字符列表与查找表连接起来。我认为没有理由不将上标字符的unicode字符串用作文字。只需减去值“0”的偏移量,就可以将索引放入字符串中,以替换上标

def superscript(n):
    return "".join(["⁰¹²³⁴⁵⁶⁷⁸⁹"[ord(c)-ord('0')] for c in str(n)]) 

您需要指定输出设备/格式,因为这决定了上标的标记方式。例如,在HTML中,您将输出
(2x4)5
。不要在Python2.x上使用,而是使用。否则,请指定您使用Python 3.x。谢谢您的回复,但是,不,我打算在没有GUI的情况下编写程序的基本部分,然后,一旦我对一切正常工作感到满意,我将为它创建GUI。我计划在我的GUI中使用tkinter,那么有可能使用tkinter吗?如果不是,哪个模块合适?这实际上是有效的,因为。不,它不是:不是f字符串,而是{name}转义序列。这必须仅适用于某个平台。窗户?如果是:您只能在支持这些字符的字体中找到这些字符(然后我建议使用Arial MS Unicode)。但是由于OP想要创建一个基于控制台的程序,这些字符也必须在控制台字体中可用。我使用Ubuntu18.04,它在这里工作,我不知道windows>您可以将末尾的大2改为其他数字以获得不同的结果。事实并非如此。而
\u00b3
返回
³
\u00b4
返回
'
\u00b5
返回
µ
。数字上标写在不同的高度。例如,0大于1(至少在使用ipycanvas时是如此)@Daniel UTF-8实际上支持这些数字。所以,如果出现渲染问题,很可能是字体的问题。也许你可以尝试不同的字体。我在这里的普通文本中看到它们排成一行:⁰¹²³⁴⁵⁶⁷⁸⁹ 但不在代码中:
⁰¹²³⁴⁵?
def superscript(n):
    return "".join(["⁰¹²³⁴⁵⁶⁷⁸⁹"[ord(c)-ord('0')] for c in str(n)])