Python вызвать функцию строкой

Как использовать строки для вызова функций/методов?

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

def a(): pass def b(): pass dispatch = 'go': a, 'stop': b> # Обратите внимание на отсутствие паролей для функций dispatch[get_input()]() # Обратите внимание на конечные скобки для вызова функции 
import foo getattr(foo, 'bar')() 

Обратите внимание, что getattr() работает с любым объектом, включая классы, экземпляры классов, модули и так далее. Это используется в нескольких местах стандартной библиотеки,например,так:

class Foo: def do_foo(self): . def do_bar(self): . f = getattr(foo_instance, 'do_' + opname) f()
def myFunc(): print("hello") fname = "myFunc" f = locals()[fname] f()

Существует ли аналог Perl’овской chomp()для удаления новых строк из строк?

Вы можете использовать S.rstrip(«\r\n») для удаления всех вхождений любого терминатора строки из конца строки S без удаления других конечных пробелов. Если строка S представляет более одной строки с несколькими пустыми строками в конце, терминаторы строк для всех пустых строк будут удалены:

>>> lines = ("line 1 \r\n" . "\r\n" . "\r\n") >>> lines.rstrip("\n\r") 'line 1 '

Поскольку это обычно требуется только при чтении текста по одной строке за раз, использование S.rstrip() таким образом работает хорошо.

Существует ли эквивалент scanf()или sscanf()?

Для простого синтаксического анализа ввода самый простой подход обычно состоит в том, чтобы разбить строку на слова, разделенные пробелами, с помощью метода split() строковых объектов, а затем преобразовать десятичные строки в числовые значения с помощью int() или float() . split() поддерживает необязательный параметр «sep», который полезен, если в строке в качестве разделителя используется что-то отличное от пробела.

Для более сложного анализа ввода регулярные выражения более эффективны, чем sscanf() в C, и лучше подходят для этой задачи.

Что означает ошибка ‘UnicodeDecodeError’ или ‘UnicodeEncodeError’?

Performance

Моя программа работает слишком медленно.Как мне ускорить ее?

Это вообще сложный вопрос.Во-первых,вот список вещей,о которых следует помнить,прежде чем погружаться дальше:

  • Характеристики производительности различаются в зависимости от реализации Python. Этот FAQ посвящен CPython .
  • Поведение может отличаться в разных операционных системах,особенно когда речь идет о вводе/выводе или многопоточности.
  • Вы всегда должны находить горячие точки в своей программе, прежде чем пытаться оптимизировать какой-либо код (см. Модуль profile
  • Написание сценариев тестов позволит вам быстро выполнять итерацию при поиске улучшений (см . Модуль timeit ).
  • Настоятельно рекомендуется иметь хорошее покрытие кода (с помощью модульного тестирования или любой другой техники),прежде чем потенциально внедрять регрессии,скрытые в сложных оптимизациях.
Читайте также:  Python generate random name

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

  • Ускорение работы алгоритмов (или переход на более быстрые алгоритмы)может принести гораздо больше пользы,чем попытка рассыпать по всему коду трюки микрооптимизации.
  • Используйте правильные структуры данных. Изучите документацию по встроенным типам и модулю collections
  • Когда стандартная библиотека предоставляет примитив для выполнения чего-либо, он, скорее всего (хотя и не гарантируется), будет быстрее любой альтернативы, которую вы можете придумать. Это вдвойне верно для примитивов, написанных на C, таких как встроенные функции и некоторые типы расширений. Например, обязательно используйте либо встроенный метод list.sort() ,либо связанную с ним функцию sorted(sorted() для выполнения сортировки (и см. Sorting HOW TO для примеров умеренно сложного использования).
  • Абстракции,как правило,создают косвенность и заставляют интерпретатор работать больше.Если уровни непрямолинейности перевешивают количество проделанной полезной работы,ваша программа будет работать медленнее.Вам следует избегать чрезмерной абстракции,особенно в виде крошечных функций или методов (которые также часто вредят читабельности).

Если вы достигли предела того, что может позволить чистый Python, есть инструменты, которые уведут вас еще дальше. Например, Cython может скомпилировать слегка измененную версию кода Python в расширение C и может использоваться на многих различных платформах. Cython может использовать преимущества компиляции (и необязательных аннотаций типов), чтобы сделать ваш код значительно быстрее, чем при интерпретации. Если вы уверены в своих навыках программирования на C, вы также можете самостоятельно написать модуль расширения C.

Каков наиболее эффективный способ конкатенации многих строк вместе?

str и bytes являются неизменяемыми, поэтому объединение множества строк вместе неэффективно, так как каждое объединение создает новый объект. В общем случае общая стоимость выполнения зависит от общей длины строки в квадрате.

Чтобы накопить много объектов str , рекомендуется поместить их в список и вызвать str.join() в конце:

chunks = [] for s in my_strings: chunks.append(s) result = ''.join(chunks)

(другая достаточно эффективная идиома — использовать io.StringIO )

Для накопления объектов с большим количеством bytes рекомендуется расширить объект bytearray с помощью конкатенации на месте ( оператор += ):

result = bytearray() for b in my_bytes_objects: result += b

Sequences (Tuples/Lists)

Как преобразовать кортежи в списки?

Кортеж конструктора типа tuple(seq) преобразует любую последовательность (фактически, любую итерацию) в кортеж с теми же элементами в том же порядке.

Например, tuple([1, 2, 3]) дает (1, 2, 3) а tuple(‘abc’) дает (‘a’, ‘b’, ‘c’) . Если аргумент является кортежем, он не создает копию, а возвращает тот же объект, поэтому можно дешево вызвать tuple() , когда вы не уверены, что объект уже является кортежем.

Читайте также:  Таблица html цветов бордовый

Список конструкторов типов list(seq) преобразует любую последовательность или итерацию в список с теми же элементами в том же порядке. Например, list((1, 2, 3)) возвращает [1, 2, 3] а list(‘abc’) возвращает [‘a’, ‘b’, ‘c’] . Если аргумент является списком, он создает копию так же, как и seq[:] .

Что такое отрицательный индекс?

Последовательности Python индексируются положительными и отрицательными числами. Для положительных чисел 0 — это первый индекс, 1 — второй индекс и так далее. Для отрицательных индексов -1 — последний индекс, -2 — предпоследний (предпоследний) индекс и так далее. Считайте seq[-n] тем же, что и seq[len(seq)-n] .

Использование отрицательных индексов может быть очень удобным. Например , S[:-1] — это вся строка, за исключением ее последнего символа, который полезен для удаления завершающей новой строки из строки.

Как выполнить итерацию последовательности в обратном порядке?

Используйте встроенную функцию reversed()

for x in reversed(sequence): . # do something with x . 

Это не тронет вашу исходную последовательность,но создаст новую копию с обратным порядком для итераций.

Как удалить дубликаты из списка?

См.поваренную книгу Python Cookbook,где подробно рассматривается множество способов сделать это:

Если вы не против изменить порядок списка,отсортируйте его,а затем сканируйте с конца списка,удаляя дубликаты по ходу дела:

if mylist: mylist.sort() last = mylist[-1] for i in range(len(mylist)-2, -1, -1): if last == mylist[i]: del mylist[i] else: last = mylist[i]

Если все элементы списка могут использоваться в качестве заданных ключей (т. е. все они хэшируемые ), это часто бывает быстрее .

Это преобразует список в набор,удаляя таким образом дубликаты,а затем снова в список.

Как удалить несколько элементов из списка

Как и в случае удаления дубликатов,явная итерация в обратном направлении с условием удаления является одной из возможностей.Однако проще и быстрее использовать замену срезов с неявной или явной прямой итерацией.Вот три варианта.

mylist[:] = filter(keep_function, mylist) mylist[:] = (x for x in mylist if keep_condition) mylist[:] = [x for x in mylist if keep_condition] 

Понимание списка может быть самым быстрым.

Как создать массив в Python?

По своей временной сложности списки эквивалентны массивам в C или Pascal;основное отличие заключается в том,что список Python может содержать объекты многих различных типов.

Модуль array также предоставляет методы для создания массивов фиксированных типов с компактными представлениями, но они индексируются медленнее, чем списки. Также обратите внимание, что NumPy и другие сторонние пакеты также определяют структуры, подобные массивам, с различными характеристиками.

Чтобы получить связные списки в стиле Lisp,вы можете эмулировать ячейки cons с помощью кортежей:

lisp_list = ("like", ("this", ("example", None) ) )

Если требуется изменчивость, вы можете использовать списки вместо кортежей. Здесь аналог lisp car — lisp_list[0] , а аналог cdr — lisp_list[1] . Делайте это только в том случае, если вы уверены, что вам это действительно нужно, потому что обычно это намного медленнее, чем использование списков Python.

Читайте также:  Creating a csv file in python

Как создать многомерный список?

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

При печати все выглядит правильно:

>>> A [[None, None], [None, None], [None, None]]

Но когда вы присваиваете значение,оно появляется в нескольких местах:

>>> A[0][0] = 5 >>> A [[5, None], [5, None], [5, None]] 

Причина в том, что репликация списка с * не создает копии, а создает только ссылки на существующие объекты. *3 создает список, содержащий 3 ссылки на один и тот же список длины два. Изменения в одной строке будут отображаться во всех строках, а это почти наверняка не то, что вам нужно.

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

A = [None] * 3 for i in range(3): A[i] = [None] * 2 

Это создаст список,содержащий 3 различных списка длины два.Вы также можете использовать понимание списка:

w, h = 2, 3 A = [[None] * w for i in range(h)]

Или вы можете использовать расширение, предоставляющее матричный тип данных; NumPy является наиболее известным.

Python 3.11

Канонический способ обмена информацией между модулями в рамках одной программы — это создание специального (часто называемого config cfg).

Используйте понимание списка: это из-за комбинации того факта, что расширенные операторы присваивания и различия между изменяемыми неизменяемыми объектами

Этот ответ на самом деле относится к методам, но вопрос обычно возникает в первую очередь в контексте конструкторов.

Источник

Как вызвать функцию в Python?

Как известно, функции — это блоки инструкций, предназначенные для выполнения определенных задач в программировании. Функции позволяют разбивать большие фрагменты кода на более мелкие отрезки или модули. Позже их можно вызывать отовсюду. Это позволяет повторно использовать определенные части программы и избегать повторений. Функции можно определять внутри классов, модулей, вложенных функций и так далее.

Основные особенности функций в Python:

  • Используются чтобы избегать повторений в коде,
  • Используются для разделения кода на мелкие модули
  • Позволяют скрывать код и создавать ясность для понимания модулей,
  • Позволяют повторно использовать код и сохранять память,
  • Код из функции можно выполнить только по ее имени,
  • Простой синтаксис: def имя_функции(параметры): .
  1. Для объявления функции в Python используется ключевое слово def .
  2. Название функции должно начинаться с символа латинского алфавита в любом регистре или нижнего подчеркивания.
  3. В каждой функции есть двоеточие и отступ, после которого записывается сам код программы.
  4. Зарезервированные ключевые слова не могут использоваться в качестве названия функции.
  5. Функция может содержать несколько параметров или не иметь их совсем.

Создание функции в Python

Для создания нужно написать ключевое слово def . Синтаксис следующий:

def function_name(): # логика функции return result # возврат значения

Создадим и вызовем реальную функцию в Python:

Источник

Оцените статью