使用Python 3和Matplotlib中的字符串格式无效的语法错误

Tob*_*bal 6 python matplotlib python-3.x

代码:

#/usr/bin/env python3
# -*- coding: utf-8 -*-


import numpy as np
import matplotlib.pyplot as plt
from sympy.solvers import *
from sympy import *
from matplotlib import rcParams


rcParams['text.latex.unicode'] = True
rcParams['text.usetex'] = True
rcParams['text.latex.preamble'] = '\usepackage{amsthm}', '\usepackage{amsmath}', '\usepackage{amssymb}',
'\usepackage{amsfonts}', '\usepackage[T1]{fontenc}', '\usepackage[utf8]{inputenc}'


f = lambda x: x ** 2 + 1
#f = lambda x: np.sin(x) / x

x = Symbol('x')
solucion = solve(x**2+1, x)

fig, ax = plt.subplots()
x = np.linspace(-6.0, 6.0, 1000)
ax.axis([x[0] - 0.5, x[-1] + 0.5, x[0] - 0.5, x[-1] + 0.5])
ax.spines['left'].set_position('center')
ax.spines['right'].set_color('none')
ax.spines['bottom'].set_position('center')
ax.spines['top']
ax.spines['left']
ax.spines['bottom']
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
ax.grid('on')
ticks = []
for i in range(int(x[0]), int(x[-1] + 1), 1):
    ticks.append(i)
ticks.remove(0)
ax.set_xticks(ticks)
ax.set_yticks(ticks)

ax.plot(x, f(x), 'b-', lw=1.5)
ax.legend([r'$f(x)=x^2-1$'], loc='lower right')

text_sol = ''
if solucion == []:
    text_sol = r'$No\; hay\; soluciones $'
else:
    for i, value in enumerate(solucion):
        text_sol += ur'$Solución \; {}\; :\; {}\\$'.format(i, value)

bbox_props = dict(boxstyle='round', fc='white', ec='black', lw=2)
t = ax.text(-5.5, -5, text_sol, ha='left', va='center', size=15,
            bbox=bbox_props)

plt.show()
Run Code Online (Sandbox Code Playgroud)

这段代码适用于Python 2.7,但Python 3.3.2很糟糕:

python3 funcion_pol2.py
  File "funcion_pol2.py", line 51
    text_sol += ur'$Solución \; {}\; :\; {}\\$'.format(i, value)
                                               ^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

谢谢!

Ash*_*ary 5

u'...'在Python 3.0中删除了字符串文字的语法

来自docs:

字符串文字不再支持领导uU.

所以,你可以简单地删除u'...'Python 3:

r'$Solución \; {}\; :\; {}\\$'.format(i, value)
Run Code Online (Sandbox Code Playgroud)

注:u'...'语法已在Python重新引入3.3(感谢@Bakuriu指出了这一点).

新重新引入的字符串前缀语法如下所示:

stringprefix    ::=  "r" | "u" | "R" | "U"
Run Code Online (Sandbox Code Playgroud)

Python 2 字符串前缀语法:

stringprefix    ::=  "r" | "u" | "ur" | "R" | "U" | "UR" | "Ur" | "uR"
                     | "b" | "B" | "br" | "Br" | "bR" | "BR"
Run Code Online (Sandbox Code Playgroud)


iCo*_*dez 5

由于您使用的是Python 3.3,问题在于您u在字符串文字之前.相反,问题是你要放在ur它之前:

>>> # Python 3.3.2 interpreter
>>> u'a'
'a'
>>> ur'a'
  File "<stdin>", line 1
    ur'a'
        ^
SyntaxError: invalid syntax
>>>
Run Code Online (Sandbox Code Playgroud)

此行为在文档中解释:

鉴于Python 2.x的原始unicode文字行为与Python 3.x不同,因此不支持'ur'语法.

...

版本3.3中的新功能:重新引入了对unicode遗留文字(u'value')的支持,以简化双Python 2.x和3.x代码库的维护.有关更多信息,请参阅PEP 414.


由于Python 3.x中的所有字符串都是unicode,因此只需删除以下内容即可解决问题u:

r'$Solución \; {}\; :\; {}\\$'.format(i, value)
Run Code Online (Sandbox Code Playgroud)