我不知道如何在使用for循环时引用列表中的每个项,而不是只引用最后一个项。这里有一个简单的程序,我想在一行上打印一个n-*
,其中n是stars
列表中的每个数字。这是我的代码:
#!/usr/bin/python
def histogram():
stars = [10,2,3]
for i in stars:
char = "*" * i
return char
print histogram()
该代码的输出仅为***
(stars
中的最后一个数字)。我怎样才能打印出每个数字的星号?请尽可能使用最简单的语法和解释。
实际上,函数只返回分配给"char"的最后一个值——这个值将是一个由星号组成的字符串。您想做的是创建一个连续值的列表,"char"在循环的每次迭代中都会取这些值:
def histogram():
stars = [10,2,3]
characters = []
for i in stars :
cur_stars = "*" * i
characters.append( cur_stars )
print cur_stars
return characters
>>> stars = histogram()
**********
**
***
上面将逐行打印出星星,并将列表存储为变量"星星"。
做同样事情的一种更快/更干净的方法是列表理解(一种函数式编程结构),它可以动态创建列表:
def histogram():
stars = [10,2,3]
return [ "*" * i for i in stars ]
>>> histogram()
['**********', '**', '***']
>>> print('n'.join( histogram() ))
**********
**
***
问题是,对于stars
中的每个项目,都要重新分配char
。因此,当histogram()
返回时,char等于"*" * stars[-1]
(列表中的最后一项)。纠正这种情况的最简单方法是只为stars
中的每个元素打印char
,而不返回任何内容。
def histogram():
stars = [10,2,3]
for i in stars:
char = "*" * i
print char
histogram()
**********
**
***
如果您想返回直方图的输出,可以将其添加到char
,而不是将其分配给新值。为此,我们在for循环外将char
设置为空字符串(''
),然后在for循环内使用char +=
(相当于char = char +
)添加到char
。'n'
是在stars
中的每个项目之间添加一个新行(如果没有它,所有的星都将在输出中的一行上)。
def histogram():
stars = [10,2,3]
char = ''
for i in stars:
char += "*" * i + 'n'
return char
print histogram()
写上述内容的一种更简洁的方式是:
def histogram():
stars = [10,2,3]
return 'n'.join('*' * i for i in stars)
print histogram()
考虑:
def histogram(li):
rtr=[]
for n in li:
rtr.append('*'*n)
return rtr
然后你可以做一些类似的事情:
stars=[10,2,3]
for t in zip(stars, histogram(stars)):
print('{:4d} {}'.format(*t))
打印:
10 **********
2 **
3 ***
#!/usr/bin/python
def histogram():
stars = [10,2,3]
stars_str = ""
for i in stars :
stars_str += "*" * i + 'n'
return stars_str.strip()
print histogram ()