我有一个关于Python创建从其他变量派生的新变量的问题。我很难理解Python如何自动知道如何生成变量,即使我没有明确告诉它。
我是一名新的Python用户,并在以下教程中提及:Joel Grus, "Data Science From Scratch"。
在本教程中,我创建了三个列表变量:
friends
包含某人对某个朋友的朋友数量
社交网站
minutes
是指他们在网站上停留的分钟数
labels
只是每个用户的字母标签。
本教程的一部分是在创建散点图时以图形方式绘制点旁边的标签。这样做,Python似乎会自动生成三个新变量:label
,friend_count
和minute_count
。
简而言之 - 如何? Python如何知道创建这些变量?他们做了什么?它们与任何列表的均值,中位数或模式不对应。
import matplotlib.pyplot as plt
from collections import Counter
def make_chart_scatter_plot(plt):
friends = [ 70, 65, 72, 63, 71, 64, 60, 64, 67]
minutes = [175, 170, 205, 120, 220, 130, 105, 145, 190]
labels = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
plt.scatter(friends, minutes)
# label each point
for label, friend_count, minute_count in zip(labels, friends, minutes):
plt.annotate(label,
xy=(friend_count, minute_count),
xytext=(5, -5), # but slightly offset
textcoords='offset points')
plt.title("Daily Minutes vs. Number of Friends")
plt.xlabel("# of friends")
plt.ylabel("daily minutes spent on the site")
plt.show()
谢谢!
答案 0 :(得分:4)
所以你实际上是在for
循环中创建变量:
for label, friend_count, minute_count in zip(labels, friends, minutes):
当你zip
在一起时,你会按索引对它们进行分组,因此它迭代的第一项是(70, 175, 'a')
,第二项是(65, 175, 'b')
,依此类推。 Python然后解包这三个结果,因为你要求它分配给三个变量label
,friend_count
和minute_count
。例如,如果您尝试解压缩四个变量并且仅提供三个名称,则会引发错误。
然后每次循环遍历循环时,它会将下一个值重新分配给这三个变量。
另一种思考方式:如果你将该行写成:
for values in zip(labels, friends, minutes):
然后values
每次只是三个项目,这些变量不存在。然后,您可以根据需要在循环中解压缩它们。你发布的方式只是一种更简洁的方式。
您可以自己玩的另外一个解包示例:
x = [1, 2, 3, 4]
a, b, c, d = x
会分配a=1
,b=2
等等。但是:
a, b = x
返回错误:
ValueError Traceback(最近一次调用 最后)in() ----> 1 a,b = x
ValueError:解压缩的值太多(预期2)
使用*
运算符会更有趣:
a, *b = x
结果:
在[38]中:a 出[38]:1
在[39]中:b
出[39]:[2,3,4]
也就是说,*
告诉Python最后一个值是转储剩余内容的地方。此行为在函数中再次使用很多,但也可用于for循环。实际上请注意,这个*
运算符仅适用于列表,如上所述,在Python 3.x中。在2.x中,您仍然可以通过这种方式在函数中使用它,但不能在赋值中使用它。