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

Как обозначить неизвестную переменную в python

  • автор:

Как создавать переменную с заранее неизвестным именем

Я хочу создавать объекты класса так, чтобы они назывались по признаку self.name.

Т.е, к примеру, в псевдокоде это будет выглядеть так:

Если переменная создаётся в глобальной области видимости:

Если переменная создаётся в локальной области видимости (внутри функции):

Если переменная создаётся внутри объекта класса:

Евгений's user avatar

Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.9.6.43612

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Объявление неизвестной переменной типа в Python?

У меня есть ситуация в Python (кашель, домашняя работа), где мне нужно умножить КАЖДЫЙ ЭЛЕМЕНТ в заданном списке объектов указанное число раз и вернуть выходные данные элементов. Проблема в том, что приведенные примеры входных данных имеют разные типы. Например, в одном случае можно ввести список строк, элементы которых мне нужно умножить, в то время как другие могут быть целыми числами. Так что мой тип возврата должен варьироваться. Я хотел бы сделать это, не проверяя каждый тип объекта. Есть ли способ сделать это? Я знаю, в C # я мог бы просто использовать «var», но я не знаю, существует ли такая вещь в Python?

Я понимаю, что переменные не должны быть объявлены, но в этом случае я не вижу никакого способа обойти это. Вот функция, которую я сделал:

Посмотрите, как мне нужно добавить к выходной переменной. Если я просто пытаюсь убрать выходное присваивание в первой строке, я получаю ошибку, что переменная не была определена. Но если я назначу ему 0 или «» для пустой строки, может возникнуть исключение, так как вы не можете добавить 3 к строке или «a» к целому числу и т. Д .

Вот несколько примеров входов и выходов:

11 ответов

Очень легко в Python. Вам нужно получить тип данных в вашем списке — используйте функцию type () для первого элемента — type (argsList [0]). Затем, чтобы инициализировать вывод (где у вас теперь есть . ), вам нужно нулевое или нулевое значение для этого типа. Так как int () или float () или str () возвращают ноль или nul для их типа, так и тип (argsList [0]) () возвращает нулевое или nul-значение для любого типа, который есть в вашем списке.

Итак, вот ваша функция с одной незначительной модификацией:

Слова с :: argsList = [1, 2, 3, 4] и [1.0, 2.0, 3.0, 4.0] или «abcdef» . и т. д.,

Благодаря Алексу Мартелли у вас есть наилучшее решение:

Это красиво и элегантно. Сначала мы создаем итератор с iter() , затем мы используем next() , чтобы получить первый объект в списке. Затем мы накапливаем итерацию по остальному списку, и все готово. Нам никогда не нужно знать тип объектов в argsList, и они действительно могут быть разных типов, если ко всем типам может применяться оператор + . Это утка печатать.

На мгновение прошлой ночью я смутился и подумал, что вам нужна функция, которая вместо явного списка просто принимает один или несколько аргументов.

Аргумент *args функции указывает Python собрать все аргументы этой функции и создать из них кортеж; тогда кортеж привязан к имени args . Вы можете легко сделать из него список, а затем использовать метод .pop(0) , чтобы получить первый элемент из списка. Это требует памяти и времени на создание списка, поэтому решение iter() настолько элегантно.

Это просто решение Вубла, переписанное с использованием * args.

Примеры вызова этого:

Наконец, я собираюсь быть злым и жаловаться на решение, которое вы приняли. Это решение зависит от того, имеет ли базовый класс объекта разумный ноль или ноль, но не у всех классов есть это. int() возвращает 0 , а str() возвращает » (пустая строка), поэтому они работают. Но как насчет этого:

Удачи в учебе, и я надеюсь, что вам нравится Python так же, как и мне.

Если вы просто хотите заполнить пробел в своем коде, вы можете попробовать установить object=arglist[0].__class__() , чтобы присвоить ему нулевое эквивалентное значение этого класса.

Это приведет к сбою, если список пуст, но вы можете проверить это в начале функции и вернуть то, что считаете нужным.

Map выполняет функцию, переданную для каждого элемента списка (возвращает новый список), а затем sum делает + = в списке.

Не нужно тестировать объекты, просто умножьте их!

Все просто работают

Вы дали эти примеры входов и выходов:

Входные данные: (‘a’, ‘b’) Выходные данные: ‘aaaabbbb’ Входные данные: (2,3,4) Выходные данные: 36

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

Самый простой способ решить эту проблему — передать аргументы в списке. Затем вы можете посмотреть на первый элемент в списке и работать с ним. Вот функция, которая требует от вызывающего абонента передать список из двух элементов:

Теперь, как мы можем сделать это расширить за два пункта? Ну, в вашем примере кода вы не были уверены, что назначить выводу вашей переменной. Как насчет назначения lst [0]? Тогда он всегда имеет правильный тип. Затем вы можете перебрать все остальные элементы в lst и накопить в вашей выходной переменной, используя + =, как вы написали. Если вы не знаете, как перебрать список элементов, но пропустите первое, что есть в списке, воспользуйтесь поиском в Google «python list slice».

Теперь, как мы можем сделать так, чтобы пользователь не упаковывал все в список, а просто вызывал функцию? Что мы действительно хотим, так это какой-то способ принять любые аргументы, которые пользователь хочет передать функции, и составить из них список. Возможно, существует специальный синтаксис для объявления функции, в которой вы говорите Python, что хотите просто объединить аргументы в список. Вы можете проверить хороший учебник и посмотреть, что в нем говорится о том, как определить функция.

Теперь, когда мы рассмотрели (в общих чертах), как накапливать ответ с помощью + =, давайте рассмотрим другие способы накапливания ответа. Если вы знаете, как использовать понимание списка, вы можете использовать один из них, чтобы вернуть новый список, основанный на списке аргументов, с умножением, выполненным для каждого аргумента; затем вы можете как-то сократить список до одного элемента и вернуть его. В Python 2.3 и новее есть встроенная функция sum() , и вы можете прочитать об этом. [РЕДАКТИРОВАТЬ: О, черт, sum() работает только с числами. См примечание добавлено в конце.]

Надеюсь, это поможет. Если вы все еще в замешательстве, я предлагаю вам связаться с вашим учителем и попросить разъяснений. Удачи.

Постскриптум В Python 2.x есть встроенная функция reduce() , и ее можно реализовать sum() , используя reduce() . Однако создатель Python считает, что лучше просто использовать sum() , и фактически он удалил reduce() из Python 3.0 (ну, он переместил его в модуль с именем functools ).

P.P.S. Если вы понимаете, как работает список, вот еще одна вещь, о которой стоит подумать. Если вы используете понимание списка, а затем передаете результат sum() , вы создаете список для использования один раз, а затем отбрасываете. Разве не было бы замечательно, если бы мы могли получить результат, но вместо того, чтобы построить весь список и затем отбросить его, мы могли бы просто использовать функцию sum() , которая потребляет элементы списка так же быстро, как они генерируются? Возможно, вы захотите прочитать это: Выражения генератора против понимания списка

РЕДАКТИРОВАТЬ: О, черт возьми, я предполагал, что sum() встроенный Python будет использовать утки. На самом деле документировано работать только с числами. Я разочарован! Мне придется поискать и посмотреть, были ли какие-либо дискуссии по этому поводу, и понять, почему они сделали это так, как сделали; у них, вероятно, были веские причины. Между тем, вы могли бы также использовать ваше решение + =. Прости за это.

РЕДАКТИРОВАТЬ: Хорошо, читая другие ответы, я теперь заметил два способа, предлагаемых для очистки первого элемента в списке.

Переменные в Python

обложка статьи

В данном уроке мы рассмотрим чрезвычайно важную концепцию языка Python: переменные. Они позволят нам запоминать, переиспользовать и передавать данные в программах. Поскольку переменные можно найти в любом современном языке программирования, поэтому вам уже могут быть знакомы основные концепции. Однако я настоятельно рекомендую прочитать статью даже тем, для кого Python является не первым языком, поскольку здесь будут разобраны особенности, которые не имеют аналогов в других языках.

Во первых стоит отметить что Python является языком с динамической типизацией. Это означает что любая переменная может содержать любые значение. Это отл

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

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