передача массива в функцию на питоне [закрыт]
Закрыт. Этот вопрос необходимо уточнить или дополнить подробностями. Ответы на него в данный момент не принимаются.
Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение.
Закрыт 4 года назад .
Как на питоне передать массив на выход в функцию? Делаю минимализацию по методу квайна, там очень полезно будет это использование.
Отслеживать
задан 5 окт 2019 в 5:35
Артём Подковыров Артём Подковыров
35 1 1 золотой знак 1 1 серебряный знак 5 5 бронзовых знаков
Так же, как аргумент любого другого типа.
5 окт 2019 в 5:59
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Под массивом вы скорее всего имеете в виду list? Не совсем понятно в чем проблема его передачи в функцию:
def my_function(some_list): #code pass my_function([1, 2, 3, 4, 5])
Или предварительно записав его в переменную
my_list = [1, 2, 3, 4, 5] my_function(my_list)
Отслеживать
ответ дан 5 окт 2019 в 8:04
Константин Комиссаров Константин Комиссаров
2,536 15 15 серебряных знаков 35 35 бронзовых знаков
invalid syntax же!
5 окт 2019 в 16:35
@andreymal где? почему?
5 окт 2019 в 16:37
Вы сами-то пробовали первый пример запустить?
5 окт 2019 в 16:38
@andreymal, а, все, тупанул, сейчас поправлю)
5 окт 2019 в 16:39
Да и второй пример тоже просто не работает, потому что локальная переменная my_list перекроет глобальную, и глобальный список будет недоступен внутри функции
5 окт 2019 в 16:40
- python
- массивы
- функции
- return
-
Важное на Мете
Похожие
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.11.21.1314
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Как передать массив в функцию в Python?
Массив — это объект, его можно передать в функцию как и любой другой объект (число, строку и т.д.) в качестве аргумента.
# можно передать напрямую print([1, 2, 3, 4]) # [1, 2, 3, 4] # можно после присваивания переменной fruits = ['apple', 'banana', 'orange'] print(fruits) # ['apple', 'banana', 'orange']
Указатели как параметры. Передача массивов в функции
Это занятие начнем с рассмотрения указателей в качестве параметров функции.
До этого момента мы с вами объявляли и использовали указатели в рамках одной функции main() для изменения значений переменных. Например, так:
#include int main(void) { short var_a = 10; short* ptr = &var_a; *ptr = 5; return 0; }
Однако особого практического смысла от такой операции не было. Но теперь, когда мы имеем дело с функциями, указатели становятся одним из ключевых элементов. Давайте представим, что нам нужна функция, которая бы меняла значения между двумя переменными. Без указателей решение этой задачи было бы очень корявое. А вот с ними получаем вполне красивое решение:
void swap_2(int* a, int* b) { int t = *a; *a = *b; *b = t; } int main(void) { int x = 5, y = 10; swap_2(&x, &y); return 0; }
Как это работает? Вначале в функции main() выполняется вызов функции swap_2() с передачей адресов переменных x и y. В результате, указатель *a ссылается на переменную x, а указатель *b – на переменную y. Затем, в самой функции swap_2() происходит обмен значениями между указанными областями памяти, и, как следствие, меняются значения переменных x и y.
Почему это решение можно считать красивым? Во-первых, такая функция может менять значения между любыми целочисленными переменными типа int, где бы эти переменные ни были бы определены. Например, в приведенной программе, переменные x и y доступны только в пределах функции main() и недоступны (по их именам) за пределами этой функции. Поэтому напрямую получить к ним доступ в функции swap_2() не получится. Но через указатели это вполне можно сделать. Во-вторых, использование указателей позволяет нам определять функции, которые могут менять и возвращать более одного значения. Как вы помните, после оператора return можно указывать только одно значение (выражение), которое будет возвращено функцией. Прописывать несколько нельзя. Поэтому с возвратом множества значений возникают определенные трудности, которые, хотя, можно преодолеть, например, с помощью структур, о которых мы с вами еще будем говорить. Однако через указатели решить задачу с возвратом множества значений все же куда проще.
Передача массивов через параметры функции
Помимо изменения значений, указатели в параметрах используют с целью передачи массивов функциям. Как я ранее уже отмечал, в языке Си нет специального типа (структуры данных) для массивов. Их следует воспринимать, как непрерывную область памяти, в которой последовательно друг за другом расположены элементы массива:
short ar[5];

При этом имя массива ar можно воспринимать, как указатель на начало этой области. А раз так, то любой одномерный массив можно передать в функцию, используя указатели. Например, следующим образом:
#include int sum_ar(const short* arr, int length) { int res = 0; for(int i = 0; i length; ++i) res += arr[i]; return res; } int main(void) { short ar[] = {1, 2, 3, 4, 5}; int res = sum_ar(ar, sizeof(ar) / sizeof(*ar)); printf("res = %d\n", res); return 0; }
При вызове функции sum_ar() параметр arr будет ссылаться на первый элемент массива ar, а второй параметр length содержать число элементов массива. Затем, используя операцию квадратные скобки, мы через указатель arr перебираем элементы массива ar и подсчитываем их сумму, которая возвращается функцией sum_ar(). Ключевое слово const говорит о том, что значения массива внутри функции меняться не будут. Так принято делать, если данные по указателям только читаются и не меняются. Своего рода, правило хорошего тона при объявлении параметров-указателей.
Как видите, передать массив в функцию достаточно просто. Но здесь у вас может возникнуть вопрос, а зачем определять второй параметр length? Разве нельзя вычислить размер массива непосредственно в функции sum_ar()? Увы, нет. Указатель arr – это уже обычный указатель на ячейки памяти, а не на массив, поэтому операция sizeof() для него вернет размер указателя, а не области памяти, который занимает массив. Определить число элементов массива мы можем только, используя имя массива ar, но не указатель на него. Об этом ранее мы с вами уже говорили.
Если мы еще раз посмотрим на объявление функции sum_ar(), то первый параметр arr можно интерпретировать и как указатель на массив и как указатель на переменную типа short. Так вот, чтобы подчеркнуть, что arr ссылается именно на массив, допустимо этот указатель описывать следующим образом:
int sum_ar(const short arr[], int length) {. }
На уровне машинных кодов оба варианта абсолютно равнозначны. Это все тот же указатель arr, только синтаксис подсказывает программисту, что через ar в функции sum_ar() предполагается работать с непрерывной областью памяти, как с массивом. Не более того.
Также, при необходимости, функция может возвращать константные значения. Для этого достаточно в типе прописать ключевое слово const следующим образом:
const char* find_space(const char* buf) { while(*buf != '\0') { if(*buf == ' ') return buf; buf++; } }
Обычно const прописывают при возвращении константного указателя, так как в других ситуациях особого смысла в const нет. В данном примере, функция находит первый пробел в переданной строке и возвращает указатель на него. Если пробел не был найден, то возвращается значение NULL.
Передача многомерных массивов через параметры функции
Крайне редко, но все же бывают ситуации, когда нам нужно передать не одномерный, а многомерный массив в функцию. Для этого, как вы уже догадались, нужно использовать специальный тип указателя на соответствующий многомерный массив. Например, пусть у нас объявлен двумерный массив с некоторым числом строк и тремя столбцами:
short ar[][3] = {{1, 2, 3}, {4, 5, 6}};
Чтобы его передать через параметр в функцию, следует сделать следующее объявление:
void show_ar2D(const short (*ar)[3], int rows) { for(int i = 0;i rows; ++i) { for(int j = 0;j 3; ++j) printf("%d ", ar[i][j]); printf("\n"); } }
Эта функция принимает указатель на двумерный массив с произвольным числом строк rows, но обязательно тремя столбцами. И, затем, отображает его на экране в виде таблицы.
Использовать такую функцию можно следующим образом:
int main(void) { short ar[][3] = {{1, 2, 3}, {4, 5, 6}}; show_ar2D(ar, sizeof(ar) / sizeof(*ar)); return 0; }
Мы по-прежнему передаем указатель на массив и число строк вторым аргументом. После запуска программы увидим результат:
Как вы понимаете, недостатком использования и передачи многомерных массивов в функцию является необходимость указания точных размеров, кроме первого. В нашем случае, при объявлении функции, необходимо указывать число столбцов, равное трем. И если это значение изменится, то придется вносить правки во все места, где оно используется. Из этой ситуации есть, по крайней мере, два выхода. Первый очевидный. С помощью директивы define определить число столбцов и использовать макроимя в тексте программы:
#include #define COLS 3 void show_ar2D(const short (*ar)[COLS], int rows) { for(int i = 0;i rows; ++i) { for(int j = 0;j COLS; ++j) printf("%d ", ar[i][j]); printf("\n"); } } int main(void) { short ar[][COLS] = {{1, 2, 3}, {4, 5, 6}}; show_ar2D(ar, sizeof(ar) / sizeof(*ar)); return 0; }
Во втором случае определить одномерный массив и работать с ним, как с многомерным. Например, для получения аналога двумерного массива в COLS столбцов, можно использовать следующую формулу:
short ar[] = {1, 2, 3, 4, 5, 6}; short res_ij = ar[i * COLS + j]; // i – индекс строк; j – индекс столбцов
Какой именно вариант использовать на практике зависит от конкретной решаемой задачи и предпочтений программиста.
Видео по теме

Язык Си. Рождение легенды

#1. Этапы трансляции программы в машинный код. Стандарты

#2. Установка компилятора gcc и Visual Studio Code на ОС Windows

#3. Структура и понимание работы программы «Hello, World!»

#4. Двоичная, шестнадцатеричная и восьмеричная системы счисления

#5. Переменные и их базовые типы. Модификаторы unsigned и signed

#6. Операция присваивания. Числовые и символьные литералы. Операция sizeof

#7. Стандартные потоки ввода/вывода. Функции putchar() и getchar()

#8. Функция printf() для форматированного вывода

#9. Функция scanf() для форматированного ввода

#10. Арифметические операции: сложение, вычитание, умножение и деление

#11. Арифметические операции деления по модулю, инкремента и декремента

#12. Арифметические операции +=, -=, *=, /=, %=

#13. Булевый тип. Операции сравнения. Логические И, ИЛИ, НЕ

#14. Условный оператор if. Конструкция if-else

#15. Условное тернарное выражение

#16. Оператор switch множественного выбора. Ключевое слово break

#17. Битовые операции И, ИЛИ, НЕ, XOR. Сдвиговые операции

#18. Генерация псевдослучайных чисел. Функции математической библиотеки

#19. Директивы макропроцессора #define и #undef

#20. Директива #define для определения макросов-функций. Операции # и ##

#21. Директивы #include и условной компиляции

#22. Оператор цикла while

#23. Оператор цикла for

#24. Цикл do-while с постусловием. Вложенные циклы

#25. Операторы break, continue и goto

#26. Указатели. Проще простого

#27. Указатели. Приведение типов. Константа NULL

#28. Долгожданная адресная арифметика

#29. Введение в массивы

#30. Вычисление размера массива. Инициализация массивов

#31. Указатели на массивы

#32. Ключевое слово const с указателями и переменными

#33. Операции с массивами копирование, вставка, удаление и сортировка

#34. Двумерные и многомерные массивы. Указатели на двумерные массивы

#35. Строки. Способы объявления, escape-последовательности

#36. Ввод/вывод строк в стандартные потоки

#37. Строковые функции strlen(), strcpy(), strncpy(), strcat(), strncat()

#38. Строковые функции сравнения, поиска символов и фрагментов

#39. Строковые функции sprintf(), atoi(), atol(), atoll() и atof()

#40. Объявление и вызов функций

#41. Оператор return. Вызов функций в аргументах

#42. Прототипы функций

#43. Указатели как параметры. Передача массивов в функции

#44. Указатели на функцию. Функция как параметр (callback)

#45. Стековый фрейм. Автоматические переменные

#46. Рекурсивные функции

#47. Функции с произвольным числом параметров

#48. Локальные и глобальные переменные

#49. Локальные во вложенных блоках

#50. Ключевые слова static и extern

#51. Функции malloc(), free(), calloc(), realloc(), memcpy() и memmove()

#52. Перечисления (enum). Директива typedef

#53. Структуры. Вложенные структуры

#54. Указатели на структуры. Передача структур в функции

#55. Реализация стека (пример использования структур)

#56. Объединения (union). Битовые поля

#57. Файловые функции: fopen(), fclose(), fgetc(), fputc()

#58. Функции perror(), fseek() и ftell()

#59. Функции fputs(), fgets() и fprintf(), fscanf()

#60. Функции feof(), fflush(), setvbuf()

#61. Бинарный режим доступа. Функции fwrite() и fread()
© 2023 Частичное или полное копирование информации с данного сайта для распространения на других ресурсах, в том числе и бумажных, строго запрещено. Все тексты и изображения являются собственностью сайта
Передача массива в функцию
условие задачи: Объявить два целочисленных массива с разными размерами и написать функцию, которая заполняет их элементы значениями и показывает на экран. Функция должна принимать два параметра – массив и его размер.
вот код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
def Fill_array(arr, brr, length): arr = [random.randint(0, 25) for _ in range(length)] brr = [random.randint(0, 25) for _ in range(length)] pass def Show_array(arr, brr, length): for i in range(length): print(arr[i], end='\t') for i in range(length): print(brr[i], end='\t') pass length = int(input("Укажите кол-во срок: ")) arr = [] brr = [] Fill_array(arr, brr, length) Show_array(arr, brr, length)
Делал как на с++ , но видимо тут так не работает. Помогите пожалуйста.
Лучшие ответы ( 2 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Передача массива в функцию используя указатель на функцию
У меня имеется готовая программа без передачи функции в функцию указателем, мне нужно передать.
Передача двухмерного массива из функцию в функцию
Допустим у меня есть функция, в которой "генерируется" массив. Но нужно его передать в другую.
Передача массива в функцию и возврат другого массива из неё
Чем мне нравится ВБ.НЕТ — так это очень грамотной, простой и удобной работой с массивами. Они.
Передача двухмерного массива в функцию и изменение элемента массива
Такая проблема! Нужно передать в функцию двухмерный массив и изменить на елемент который равен 0 и.
![]()
5416 / 3840 / 1214
Регистрация: 28.10.2013
Сообщений: 9,554
Записей в блоге: 1

Сообщение было отмечено Ivan _pupkin как решение
Решение
1 2 3 4 5 6 7 8 9 10
>>> arr = [] >>> brr = [] >>> def Fill_array(arr, brr, length): arr[:] = [random.randint(0, 25) for _ in range(length)] brr[:] = [random.randint(0, 25) for _ in range(length)] >>> Fill_array(arr, brr, 10) >>> arr [16, 18, 24, 15, 10, 17, 15, 12, 18, 5] >>>
Сообщение от Ivan _pupkin 
Делал как на с++
А зачем? На python, кстати, в названиях функций верхний регистр не используют.
P.P.S. И зачем использовать pass не по назначению?
1727 / 967 / 199
Регистрация: 22.02.2018
Сообщений: 2,694
Записей в блоге: 6
Garry Galler, А почему нет импорта модуля random. Здесь не полный код, а только фрагмент?
![]()
5416 / 3840 / 1214
Регистрация: 28.10.2013
Сообщений: 9,554
Записей в блоге: 1
Сообщение от Viktorrus 
только фрагмент
Фрагмент показывающий как присвоить списку значение по ссылке: a[:]=.
import random просто не скопировал сюда из IDLE.
Регистрация: 17.12.2018
Сообщений: 257
Сообщение от Garry Galler 
P.P.S. И зачем использовать pass не по назначению?
В видеоуроке говорилось, что если функция ничего не возвращает, то надо писать pass.
![]()
5416 / 3840 / 1214
Регистрация: 28.10.2013
Сообщений: 9,554
Записей в блоге: 1

Сообщение было отмечено Ivan _pupkin как решение
Решение
Сообщение от Ivan _pupkin 
что если функция ничего не возвращает, то надо писать pass.
Неверно. Функция всегда что-то возвращает. Если мы не указываем явного возврата — функция вернет объект None.
А ключевое слово pass используется как заполнитель тела функций (или операторов), которые вообще не содержат ни одной инструкции:
def dummy(): pass # пустая функция-заглушка
так как в Python запрещены пустые блоки.
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Передача массива структур в функцию не указывая размера массива
Я читаю с командной строки файл в котором содержится массив структур. Есть библиотека с функцией в.

Передача массива в функцию, и получения массива из функции
Есть Unit1, который использует функцию из Unit2, имеющую следующий вид: function.
Передача массива в функцию
Как записать данные в массив, который в функции и после вызова функции получить эти данные. По.
Передача массива в функцию
Написал такой код. Прога выводит всё правильно как и должна: минимальный элемент массива, сумма.
Передача массива в функцию
Какие есть способы для передачи массивы в функцию. И как передать массив с указателем на него чтобы.

Передача массива в функцию
Помогите разобраться как правильно вписать простейший массив вфункцию #include<iostream>.
