我想打印一些浮点数,以便始终以十进制形式编写它们(例如decimal
或'0.00000005'
,而不是用科学计数法,但我想得出的结果是IEEE 754的〜15.7有效数字 加倍,再也没有。
理想情况下,我想要的是使结果是位置十进制格式的最短字符串,当转换为decimal
时仍会得到相同的值。
众所周知,如果指数大于15或小于-4,则'0.00000005'
的decimal
用科学计数法表示:
>>> n = 0.000000054321654321
>>> n
5.4321654321e-08 # scientific notation
如果使用decimal
,则生成的字符串再次采用科学计数法:
>>> str(n)
'5.4321654321e-08'
建议我可以使用带有'0.00000005'
标志和足够精度的decimal
来摆脱科学计数法:
>>> format(0.00000005, '.20f')
'0.00000005000000000000'
它适用于该数字,尽管它有一些额外的尾随零。 但是随后相同的格式对于decimal
失败,它给出的十进制数字超出了float的实际机器精度:
>>> format(0.1, '.20f')
'0.10000000000000000555'
并且如果我的电话号码是decimal
,则使用'0.00000005'
仍然会失去相对精度:
>>> format(4.5678e-20, '.20f')
'0.00000000000000000005'
因此,这些方法不符合我的要求。
这就引出了一个问题:用十进制格式打印任意浮点数,与decimal
(或Python 3上的'0.00000005'
081)具有相同数字的最简单且性能最佳的方法是什么,但始终使用十进制格式,而不是 科学计数法。
也就是说,例如将浮点值decimal
转换为字符串'0.00000005'
的函数或操作; 0.1
至'0.1'
; 420000000000000000.0
至'420000000000000000.0'
或420000000000000000
,并将浮点值-4.5678e-5
格式化为'-0.000045678'
。
赏金期过后:似乎至少有2种可行的方法,正如Karin证明的那样,与我在Python 2上的初始算法相比,使用字符串操作可以显着提高速度。
从而,
decimal
模块由于某种原因而无法使用,那么Karin使用字符串操作的方法就是这样做的方法。由于我主要是在Python 3上进行开发,因此我将接受自己的回答,并奖励Karin。
为什么set
函数调用会清除重复项,但不能解析集合文字?
>>> x = Decimal('0')
>>> y = complex(0,0)
>>> set([0, x, y])
{0}
>>> {0, x, y}
{Decimal('0'), 0j}
(Python 2.7.12。可能与这个类似问题的根本原因相同)
当我在python中输入前面带有0的小整数时,它们给出了奇怪的结果。 为什么是这样?
>>> 011
9
>>> 0100
64
>>> 027
23
注意:Python版本2.7.3我已经在Python 3.0中对此进行了测试,显然现在这是一个错误。 因此,这是特定于版本的。
编辑:它们显然仍然是整数:
>>> type(027)
`<type 'int'>`
我找到了有关subprocess.check_output()的文档,但找不到带有参数的文档,而且该文档也不是很深入。 我正在使用Python 3(但试图通过Python 3运行Python 2文件)
我正在尝试运行以下命令:py2output = subprocess.check_output([str('python'),'py2.py','-i', test.txt'])
-i是argparse的位置参数,test.txt是-i,py2.py是要运行的文件
我尝试了很多(无效)变体,包括:py2output = subprocess.check_output([str('python'),'py2.py','-i', test.txt'])
py2output = subprocess.check_output([str('python'),'py2.py','-i', test.txt'])
当“解构”一个元组时,我可以使用_
来表示我不感兴趣的元组元素,例如
>>> a,_,_ = (1,2,3)
>>> a
1
使用Python 2.x,如何使用函数参数表达相同的含义? 我尝试使用下划线:
>>> def f(a,_,_): return a
...
File "<stdin>", line 1
SyntaxError: duplicate argument '_' in function definition
我还试图完全忽略该论点:
>>> def f(a,,): return a
File "<stdin>", line 1
def f(a,,): return a
^
SyntaxError: invalid syntax
还有另一种方法可以达到相同目的吗?
我有这个:
d1 = OrderedDict([('a', '1'), ('b', '2')])
如果我这样做:
d1.update({'c':'3'})
然后我得到这个:
OrderedDict([('a', '1'), ('b', '2'), ('c', '3')])
但我想要这个:
[('c', '3'), ('a', '1'), ('b', '2')]
无需创建新字典。
我最近重新安装了ubuntu并升级到16.04,无法使用python:
$ python manage.py runserver
Could not find platform independent libraries <prefix>
Could not find platform dependent libraries <exec_prefix>
Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>]
Fatal Python error: Py_Initialize: Unable to get the locale encoding
ImportError: No module named 'encodings'
Aborted
在这一点上,python本身不起作用
$ python
Could not find platform independent libraries <prefix>
Could not find platform dependent libraries <exec_prefix>
Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>]
Fatal Python error: Py_Initialize: Unable to get the locale encoding
ImportError: No module named 'encodings'
Aborted
甚至这个建议也不再起作用:
unset PYTHONHOME
unset PYTHONPATH
每一次我用一种方式修复它,它都会再次出现。 有几个答案有助于暂时修复它,但不是永久性的。 我已经重新安装了python和python3几次。 我可以从这里做什么? 谢谢
为什么不像天真的预期的那样工作?
class Foo(object):
def __init__(self):
self.bar = 3
def __bool__(self):
return self.bar > 10
foo = Foo()
if foo:
print 'x'
else:
print 'y'
(输出是x
)
我尝试使用Python的ConfigParser模块保存设置。 对于我的应用程序,重要的是要在我的部分中保留每个名称的大小写。 文档提到将str()传递给ConfigParser.optionxform()可以完成此操作,但对我而言不起作用。 名称均为小写。 我想念什么吗?
<~/.myrc contents>
[rules]
Monkey = foo
Ferret = baz
我得到的Python伪代码:
import ConfigParser,os
def get_config():
config = ConfigParser.ConfigParser()
config.optionxform(str())
try:
config.read(os.path.expanduser('~/.myrc'))
return config
except Exception, e:
log.error(e)
c = get_config()
print c.options('rules')
[('monkey', 'foo'), ('ferret', 'baz')]
假设在编写用于Python的C扩展模块的教程中定义的类型为Py_TPFLAGS_HEAPTYPE
。 现在我们要创建一个派生类型,仅覆盖Noddy
的__new__()
方法。
当前,我使用以下方法(去除了可读性的错误检查):
PyTypeObject *BrownNoddyType =
(PyTypeObject *)PyType_Type.tp_alloc(&PyType_Type, 0);
BrownNoddyType->tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE;
BrownNoddyType->tp_name = "noddy.BrownNoddy";
BrownNoddyType->tp_doc = "BrownNoddy objects";
BrownNoddyType->tp_base = &NoddyType;
BrownNoddyType->tp_new = BrownNoddy_new;
PyType_Ready(BrownNoddyType);
这可行,但是我不确定这是否是正确的方法。 我本来希望我也必须设置Py_TPFLAGS_HEAPTYPE
标志,因为我会在堆上动态分配类型对象,但这样做会导致解释器出现段错误。
我还考虑过使用type()
或类似名称显式调用PyDescr_NewMethod()
,但我放弃了这个想法。 我需要将函数type()
包装在Python函数对象中,并创建一个将tp_new
映射到此函数对象的字典,这看起来很愚蠢。
最好的方法是什么? 我的方法正确吗? 我错过了接口功能吗?
在python-dev邮件列表(1)(2)上,有两个主题相关的主题。 从这些线程和一些实验中,我得出结论,除非通过调用type()
分配类型,否则不应该设置PyDescr_NewMethod()
。这些线程中有不同的建议,无论是手动分配类型还是调用type()
都是更好的选择。 d如果只有我知道在tp_new
插槽中应该包装C函数的推荐方式是什么,对后者感到满意。 对于常规方法,此步骤很容易-我可以使用PyDescr_NewMethod()
获得合适的包装对象。 但是,我不知道如何为__new__()
方法创建这样的包装对象—也许我需要未记录的函数PyCFunction_New()
才能创建这样的包装对象。
我以为可以在Python 2的函数调用中在变长位置参数之后使用命名参数,但是在导入python类时得到了SyntaxError
。 例如,我正在使用以下“获取”方法进行编写:
class Foo(object):
def __init__(self):
print "You have created a Foo."
def get(self, *args, raw=False, vars=None):
print len(args)
print raw
print vars
错误看起来像:
def get(self, *args, raw=False, vars=None):
^
SyntaxError: invalid syntax
我希望能够以几种方式调用该方法:
f = Foo()
f.get(arg1, arg2)
f.get(arg1, raw=True)
f.get(arg1, arg2, raw=True, vars=something)
等等
我试图访问Django中的model.filefield
,使用csv
模块解析Python中的CSV文件。 它在Windows上工作,但在Mac上它给了我这个:
Exception Type: Error
Exception Value: new-line character seen in unquoted field - do you need to open the file in universal-newline mode?
这是代码:
myfile = customerbulk.objects.all()[0].fileup
mydata = csv.reader(myfile)
for email,mobile,name,civilid in mydata:
print email,mobile,name,civilid
这个问题在这里已有答案:
所以我尝试了'#34; evil&#34; Ned Deily在他的回答中提到了这件事。 现在我认为类型True现在总是为假。 如何在交互式窗口中反转此操作?
不要这样做:
True = False
由于True现在已被False完全覆盖,因此似乎并不是一种明显的回溯方式。 是否存在True来自的模块,我可以执行以下操作:
True = <'module'>.True
所以我正在学习Python。 我正在经历课程并遇到一个问题,我必须将很多write()
压缩成一个writelines()
,同时在每个用户输入变量(write()
的对象)之间有一个"\n"
。
我提出了:
nl = "\n"
lines = line1, nl, line2, nl, line3, nl
textdoc.writelines(lines)
如果我尝试做:
textdoc.write(lines)
我收到一个错误。 但如果我输入:
textdoc.write(line1 + "\n" + line2 + ....)
然后它工作正常。 为什么我无法在write()
中使用字符串作为换行符,但我可以在writelines()
中使用它?
Python 2.7当我搜索google时,我发现的大部分资源都是我的头脑,我还是一个非专业人士。
这个问题在这里已有答案:
很抱歉这个简单的问题,但我很难找到答案。
当我比较2个列表时,我想知道它们是否相等&#34; 因为它们具有相同的内容,但顺序不同。
例如:
x = ['a', 'b']
y = ['b', 'a']
我希望x == y
来评估True
。
编辑:我正在运行python 2.6
我希望实现这样的目标:
def foo():
try:
raise IOError('Stuff ')
except:
raise
def bar(arg1):
try:
foo()
except Exception as e:
e.message = e.message + 'happens at %s' % arg1
raise
bar('arg1')
Traceback...
IOError('Stuff Happens at arg1')
但我得到的是:
Traceback..
IOError('Stuff')
关于如何实现这一点的任何线索?
在Python 2.5中,以下代码引发了class X
:
>>> class X:
def a(self):
print "a"
>>> class Y(X):
def a(self):
super(Y,self).a()
print "b"
>>> c = Y()
>>> c.a()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in a
TypeError: super() argument 1 must be type, not classobj
如果我用class X(object)
替换class X
,它将起作用。 对此有何解释?
我正在制作一个Python解析器,这让我很困惑:
>>> 1 in [] in 'a'
False
>>> (1 in []) in 'a'
TypeError: 'in <string>' requires string as left operand, not bool
>>> 1 in ([] in 'a')
TypeError: 'in <string>' requires string as left operand, not list
关于结合性等,“in”在Python中的工作原理究竟如何?
为什么这些表达式中没有两个表现方式相同?
我正在尝试在Python 2.6中实现一个闭包,我需要访问一个非局部变量,但似乎这个关键字在python 2.x中不可用。 如何在这些版本的python中访问闭包中的非局部变量?