Как создавать переменную с заранее неизвестным именем
Я хочу создавать объекты класса так, чтобы они назывались по признаку self.name.
Т.е, к примеру, в псевдокоде это будет выглядеть так:
Если переменная создаётся в глобальной области видимости:
Если переменная создаётся в локальной области видимости (внутри функции):
Если переменная создаётся внутри объекта класса:
Дизайн сайта / логотип © 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 является языком с динамической типизацией. Это означает что любая переменная может содержать любые значение. Это отл