Python条件打印格式

时间:2018-09-11 10:02:49

标签: python

我有这样的功能:

def PrintXY(x,y):
    print('{:<10,.3g} {:<10,.3g}'.format(x,y) )

当我运行它时,它是完美的:

>>> x = 1/3
>>> y = 5/3
>>> PrintXY(x,y)
0.333      1.67

但是,我们不能保证xy存在:

>>> PrintXY(x, None)
unsupported format string passed to NoneType.__format__

在那种情况下,我只想打印空白,不打印任何内容。我尝试过:

def PrintXY(x,y):
    if y is None: 
        y = ''
    print('{:<10,.3g} {:<10,.3g}'.format(x,y) )

但这给出了:

ValueError: Unknown format code 'g' for object of type 'str'

如果该数字不存在,如何打印空格;当该数字存在时如何正确格式化?我宁愿不打印0或-9999来表示错误。

3 个答案:

答案 0 :(得分:6)

我将其分离出来,以明确说明所达到的目标。您可以将其合并为一行,但这会使代码更难阅读

def PrintXY(x,y):
    x_str = '{:.3g}'.format(x) if x else ''
    y_str = '{:.3g}'.format(y) if y else ''
    print('{:<10} {:<10}'.format(x_str, y_str))

然后跑步给予

In [179]: PrintXY(1/3., 1/2.)
     ...: PrintXY(1/3., None)
     ...: PrintXY(None, 1/2.)
     ...:
0.333      0.5
0.333
           0.5

确保格式保持一致的另一种方法是

def PrintXY(x,y):
    fmtr = '{:.3g}'
    x_str = fmtr.format(x) if x else ''
    y_str = fmtr.format(y) if y else ''
    print('{:<10} {:<10}'.format(x_str, y_str))

答案 1 :(得分:2)

您可以尝试以下方法:

def PrintXY(x=None, y=None):        
    print(''.join(['{:<10,.3g}'.format(n) if n is not None else '' for n in [x, y]]))

您可以轻松扩展以使用xyz

答案 2 :(得分:0)

您可以使代码更易读和更容易理解问题陈述中的条件,也可以尝试以下操作:

def PrintXY(x,y):
    formatter = None

    if x is None and y is None:
        x, y = '', ''
        formatter = '{} {}'
    if x is None:
        y = ''
        formatter = '{} {:<10,.3g}'
    if y is None:
        x = ''
        formatter = '{:<10,.3g} {}'
    else:
        formatter = '{:<10,.3g} {:<10,.3g}'

    print(formatter.format(x,y))