这个简单的代码块是否有任何替代的衬垫:
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帮助打印列表中的项目是否需要以换行方式打印它们。
答案 0 :(得分:4)
正如乔恩和帕特里克所说,这不是一个错误,当你打印一个生成器表达式的__repr__
时会发生这种情况。
所以你只需要"splat"那个生成器。 :)
print(*(i**2 for i in range(int(input()))), sep='\n')
演示输出
10
0
1
4
9
16
25
36
49
64
81
在该演示中,我在10
提示符下输入了input
。
在评论中,我想知道i * i
的速度与i ** 2
的比较。在我的旧2GHz 32位单核机器上,运行Python 3.6.0,i * i
比i ** 2
快大约3或4倍。这是一些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]
答案 1 :(得分:3)
您应该将表达式包装到[]
中,以便拥有list comprehension
。
print([i**2 for i in range(int(input()))])
如果您想逐行打印结果,请使用extended iterable unpacking operator
。
print(*[i**2 for i in range(int(input()))], sep = '\n')
答案 2 :(得分:1)
这不是错误。你在print(...)
中的陈述是一个生成器表达式 - 它的字符串表示被打印 - 这就是你认为的错误&#34;错误&#34;。
您可以将其转换为列表进行转换:
print(list(i**2 for i in range(int(input()))))
或通过迭代:
print(*(i**2 for i in range(int(input()))))
最后一个将导致输出(input() = 5
):
0 1 4 9 16
因为生成器的每个结果都会传递给打印并使用默认sep=' '
打印,您可以将其更改为'\n'
- 请参阅PM 2Ring的帖子
答案 3 :(得分:0)
这会在代码执行的单独行中打印每个i**2
:
print('\n'.join(str(i**2) for i in range(int(input()))))