Я написал сценарий, который довольно темпераментен с отступом, поэтому я решил сделать функции. Я новичок в python, и теперь, когда я создал эти функции, ничего не работает!
def main (): wiki_scrape() all_csv() wiki_set = scraped_set(‘locations.csv’) country_set = all_set(‘all.csv’) print wiki_set
Мне просто интересно, правильно ли это вызывать функции из функции main()? Я обсуждал, возникает ли проблема с отступом внутри вызываемых функций, python, похоже, очень полагается на правильные углубления, даже если он не вызывает ошибки!
Лучший ответ:
Похоже, вам нужно это сделать:
def main(): wiki_scrape() all_csv() wiki_set = scraped_set(‘locations.csv’) country_set = all_set(‘all.csv’) print wiki_set main() # this calls your main function
def main(): wiki_scrape() all_csv() wiki_set = scraped_set(‘locations.csv’) country_set = all_set(‘all.csv’) print wiki_set if __name__ == ‘__main__’: main() # this calls your main function
Затем запустите его из командной строки следующим образом:
Установка Python под Windows. Устраняем ошибки.
python file_name.py
Встроенная переменная __name__ является текущим контекстным пространством имен. Если вы запустите скрипт из командной строки, он будет эквивалентен ‘__main__’ . Если вы запустите/импортируете файл.py в качестве модуля из другого места, в том числе изнутри интерпретатора, пространство имен (внутри контекста модуля) будет именем файла.py или именем пакета, если оно является частью пакет. Например:
## my_file.py ## print(‘__name__ is ‘.format(__name__)) if __name__ = ‘__main__’: print(«Hello World!»)
Если вы сделаете это из командной строки:
python my_file.py
__name__ is __main__ Hello World!
Однако, если вы импортируете его из интерпретатора, вы можете видеть, что __name__ не __main__ :
>>> from my_file import * >>> __name__ is my_file
Python не вызывает никаких функций при запуске, если явно не задано (включая main ).
Вместо этого Python называет исполняемые файлы, причем основной файл запускается под именем __main__ .
Если вы хотите просто вызвать основную функцию, вы можете использовать ответ Рика.
Однако в лучшей практике Python лучше сделать следующее:
if __name__ == ‘__main__’: wiki_scrape() all_csv() wiki_set = scraped_set(‘locations.csv’) country_set = all_set(‘all.csv’) print wiki_set
Это гарантирует, что если вы используете этот файл python в качестве основного файла (файл, который вы нажимаете или запускаете из cmd), тогда эти функции будут запущены.
Если это вместо этого используется как импортированный модуль, вы все равно можете использовать функции в сценарии, импортирующие модуль, но они не будут вызываться автоматически и, следовательно, не будут мешать вызывающему скрипту.
Источник: techarks.ru
Что означает ошибка SyntaxError: invalid syntax
Ситуация: программист взял в работу математический проект — ему нужно написать код, который будет считать функции и выводить результаты. В задании написано:
Почему не работает программа на Python? Основные ошибки
«Пусть у нас есть функция f(x,y) = xy, которая перемножает два аргумента и возвращает полученное значение».
Программист садится и пишет код:
a = 10 b = 15 result = 0 def fun(x,y): return x y result = fun(a,b) print(result)
Но при выполнении такого кода компьютер выдаёт ошибку:
File «main.py», line 13
result = x y
^
❌ SyntaxError: invalid syntax
Почему так происходит: в каждом языке программирования есть свой синтаксис — правила написания и оформления команд. В Python тоже есть свой синтаксис, по которому для умножения нельзя просто поставить рядом две переменных, как в математике. Интерпретатор находит первую переменную и думает, что ему сейчас объяснят, что с ней делать.
Но вместо этого он сразу находит вторую переменную. Интерпретатор не знает, как именно нужно их обработать, потому что у него нет правила «Если две переменные стоят рядом, их нужно перемножить». Поэтому интерпретатор останавливается и говорит, что у него лапки.
Что делать с ошибкой SyntaxError: invalid syntax
В нашем случае достаточно поставить звёздочку (знак умножения в Python) между переменными — это оператор умножения, который Python знает:
a = 10 b = 15 result = 0 def fun(x,y): return x * y result = fun(a,b) print(result)
В общем случае найти источник ошибки SyntaxError: invalid syntax можно так:
- Проверьте, не идут ли у вас две команды на одной строке друг за другом.
- Найдите в справочнике описание команды, которую вы хотите выполнить. Возможно, где-то опечатка.
- Проверьте, не пропущена ли команда на месте ошибки.
Практика
Попробуйте найти ошибки в этих фрагментах кода:
x = 10 y = 15 def fun(x,y): return x * y
try: a = 100 b = «PythonRu» assert a = b except AssertionError: print(«Исключение AssertionError.») else: print(«Успех, нет ошибок!»)
Источник: thecode.media
Почему ваша функция не работает? Укажите область видимости в Python
Представим ситуацию. Вы написали функцию, инициализировали переменные где-то и собираетесь сделать тест вашего кода.
У вас все получилось, код запускается без ошибок, хотя, вот незадача, функция делает не то, что надо, а точнее — возвращает не желаемое вами значение. Ко всему этому, вы еще и не знаете, как это происходит. Переменные на месте, структура функции в порядке, в чем причина?
Возможно, вы неграмотно воспользовались областью видимости. Давайте рассмотрим пример:
#набор четных чисел list_sqrt = [2,4,6,8,10] #функция для преобразования числа в квадрат def Sum(): #однострочник, который возвращает число в квадрате list_sqrt = [i*i for i in list_sqrt] print(list_sqrt) if __name__ == ‘__main__’: Sum() list_sqrt = [i*i for i in list_sqrt] UnboundLocalError: local variable ‘list_sqrt’ referenced before assignment
Кратко о коде: есть список с числами, с помощью функции нужно, чтобы числа в этом же списке, были возведены в квадрат. Попробуем понять, что ощущает функция во время компилирования: «Хозяин, в строке 6 где происходит списковое включение, в цикле, временная переменная не понимает, по кому она проходит».
Программист-разработчик Python АО «Гринатом» , , можно удалённо , По итогам собеседования
Можем сделать вывод, что временная переменная — i, совершает итерации, а точнее не совершает их вообще, по неопределенной последовательности. А с другого места в коде мы видим, что у нас есть нужная последовательность (строка 2). Тогда почему же функцая не делает то, что надо, а точнее вообще не делает? Все дело в области видимости.
В коде была определена глобальная последовательность и функция, которая использует локальную последовательность, т.е. та, которая должна использоваться и распостраняться в границах функции.
Кратко. В коде происходит попытка использования локальной последовательности в функции — как локальной. В чем и ошибка.
Как сделать ее локальной? Ведь без этого ей невозможно воспользоваться в функции? Одним словом — global.
Взглянем на следующий код:
#набор четных чисел list_sqrt = [2,4,6,8,10] #функция для преобразования числа в квадрат def Sum(): #определение последовательности как глобальной для функции global list_sqrt #однострочник, который возвращает число в квадрате list_sqrt = [i*i for i in list_sqrt] print(list_sqrt) if __name__ == ‘__main__’: Sum()
В строке 6 появился один новый элемент, а последовательность все та же. Теперь-то в коде список представляется как глобальный и входит за границы функции, и вывод таков:
[4, 16, 36, 64, 100]
У вас может появиться следующий вопрос: но если последовательность и до этого была в коде глобальной, а после добавления global осталась по-прежнему глобальной, хотя в функции нужен был локальный список, что это за абракадабра?
Все просто. Список и вправду был и есть глобальный. Но все мы знаем, что функция — это отдельный блок кода, как база для избранных. А поскольку глобальность списка распостраняется на ровно такие же части (пустые) кода и не вторгаются в функции и классы, или же попросту отделенные блоки, это и не работает.
А если в блоке (в нашем случае — функции), обозначить последовательность как глобальную не только для пространства в коде, но еще и в желаемом блоке, то границы функции разваливаются, и распахивается дверь для избранного global’ом. И последовательность становится доступной внутри данного блока.
Итоги
Не забывайте о области видимости, зачастую именно из-за нее функции возвращают не то, что хотелось бы.
Здесь я не углублялся в данную тему и попросту рассказал всё своими словами. Вдобавок я оставляю ссылку на небольшую документацию по этой теме.
Простреленное колено, чит-коды и нецензурное оружие: угадайте игру по факту о ней
На этом — все. Если у вас есть своя тема, которую вы не понимаете, но хотите разобрать, пишите в комментариях, обсудим. Всем удачи и Джедай!
Источник: tproger.ru