Кортеж как аргумент
Это конечно здорово, но вот я думаю: а что если у меня есть здоровый такой кортеж(допустим 500 элементов), и мне надо передать его в эту функцию, не буду же я переписывать их все вручную
Первая мысль была: «А че, *args это же кортеж, чего бы не скормить функции кортеж?»:
1 2 3 4
. numbers = (2, 3, 4, 5) print(powersum(2, numbers))
На что Python сказал: «Гуляй-вася, пиши по новой.»
В чем подвох, что я не так понял? И как теперь быть, переписывать функцию, вместо *args пусть принимает кортеж? И теперь у меня будет одна функция для *args, в другая для tuple?
Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Создать кортеж и распаковать кортеж в несколько переменных
Создать кортеж и распаковать кортеж в несколько переменных
Имеется кортеж из нескольких производных элементов , необходимо этот кортеж отсортировать
имеется кортеж из нескольких производных элементов , необходимо этот кортеж отсортировать,если хотя.
Заполните один кортеж десятью случайными целыми числами от 0 до 5 включительно. Также заполните второй кортеж числами от
Заполните один кортеж десятью случайными целыми числами от 0 до 5 включительно. Также заполните.
Как вывести кортеж целиком и как распаковать кортеж в переменные?
Как вывести кортеж целиком и как распаковать кортеж в переменные?
Функция, возвращает квадрат аргумента, если аргумент число; хвост списка, если аргумент список; иначе сам аргумент
Помогите, пожалуйста, с заданием: Написать функцию, которая возвращает квадрат аргумента, если.
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305
Сообщение было отмечено Рыжий Лис как решение
Решение
print(powersum(2, *numbers))
**dct для передачи словаря
Регистрация: 09.05.2008
Сообщений: 13
Блин, все так просто оказалось) Спасибо!
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Как изменить кортеж
У нас есть кортеж my_tuple = (1, 82, 21). Каким образом мы можем добавить в него новое значение 38.
Как перебирать кортеж
Нужно составит программу которая брала бы слово с кортежа перемешивала буквы в слове и предлагала.
Как сохранить кортеж в БД?
как сохранить такой лист в строку и прочитать потом? мне надо его в бд сохранить private static.
Как распаковать кортеж?
При попытке распаковать кортеж из аргументов (*args), в PyCharm постоянно получаю: ValueError.
Как передать кортеж в функцию python
Кортеж (tuple) представляет последовательность элементов, которая во многом похожа на список за тем исключением, что кортеж является неизменяемым (immutable) типом. Поэтому мы не можем добавлять или удалять элементы в кортеже, изменять его.
Для создания кортежа используются круглые скобки, в которые помещаются его значения, разделенные запятыми:
tom = ("Tom", 23) print(tom) # ("Tom", 23)
Также для определения кортежа мы можем просто перечислить значения через запятую без применения скобок:
tom = "Tom", 23 print(tom) # ("Tom", 23)
Если вдруг кортеж состоит из одного элемента, то после единственного элемента кортежа необходимо поставить запятую:
tom = ("Tom",)
Для создания кортежа из другого набора элементов, например, из списка, можно передать список в функцию tuple() , которая возвратит кортеж:
data = ["Tom", 37, "Google"] tom = tuple(data) print(tom) # ("Tom", 37, "Google")
С помощью встроенной функции len() можно получить длину кортежа:
tom = ("Tom", 37, "Google") print(len(tom)) # 3
Обращение к элементам кортежа
Обращение к элементам в кортеже происходит также, как и в списке, по индексу. Индексация начинается также с нуля при получении элементов с начала списка и с -1 при получении элементов с конца списка:
tom = ("Tom", 37, "Google", "software developer") print(tom[0]) # Tom print(tom[1]) # 37 print(tom[-1]) # software developer
Но так как кортеж — неизменяемый тип (immutable), то мы не сможем изменить его элементы. То есть следующая запись работать не будет:
tom[1] = "Tim"
При необходимости мы можем разложить кортеж на отдельные переменные:
name, age, company, position = ("Tom", 37, "Google", "software developer") print(name) # Tom print(age) # 37 print(position) # software developer print(company) # Google
Получение подкортежей
Как и в списках, можно получить часть кортежа в виде другого кортежа
tom = ("Tom", 37, "Google", "software developer") # получем подкортеж с 1 по 3 элемента (не включая) print(tom[1:3]) # (37, "Google") # получем подкортеж с 0 по 3 элемента (не включая) print(tom[:3]) # ("Tom", 37, "Google") # получем подкортеж с 1 по послдений элемент print(tom[1:]) # (37, "Google", "software developer")
Кортеж как параметр и результат функций
Особенно удобно использовать кортежи, когда необходимо возвратить из функции сразу несколько значений. Когда функция возвращает несколько значений, фактически она возвращает в кортеж:
def get_user(): name = "Tom" age = 22 company = "Google" return name, age, company user = get_user() print(user) # ("Tom", 37, "Google")
При передаче кортежа в функцию с помощью оператора * его можно разложить на отдельные значения, которые передаются параметрам функции:
def print_person(name, age, company): print(f"Name: Age: Company: ") tom = ("Tom", 22) print_person(*tom, "Microsoft") # Name: Tom Age: 22 Company: Microsoft bob = ("Bob", 41, "Apple") print_person(*bob) # Name: Bob Age: 41 Company: Apple
Перебор кортежей
Для перебора кортежа можно использовать стандартные циклы for и while . С помощью цикла for:
tom = ("Tom", 22, "Google") for item in tom: print(item)
С помощью цикла while:
tom = ("Tom", 22, "Google") i = 0 while i < len(tom): print(tom[i]) i += 1
Проверка наличия значения
Как для списка с помощью выражения элемент in кортеж можно проверить наличие элемента в кортеже:
user = ("Tom", 22, "Google") name = "Tom" if name in user: print("Пользователя зовут Tom") else: print("Пользователь имеет другое имя")
Как элементы кортежа в Python разобрать на отдельные аргументы функции?
И здесь еще одно условие: элементы кортежа - это файлы, а функция требует подавать в нее аргументы строками (именами файлов). Итак, есть набор папок spk1 , spk2 и т.д., в них лежат по 2-4 файла каждого спикера (всякая папка содержит файлы с высказываниями одного и того же говорящего; и так - 11 говорящих). Моя конечная задача сопоставить голоса в каждой на схожесть (причем только в пределах своей папки: сравниваю человека с самим собой). Ранее мне подсказали здесь (спасибо!) - и я получил кортежи с перебором всех возможных сочетаний файлов внутри папок. На рисунке для примера один из переборов в консоли выделил. Теперь сложность вот в чем: метод библиотеки speechbrain требует передавать ему файлы как строковые аргументы с путями/именами файлов. Скажем, так:
score, prediction = verification.verify_files('voices/spk7/spk_7_track_3.wav', 'voices/spk8/spk_8_track_1.wav')
- брал кортеж,
- соединял его с путем к первому файлу, например, voices/spk7/ ,
- соединял его с путем ко второму файлу (он такой же) - voices/spk7/ ,
- передавал эти 2 строки в функцию?
Должно получиться нечто такое:
for root, dirs, files in os.walk('Voices/'): for elem in files: res = list(combinations(files, 2)) # получаем списки кортежей: [(файл 1, файл 2), (файл 1, файл 3). (файл 3, файл 4)] for tuples in res: # идем по каждому картежу в списке # здесь какой-то код для файла 1 и файла 2: verification = SpeakerRecognition.from_hparams(source="speechbrain/spkrec-ecapa-voxceleb", savedir="pretrained_models/spkrec-ecapa-voxceleb") score, prediction = verification.verify_files('voices/spk7/spk_7_track_3.wav', 'voices/spk8/spk_8_track_1.wav')
Как передать кортеж в функцию python
Одной из распространенных сфер, где применяются упаковка и распаковка - это параметры функций. Так, в определениях различных функций нередко можно увидеть, что они принимают такие параметры как *args и **kwargs .
Термины args и kwargs — это соглашения по программированию на Python, в реальности вместо них можно использовать любые именования. *args представляет параметры, которые передаются по позиции. А **kwargs означает параметры, которые передаются по имени. обозначает аргументы ключевого слова.
Оператор * применяется с любым итерируемым объектом (например, кортежем, списком и строками). Тогда как оператор ** можно использовать только со словарями.
*args
Оператор * позволяет передать в функцию несколько значений, и все они будут упакованы в кортеж:
def fun(*args): # обращаемся к первому элементу кортежа print(args[0]) # выводим весь кортеж print(args) fun("Python", "C++", "Java", "C#")
Здесь функция fun принимает кортеж значений. При вызове мы можем передать ей различное количество значений. Так, в примере выше передается четыре строки, которые образуют кортеж. Консольный вывод программы:
Python ('Python', 'C++', 'Java', 'C#')
Благодаря такой возможности мы можем передавать в функцию переменное количество значений:
def sum(*args): result = 0 for arg in args: result += arg return result print(sum(1, 2, 3)) # 6 print(sum(1, 2, 3, 4)) # 10 print(sum(1, 2, 3, 4, 5)) # 15
Оператор **
Оператор ** упаковывает аргументы, переданные по имени, в словарь. Имена параметров служат ключами. Например, определим функцию, которая просто будет выводить все переданные параметры
def fun(**kwargs): print(kwargs) # выводим словарь на консоль fun(name="Tom", age="38", company="Google") fun(language="Python", version="3.11")
Консольный вывод программы:
Поскольку аргументы передаются в функцию в виде словаря, то внутри функции через ключи мы можем получить их значения:
def fun(**kwargs): for key in kwargs: print(f" = ") fun(name="Tom", age="38", company="Google")
Консольный вывод программы:
name = Tom age = 38 company = Google
Распаковка аргументов
Выше было описано, как операторы * и ** применяются для упаковки аругментов в кортеж и словарь соответственно. Но эти же операторы могут использоваться для распаковки.
Оператор * и распаковка
Сначала рассмотрим ситуацию, где это может пригодиться.Пусть мы передаем в функцию кортеж:
def sum(*args): result = 0 for arg in args: result += arg return result numbers = (1, 2, 3, 4, 5) print(sum(numbers))
Здесь в вызов функции sum передается кортеж. Параметр *args по сути тоже представляет кортеж, и кажется, все должно работать. Тем не менее мы столкнемся с ошибкой
TypeError: unsupported operand type(s) for +=: 'int' and 'tuple'
То есть в данном случае кортеж numbers передается как элемент кортежа *args .
И чтобы элементы кортежа были переданы в кортеж *args как отдельные значения, необходимо выполнить их распаковку:
def sum(*args): result = 0 for arg in args: result += arg return result numbers = (1, 2, 3, 4, 5) # применяем распаковку - *numbers print(sum(*numbers)) # 15
Здесь при передачи кортежа numbers в функцию sym применяется распаковка: *numbers
Другим случаем распаковки может быть ситуация, когда функция принимает несколько параметров, а мы передаем один кортеж или список:
def print_person(name, age, company): print(f"Name:, Age: , Company: ") person =("Tom", 38, "Google") # выполняем распаковку кортежа person print_person(*person) # Name:Tom, Age: 38, Company: Google
В данном случае выражение *person раскладывает кортеж person на отдельные значения, которые передаются параметрам name, age и company.
Оператор ** и распаковка
Оператор ** применяется для распаковки словарей:
def print_person(name, age, company): print(f"Name:, Age: , Company: ") tom = # выполняем распаковку словаря tom print_person(**tom) # Name:Tom, Age: 38, Company: Google
Здесь выражение **tom раскладывает словарь на отдельные значения, которые передаются параметрам name, age и company по названию ключей.
Сочетание параметров
Параметры *args и *kwargs могут использоваться в функции вместе с другими параметрами. Например:
def sum(num1, num2, *nums): result=num1+num2 for n in nums: result += n return result print(sum(1,2,3)) # 6 print(sum(1,2,3,4)) # 10