2016-07-14 2 views
1

Вопрос

У меня возник вопрос о создании Python новых переменных, полученных из других переменных. Я изо всех сил пытаюсь понять, как Python автоматически знает, как создавать переменные, даже если я не говорю об этом явно.Python автоматически генерирует переменные

Подробности

Я новый пользователь Python, и я следую вместе в учебники в: Joel Grus, "Data Science From Scratch".

В учебнике, я создать три списка переменных:

  1. friends содержит количество друзей, что кто-то имеет на данном сайте социальной сети

  2. minutes относится к числу минут, они проводят на сайте

  3. 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() 

Спасибо!

+1

3 именам присваиваются результаты zip в цикле for –

+1

'friend', а остальные - просто имена, которые ** мы ** предоставляем python для ссылки на объект, созданный справа. Python не делает это, мы говорим, чтобы использовать эти имена. – cdarke

+1

https://wiki.python.org/moin/ForLoop – Jeremy

ответ

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 (most recent call last) in() ----> 1 a, b = x

ValueError: too many values to unpack (expected 2)

Это становится более интересным с помощью * оператора:

a, *b = x 

приводит:

In [38]: a
Out[38]: 1

In [39]: b
Out[39]: [2, 3, 4]

То есть, * сообщает Python, что последнее значение - это место для сброса всех оставшихся. Такое поведение снова часто используется в функциях, но может использоваться и для циклов. На самом деле обратите внимание, что этот оператор * работает только со списками, как показано выше, в Python 3.x. В 2.x вы все равно можете использовать его в функциях таким образом, но не в назначении.

+0

Ничего себе, спасибо за такой быстрый ответ! Итак, просто чтобы убедиться, что я понимаю, код говорит Python, чтобы распаковать 'zip' в три контейнера, которые я указал? Не пытайтесь быть плотным, просто хочу убедиться, что я его получу :) – Yasha

+0

Да, это на самом деле очень стандартно в Python и появляется, например, при многозначном возврате значений из функций. Я добавлю еще один пример, чтобы понять это. – Jeff

+0

Благодарим вас за пример. Я могу следовать за ним до тех пор, пока не попытаюсь использовать 'a, * b = x', который почему-то дает мне« SyntaxError: недопустимый синтаксис ». – Yasha

Смежные вопросы