Python自动生成变量

时间:2016-07-14 14:40:22

标签: python matplotlib

问题

我有一个关于Python创建从其他变量派生的新变量的问题。我很难理解Python如何自动知道如何生成变量,即使我没有明确告诉它。

详细

我是一名新的Python用户,并在以下教程中提及:Joel Grus, "Data Science From Scratch"

在本教程中,我创建了三个列表变量:

  1. friends包含某人对某个朋友的朋友数量 社交网站

  2. minutes是指他们在网站上停留的分钟数

  3. labels只是每个用户的字母标签。

  4. 本教程的一部分是在创建散点图时以图形方式绘制点旁边的标签。这样做,Python似乎会自动生成三个新变量:labelfriend_countminute_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()
    

    谢谢!

1 个答案:

答案 0 :(得分:4)

所以你实际上是在for循环中创建变量:

for label, friend_count, minute_count in zip(labels, friends, minutes):

当你zip在一起时,你会按索引对它们进行分组,因此它迭代的第一项是(70, 175, 'a'),第二项是(65, 175, 'b'),依此类推。 Python然后解包这三个结果,因为你要求它分配给三个变量labelfriend_countminute_count。例如,如果您尝试解压缩四个变量并且仅提供三个名称,则会引发错误。

然后每次循环遍历循环时,它会将下一个值重新分配给这三个变量。

另一种思考方式:如果你将该行写成:

for values in zip(labels, friends, minutes): 

然后values每次只是三个项目,这些变量不存在。然后,您可以根据需要在循环中解压缩它们。你发布的方式只是一种更简洁的方式。

您可以自己玩的另外一个解包示例:

x = [1, 2, 3, 4]
a, b, c, d = x

会分配a=1b=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中,您仍然可以通过这种方式在函数中使用它,但不能在赋值中使用它。