Python中的打印 -- 本质上是函数式的?

2024-05-29 09:45:25 发布

您现在位置:Python中文网/ 问答频道 /正文

在工作中为一个项目学习了Python(这很酷,b/c现在我可以摆弄Anki了!)。总的来说,我很喜欢这门语言。没有Perl那么强大,虽然我还没有玩过它的库,但它似乎和Perl一样强大,而且思考更少。你知道吗

我最不喜欢的一件事是Python觉得它无法决定是过程的还是面向对象的。一个让我悲伤的例子就是印刷。例如,这会导致错误:

f = 5.0
print 'The value is ' + f

您需要显式地将f转换为字符串。或者求助于1969年以来最不面向对象的范例之一:

f = 5.0
print 'The value is %f' % f

这是怎么回事?我声称,如果Python不打印第一个代码段,那只是因为Python没有足够努力,而不是因为它做不到。也许它们只是一些数字,当被问到时,它们不知道如何返回它们的字符串化表示。Python当然会跟踪它们的类型。我知道这一点,因为类型(f)告诉我。那为什么不多跑一英里,帮我做些转换呢?如果我担心的是纳秒级的执行时间,我就不会首先使用Python。你知道吗

即使是面向对象的语言,如Perl或VB6,也可以用优雅的方式来表达。你知道吗

好的,对不起。我不是故意要说出来的。我真正想要的是寻求帮助。你知道吗

有没有一个库,也许是一些用户编写的代码,也许是一个包装器函数,它只允许我做这样的事情:

f = 5.0
g = (1, 2, 3)
h = [a, b, c]
print 'f: ' + ', ' + f + ', g: ' + g + ', h: ' + h

不用自己转换成字符串?我可以偷懒。我是个程序员。这是我与生俱来的权利。。。你知道吗

谢谢!你知道吗


Tags: the项目字符串语言类型isvalue过程
3条回答

你说的是隐式类型转换,它与面向对象编程毫无关系。每种范式都有包含或不包含隐式转换的语言,python就是一个明显的例子。你知道吗

问题是为什么。隐式转换可能很方便,但在某些条件下,它会带来意外行为的代价。This video突出了一些更幽默的。有些语言设计师觉得这种便利值得付出代价,有些则不然。这就是为什么我们有这么多语言。The Zen of Python将“显式优于隐式”列为其指导原则之一。你知道吗

在python中,您可以做的是创建一个函数来转换它的每个参数。事实上,许多内置函数已经可以这样工作了。例如,您可以执行以下操作:

print('f:', f, ', g:', g, ', h:', h)
"f: {}, g: {}, h: {}".format(f, g, h)

您还可以使用python的函数端将一组不同的变量转换为字符串:

map(str, [f, g, h])

当然,您也可以创建自己的函数,使用*args**kwargs并对所有函数调用str()。你知道吗

你有很多很好的选择。不要抱怨,因为它们看起来不像你更习惯的另一种语言。你知道吗

下面的代码应该是您想要的。你知道吗

def zprint(*args):         # *args accepts and stores infinite args in a list 
    stuff_to_print = ""    
    for i in args:         # iterate through args adding what you want to print
        stuff_to_print += str(i)
    print stuff_to_print   # print the results

以下是输入和输出示例:

>>> l=4
>>> zprint(l, "helloworld", False)
4helloworldFalse

注意,函数也接受bools。你知道吗

如果这有帮助的话,不客气!你知道吗

不,没有库允许您连接字符串和数字。这正是由于Python面向对象方面的原因:加法的行为是由被添加对象的方法决定的,这些类被关闭以进行修改(尽管您继承了它们并重写了它们的方法,但您不能替换它们的方法)。你知道吗

I claim that if Python won't print that first snippet, it's only because Python isn't trying hard enough, not because it can't.

这并不是完全错误的。”但“不够努力”是一种误导,请继续阅读。你知道吗

Let's say that numerical values in Python aren't "objectified" like Java's Integer or Double classes. Maybe they're simply numbers that don't know how to return their stringified representation when asked.

它清楚地知道:some_number.__str__()(尽管您通常会编写str(some_number))。你知道吗

So why not go that extra mile and do the conversion for me?

因为设计师们认为这样的隐式转换比它们的价值更麻烦。它使编码错误(例如忘记将数字输入从文本转换为实际的数字类型)默默地产生错误的结果。这也会导致初学者对数据的实际类型感到困惑。再加上一百万个小理由。你知道吗

If I was worried about nanoseconds of execution time, I wouldn't be using Python in the first place.

我不知道你认为表演是怎么回事。隐式转换实际上可能更快,或者同样快。无论如何,这说明你为这个决定预设了如此愚蠢的理由。你知道吗

最后,这种行为对print来说没有什么特别的。在print“上下文”中,加法的行为与其他任何地方完全相同,因为没有特殊情况,print只接受一系列表达式,并在计算任何其他表达式时对它们进行计算。这在python3(或者使用from __future__ import print_function)中是非常明显的,其中print只是另一个内置函数。Python不会处理那些会影响参数计算的无意义函数。你知道吗

相关问题 更多 >

    热门问题