我知道 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,而我更喜欢将索引打印为上标。这怎么办?
您需要使用“格式”类型的东西。使用
{}\u00b2".format(area))" and the
{}becomes a
²`。这是一个例子:
print("The area of your rectangle is {}cm\u00b2".format(area))
代码末尾会打印
cm²
。您可以将末尾的大 2 更改为其他数字以获得不同的结果。
但我不知道如何做一个较低的下标。
在 Python 3.6+ 中(仅提及,因为该示例使用了以前版本中不可用的 f 字符串),命名 Unicode 字符提供了一种易于编写、易于阅读的方法来执行此操作。 这是一个列表。
示例:
f'\N{GREEK SMALL LETTER GAMMA}={density:.2f} t/m\N{SUPERSCRIPT THREE}'
产生类似
的东西γ=1.20 t/m³
对于那些寻找实用(但有点不完美)基于 UTF-8 解决方案(使用简单的字符转换表实现)的人:
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ₙ բₒₓ ⱼᵤₘₚₛ ₒᵥₑᵣ ₜₕₑ ₗₐ₂ᵧ ᑯₒ₉'
再次强调,并不完美,但可行。
您可以使用
sympy
模块为您进行必要的格式化。它支持多种格式,如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)))
n
(a*b)
n
(a⋅b)
$\left(a b\right)^{n}$
32768.0000000000
由于我无法确定,Python 中不存在字符串理解之类的东西,所以我能想到的最直接的解决方案就是加入通过 str() 运行数字而获得的字符列表和查找表。我认为没有理由不只使用上标的 unicode 字符串作为文字。只需减去“0”值的偏移量,您就可以在字符串中找到用于上标替换的索引。
def superscript(n):
return "".join(["⁰¹²³⁴⁵⁶⁷⁸⁹"[ord(c)-ord('0')] for c in str(n)])
有一种非常简单的方法可以使用 Unicode 字符打印上标和下标。执行以下操作:
这样做时,您将获得大量字符,包括下标、上标等。在窗口的左下角,您会看到类似“U-xxxx”的内容,其中 x 可以是任何字母数字字符(例如1,2,A,B..).
例如:
如果你想打印像
x²
这样的字符串,你应该将字符串写成:
'x\u00b2',其中 u00b2 是字符映射表中显示的 'U+00B2'。
这就是我在 tkinter 代码片段中使用字符映射表的方式,它的工作没有任何错误。
您正在使用
input()
,所以我想这是基于控制台的。为此,您有两种选择,如前面此处所述。一种是使用一些格式化技巧来在实际展开上方的行上显示指数。另一种方法是使用这些漂亮的字符,假设您的控制台支持 Unicode:
⁰¹²³⁴⁵⁶⁷⁸⁹
您可能需要将字体大小增加很多才能使它们清晰易读,但假设有适当的支持,这当然是一个可行的选择。除此之外,您提到这是一次个人学习经历;为什么不将它与另一个结合起来并学习 Pygame 更简单的方面呢?它非常简单,文本操作和键盘事件再简单不过了,而且分支永远不会是错误的一步。
您可以使用这个:
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程序可能作为控制台应用程序运行,它只能输出不带格式的字符。你的问题的简单答案是“你做不到”。
当然可以编写一个 GUI 应用程序,将我们的输出输出为支持格式(RTF、HTML、TeX 等)的文档格式,但这很可能超出了您正在处理的家庭作业问题的范围。
正如 MK 所说,您无法在命令行上格式化输出(除了一些颜色和粗体/闪烁,具体取决于终端)。但是,您可以以用户可能理解的方式编写它。如果是学术界的,可以使用latex风格的方式来表达上标,例如:
x^2
您可以使用平铺位图来代替控制台文本。制作一系列瓷砖。然后在后端进行计算。如果控制台文本僵硬,请切换屏幕模式并使用您自己的字符集。只是一个深夜的想法。
这会将任意大小的上标转换为 unicode 字符: (p 应该是一个 int)
def superscript(p):
superscripts = ["⁰", "¹", "²", "³", "⁴", "⁵", "⁶", "⁷", "⁸", "⁹"]
return ''.join([superscripts[int(char)] for char in str(p)])
使用
pow
来发挥某物的力量
例如:
emi = (p * r * pow(1 + r, t)) / (pow(1 + r, t) - 1)