Как передать список в функцию python
Перейти к содержимому

Как передать список в функцию python

  • автор:

Как передать список в аргумент функции Python

как мне сделать чтобы функции список(num_my) передавался через аргумент? что я делаю не так? нужно чтобы функция отрабатывала как пример выше.

def result(num_my): num = [54,24,34,1,2,3] num_res = [] for number in num: if number in num_my: num_res.append(number) return num_res num_1 = (result([54,24,1,2,3])) num_2 = (result([34,1,3])) print(num_1) print(num_2) 

Отслеживать
UserNameAK
задан 31 янв 2020 в 19:48
UserNameAK UserNameAK
47 1 1 золотой знак 1 1 серебряный знак 8 8 бронзовых знаков
Сейчас что не так? Сдвинь return на уровень влево.
31 янв 2020 в 19:53

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Вам нужно убрать один отступ в функции, чтобы стало так:

def result(num_my): num = [54,24,34,1,2,3] num_res = [] for number in num: if number in num_my: num_res.append(number) return num_res 

А еще лучше, если вы используете «pythonicway»:

def result(num_my): num = [54,24,34,1,2,3] return [number for number in num if number in num_my] 

Отслеживать
ответ дан 31 янв 2020 в 19:57
11.9k 2 2 золотых знака 11 11 серебряных знаков 28 28 бронзовых знаков

Огромное спасибо, все моя не внимательность(( просидел час точно думал что не так делаю, а тут такая мелочь))))) Спасибо за подсказку!)

Список Python как аргумент по умолчанию

В разделе рассмотрен один из самых опасных случаев использование списка list (изменяемых последовательностей), когда список используется, как аргумент по умолчанию для функций.

Сморим следующий пример.

# определим функцию, где корзина покупателя 'basket' # по умолчанию должна быть пустым списком покупок def add_fruit(fruit, basket=[]): # при покупке - корзина пополняется basket.append(fruit) return basket >>> b = add_fruit("banana") >>> b # ['banana'] # Внимание! Аргумент `basket` не передается. >>> c = add_fruit("apple") >>> c # ['banana', 'apple'] # Да ладно, ведь при инициализации # в аргументах функции список пустой. 

Из примера видно, что функция add_fruit() вызывается дважды, при чем аргумент basket (список сделанных покупок) не передается! Конечным результатом является список из двух товаров [‘banana’, ‘apple’] , как это произошло?

Причина такого поведения заключается в том, что когда интерпретатор определяет функцию, он также создает аргумент по умолчанию. Затем он связывает этот аргумент и созданный объект (ставит ссылку на него в памяти). В примере, Python выделил пустой список и привязал его к аргументу basket (корзине покупок).

Другими словами, пустой список создается один раз и аргумент basket указывает на него в течение всего времени существования функции. Единственное исключение — это когда аргументу basket передается другой список, но это не изменит значение по умолчанию. Всякий раз, когда вызывается функция снова, без указания basket , то она будет использовать значение по умолчанию, которое было создано при определении функции.

Чтобы избежать подобного поведения, аргументы по умолчанию должны быть неизменяемыми! В данном конкретном случае, можно аргументу basket присвоить значение None и создать пустой список, если basket is None , в противном случае работать со списком, который передается в функцию.

def add_fruit(fruit, basket=None): if basket is None: basket = [] basket.append(fruit) return basket >>> b = add_fruit("banana") >>> b # ['banana'] >>> c = add_fruit("apple") >>> c # ['apple'] 

Теперь создается пустой список покупок всякий раз, когда аргумент basket не передается функции, что исправляет ошибку.

  • КРАТКИЙ ОБЗОР МАТЕРИАЛА.
  • Список Python как аргумент по умолчанию
  • Использование списка в качестве стека
  • Использование списка в качестве очереди
  • Генератор списка list
  • Эффективное использование генераторов списков
  • Операция присваивания на месте и списки
  • Поведение списков Python в разных областях видимости
  • Сравнение и идентичность двух списков
  • Как получить несколько последних элементов списка

Распаковка аргументов для передачи в функцию Python

Бывают ситуации, когда для функции, требующей отдельных позиционных аргументов, значения этих аргументов уже находятся в списке или кортеже, и для вызова функции должны быть распакованы.

Например, встроенная range() функция ожидает отдельные аргументы start и stop . Если они не доступны отдельно, то можно распаковать аргументы из списка list или кортежа tuple , вызвав функцию с переменной этого списка/кортежа, а впереди нее поставить символ одной звездочки * :

# обычный вызов с отдельными аргументами >>> list(range(3, 6)) # [3, 4, 5] >>> args = [3, 6] # вызов с аргументами, распакованными из списка >>> list(range(*args)) # [3, 4, 5] 

Таким же образом, из словаря dict в функцию можно передать ключевые аргументы, только в этом случае, перед переменной словаря ставится два символов звездочки ** :

>>> def parrot(voltage, state='a stiff', action='voom'): . print("-- This parrot wouldn't", action, end=' ') . print("if you put", voltage, "volts through it.", end=' ') . print("E's", state, "!") . >>> d = "voltage": "four million", "state": "bleedin' demised", "action": "VOOM"> >>> parrot(**d) # -- This parrot wouldn't VOOM if you put four million volts through it. E's bleedin' demis 
  • символом * — распаковывают последовательности в качестве элементов которых одно значение (списки, кортежи, множества)
  • два символа ** — распаковывают последовательности в качестве элементов которых имеется ключ и значение (словари)

Примеры распаковки списков и словарей с аргументами для функции:

date_inf = 'year': "2020", 'month': "12", 'day': "06"> f_name = " - - .txt".format(**date_inf) print(f_name) # 2020-12-06.txt fruits = ['lemon', 'orange', 'banana', 'tomato'] print(*fruits) # lemon orange banana tomato 

Распаковку аргументов можно использовать несколько раз в функции:

date_info = 'year': "2020", 'month': "01", 'day': "01"> track_info = 'artist': "Beethoven", 'title': 'Symphony No 5'> filename = " - - - - .txt".format(**date_info, **track_info) print(filename) # 2020-01-01-Beethoven-Symphony No 5.txt 
fruits = ['lemon', 'orange', 'banana', 'tomato'] first, second, *orher = fruits print(orher) # ['banana', 'tomato'] first, *orher = fruits print(orher) # ['orange', 'banana', 'tomato'] first, *middle, last = fruits print(middle) # ['orange', 'banana'] 
  • КРАТКИЙ ОБЗОР МАТЕРИАЛА.
  • Функции это объекты
  • Функции могут иметь атрибуты
  • Функции могут храниться в структурах данных
  • Функции могут быть вложенными
  • Передача функции в качестве аргумента другой функции
  • Область видимости переменных функции
  • Операторы global и nonlocal
  • Параметры (аргументы) функции
  • Ключевые аргументы в определении функции Python
  • Значение аргумента по умолчанию в функциях Python
  • Варианты передачи аргументов в функцию Python
  • Переменные аргументов *args и **kwargs в функции Python
  • Распаковка аргументов для передачи в функцию Python
  • Как оцениваются аргументы при вызове функции?
  • Строгие правила передачи аргументов в функцию Python
  • Инструкция return
  • Анонимные функции (lambda-выражения)
  • Строки документации в функциях Python
  • Рекурсия
  • Замыкания в функциях Python
  • Перегрузка функций

Как передать список в качестве аргумента функции?

Занимаюсь реализацией решения ОДУ.
В функцию необходимо передать 4 аргумента , два из них — массивы (списки в моём случае, допустимо же? )
Как это сделать? Видимо, неверно поняла фишку с использованием символа * при передаче в функцию списка )
(def explicitEulerMethod(n, h, *x, *y) не прокатило )

  • Вопрос задан более трёх лет назад
  • 19860 просмотров

Комментировать
Решения вопроса 1
Александр @fireSparrow

Звёздочка в данном случае — это распаковка. Её нужно использовать в противоположной ситуации — когда нужно передать не сам список, а его элементы в качестве отдельных аргументов.

Чтобы передать сам список, никаких дополнительных трюков не нужно. Если вы просто напишете его имя, это сам список и будет.

Ответ написан более трёх лет назад
Нравится 4 2 комментария
dr sbtn @dawasaturday Автор вопроса
Theodore_Codeman @Theodore_Codeman
Снимаю перед вами шляпу за данную помощь)
Ответы на вопрос 1

fox_12

Владимир Куц @fox_12 Куратор тега Python
Расставляю биты, управляю заряженными частицами

Ну так и передавайте:
def explicitEulerMethod(n, h, x, y)

где x и y — массивы

Ответ написан более трёх лет назад
Нравится 2 2 комментария
dr sbtn @dawasaturday Автор вопроса
То бишь только потом при их использовании с индексами и размерностями работать?

fox_12

Владимир Куц @fox_12 Куратор тега Python

Дарья Субботина: В смысле «только потом»? Опишите более внятно какие затруднения вы видите. Вы передаете в функцию 4 аргумента. 2 — переменные и 2 массива x и y. Первый — размерностью len(x), второй — len(y). Пробежаться по всем индексам первого массива — for element in x: . второго — for element in y: Исходя из этих знаний выполняете в функции действия нам массивами.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *