2024-05-16 16:07:32 发布
网友
对于这个简单的代码块,有没有其他的一个行程序:
n = int(input()) for i in range(n): print(i**2)
我试过:
print(i**2 for i in range(int(input())))
它接受一个输入,但给出以下错误:
<generator object <genexpr> at 0x00000000032D3E60>
我的问题和this qs有点不同。qs帮助打印列表中的项目,无论我是否需要以换行方式打印它们。你知道吗
这不是错误。您在print(...)中的语句是一个生成器表达式—它的字符串表示形式被打印出来—这就是您认为的“错误”。你知道吗
print(...)
您可以将其输入到列表中进行转换:
print(list(i**2 for i in range(int(input()))))
或者通过迭代:
print(*(i**2 for i in range(int(input()))))
最后一个将导致输出(对于input() = 5):
input() = 5
0 1 4 9 16
由于生成器的每个结果都被传递到print,并使用默认的sep=' '进行打印,您可以将其更改为'\n'-请参阅pm2ring的文章
sep=' '
'\n'
正如Jon和Patrick提到的,这不是一个错误,而是当您打印生成器表达式的^{}时发生的情况。你知道吗
所以你只需要"splat"这个生成器。:)
print(*(i**2 for i in range(int(input()))), sep='\n')
演示输出
10 0 1 4 9 16 25 36 49 64 81
在那个演示中,我在input提示符下输入了10。你知道吗
input
10
在评论中,我想知道i * i的速度与i ** 2相比如何。在我以前的2GHz 32位单核机器上,运行Python3.6.0,i * i比i ** 2快3到4倍。下面是一些timeit代码。你知道吗
i * i
i ** 2
timeit
from timeit import Timer commands = {'mul' : 'num * num', 'pow' : 'num ** 2'} def time_test(num, loops, reps): timings = [] setup = 'num = {}'.format(num) for name, cmd in commands.items(): result = Timer(cmd, setup).repeat(reps, loops) result.sort() timings.append((result, name)) timings.sort() for result, name in timings: print(name, result) loops, reps = 100000, 3 num = 1 for _ in range(10): print('num =', num) time_test(num, loops, reps) num <<= 1
输出
num = 1 mul [0.02114695899945218, 0.02127135100090527, 0.02303983199817594] pow [0.08504067399917403, 0.08687452600133838, 0.12349813100081519] num = 2 mul [0.02089159800016205, 0.021789606998936506, 0.02889108999806922] pow [0.08612996800002293, 0.09132789800059982, 0.09559987299871864] num = 4 mul [0.021155500999157084, 0.02333696799905738, 0.028521009000542108] pow [0.08492234799996368, 0.08499632499660947, 0.08537705599883338] num = 8 mul [0.02173021600174252, 0.021955170999717666, 0.02823427400289802] pow [0.08423048700205982, 0.08541251700080466, 0.08654486299928976] num = 16 mul [0.02176373900147155, 0.02222509399871342, 0.02816650199747528] pow [0.08528696699795546, 0.09080051600176375, 0.0968476650014054] num = 32 mul [0.03118283900039387, 0.03388790600001812, 0.03745272100059083] pow [0.0943321790000482, 0.09484523300125147, 0.09691544299857924] num = 64 mul [0.030481540998152923, 0.03292956899895216, 0.03887743200175464] pow [0.09454960600123741, 0.09569520199875114, 0.09926063899911242] num = 128 mul [0.030935312999645248, 0.031198748001770582, 0.03733277300125337] pow [0.09531564099961543, 0.09669112700066762, 0.09679062199938926] num = 256 mul [0.03280377900227904, 0.03324341500047012, 0.04479783699935069] pow [0.09439349899912486, 0.09439918999851216, 0.09548852000079933] num = 512 mul [0.03275527599907946, 0.03428718699797173, 0.038492286003020126] pow [0.10492119499758701, 0.10698100599984173, 0.13057717199990293]
您应该将表达式包装到[]中以获得list comprehension。你知道吗
[]
list comprehension
print([i**2 for i in range(int(input()))])
如果要逐行打印结果,只需使用extended iterable unpacking operator。你知道吗
extended iterable unpacking operator
print(*[i**2 for i in range(int(input()))], sep = '\n')
这不是错误。您在
print(...)
中的语句是一个生成器表达式—它的字符串表示形式被打印出来—这就是您认为的“错误”。你知道吗您可以将其输入到列表中进行转换:
或者通过迭代:
最后一个将导致输出(对于
input() = 5
):由于生成器的每个结果都被传递到print,并使用默认的
sep=' '
进行打印,您可以将其更改为'\n'
-请参阅pm2ring的文章正如Jon和Patrick提到的,这不是一个错误,而是当您打印生成器表达式的^{} 时发生的情况。你知道吗
所以你只需要"splat"这个生成器。:)
演示输出
在那个演示中,我在
input
提示符下输入了10
。你知道吗在评论中,我想知道
i * i
的速度与i ** 2
相比如何。在我以前的2GHz 32位单核机器上,运行Python3.6.0,i * i
比i ** 2
快3到4倍。下面是一些timeit
代码。你知道吗输出
您应该将表达式包装到
[]
中以获得list comprehension
。你知道吗如果要逐行打印结果,只需使用
extended iterable unpacking operator
。你知道吗相关问题 更多 >
编程相关推荐