1

(1 відповідей, залишених у Python)

Поясніть будь ласка, чому в наведеному прикладі .intersection() дає порожній сет в разі пошуку перетинання із об'єктом 'abc', хоча такий же елемент 'abc' присутній в сеті my_set?
Якщо той же об'єкт 'abc' присвоїти змінній, .intersection() дає перетинання 'abc', як і очікувалося.

Приклад:

my_set = {'abc', 'd', 'f', 'y'}

new_set = {'abc'}

print(my_set.intersection('abc')) # set()

print(my_set.intersection(new_set)) #{'abc'}

Дякую за пояснення!

2

(3 відповідей, залишених у Python)

після першого виклику, я викликаю функцію print (), a потім ще раз функцію add_key(upd_age).
причину проблеми знайшов - вона не стосується коду (просто глюк в VS Code якись був - після перезапуску все почало працювати коректно)

Нажаль не знаю, як видалити тему

Необхідно створити словник та функцію, що буде запитувати введення в термінал імені та віку й додавати їх до словника, збільшуючи вік на 1 за допомогою callback-функції.

Програма коректно відпрацьовує перший виклик функції але потім чомусь припиняє роботу.
Якщо не запитувати введення даних через термінал, а наприклад, задати ім'я та вік напряму в функції, то спрацьовують всі виклики функції.

Підкажіть будь ласка: в чому проблема, коли треба ввести дані в терміналі?

my_dict = {}

# callback-функція збільшує значення віку (age) на 1

def upd_age(value):
    upd_value = value + 1
    return upd_value

# функція пропонує ввести в терміналі ім'я (name) та вік (age), після цього додає введене ім'я та збільшений за допомогою
# callback-функції вік до словника й відображає результат


def add_key(callback_fn):
    entered_name = input("Enter the name: ")
    entered_age = int(input("Enter the age: "))
    my_dict[entered_name] = callback_fn(entered_age)
    print(my_dict)
    return my_dict


add_key(upd_age)

# на цьому етапі програма чомусь припиняє роботу, якщо запитувати введення даних через термінал

print("One more time!")

add_key(upd_age)

4

(4 відповідей, залишених у Python)

Щиро дякую!

5

(4 відповідей, залишених у Python)

koala написав:

zip повертає не список, а ітератор. Ітератор - це така абстракція поточного стану циклу. Хороший бік ітераторів - вони не копіюють собі дані, лише зберігають посилання на колекцію та поточну позицію, що дуже економно. Поганий бік ітераторів - їх можна використати лише один раз; ітератор, що закінчився, вже не "оживити".
Для копіювання ітераторів можна скористатися itertools.tee; але тоді не гарантується економність: якщо одна з копій просунеться вперед, tee зберігатиме всі значення, повернуті ітератором.
Правильний спосіб - створювати об'єкт zip кожного разу, як потрібно, це дешева операція.


Велике дякую за Вашу відповідь! Сам би, мабуть, декілька годин шукав.

Доброго дня!

Завдання: створити два списки, поєднати їх за допомогою функції zip(), результат конвертувати в list та dict, вивести в консоль.

При виконанні завдання виникло питання:

spares = ['Samsung', 'Apple', 'Sony'] 
costs = [100, 75, 50]                       

prices_zip = zip(spares, costs)               

prices_list = list(prices_zip)                     
prices_dict = dict(prices_zip)

print(prices_list) # [('Samsung', 100), ('Apple', 75), ('Sony', 50)] - все коректно

print(prices_dict) # { } - пустий словник

Чому після конвертації prices_zip в тип list вона ніби позбавляється елементів і надалі її елементи вже неможливо "витягти" в dict?
Авжеж змінна prices_zip має лишатись, як була, бо для її конвертації  я створюю нову змінну.
Тим більше, для zip-обєктів .copy() не існує.

Навіть якщо я взагалі нічого не змінюю, а лише намагаюсь вивести в консоль:

print(list(prices_zip) #[('Samsung', 100), ('Apple', 75), ('Sony', 50)]

print(dict(prices_zip) # { }

Тож, взагалі неясно, як виконати завдання, коли треба конвертувати zip-об'єкт спочатку в один, а потім в інший формат, зберігаючи повноту даних (якщо, наприклад, я конвертую спочатку zip  в dict, а потім dict в list - то втрачу значення ключів словника).

При цьому, якщо я роблю:

prices_list = list(zip(spares, costs))
prices_dict = dict(zip(spares, costs))

все працює коректно.

Дякую за відповідь.