Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
 Аватар для Matrix3007
198 / 164 / 41
Регистрация: 13.05.2019
Сообщений: 844

Можно ли сделать переменные глобальными/нелокальными вне функции?

14.02.2021, 21:04. Показов 709. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Можно ли сделать переменные глобальными/нелокальными вне функции, в которой они должны использоваться? Например, есть такой код:
Python
1
2
3
4
5
6
7
def fibonacci(n):
    a=b=1
    def upd():
        nonlocal a,b
        a,b=b,a+b
        return a
    return (upd() for x in range(n))
Функция upd вызывается много раз. Можно ли как-то сэкономить время на интерпретации этого "nonlocal"?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.02.2021, 21:04
Ответы с готовыми решениями:

Как сделать вывод функции в другие переменные вне класса?
Мне нужен вывод функций on_pushButton_pressed и on_pushButton_pressed2 в другие переменные, допустим после функции retranslateUi я пишу d =...

Как будут инициализированы переменные в теле функции и вне тела функции?
Здравствуйте. Подскажите, пожалуйста, как будут инициализированы переменные в теле функции и вне тела функции? Какими значениями? ...

MV Studio Express 2012, компилятор си не разрешает объявлять переменные вне начала функции
компилятор си не разрешает объявлять переменные вне начала функции. по googlu 99 версия компилятора. вопрос? как это исправить в...

14
 Аватар для Wolflind
127 / 107 / 31
Регистрация: 17.03.2016
Сообщений: 445
Записей в блоге: 1
14.02.2021, 21:30
global
но не рекомендуется

Добавлено через 24 секунды
замыкание смотри
0
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
14.02.2021, 21:30
Просто приведу свой вариант, хоть он и не отвечает на ваш вопрос:
Python
1
2
3
4
5
6
7
8
9
10
In [1]: def fibonacci(n):
   ...:     a = 0
   ...:     b = 1
   ...:     for _ in range(n):
   ...:         yield a
   ...:         a, b = b, a + b
   ...:
 
In [2]: print(tuple(fibonacci(5)))
(0, 1, 1, 2, 3)
1
 Аватар для Wolflind
127 / 107 / 31
Регистрация: 17.03.2016
Сообщений: 445
Записей в блоге: 1
14.02.2021, 21:32
это про завыкание
Python
1
2
3
4
5
6
7
8
9
10
11
def mul(a):
    def helper(b):
        return a * b
    return helper
 
>>> mul5 = mul(5)
>>> mul5(2)
# 10
 
>>> mul5(7)
# 35
1
 Аватар для Matrix3007
198 / 164 / 41
Регистрация: 13.05.2019
Сообщений: 844
14.02.2021, 21:32  [ТС]
Цитата Сообщение от Arsegg Посмотреть сообщение
yield
Недавно про него узнал, уже разобрался. Но всё-таки интересно было узнать, можно ли как-то с переменными решить по-другому.
0
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
14.02.2021, 21:43
Цитата Сообщение от Matrix3007 Посмотреть сообщение
Но всё-таки интересно было узнать, можно ли как-то с переменными решить по-другому.
Использовать изменяемые переменные. Больше, увы, не подскажу, при такой постановке задачи.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
14.02.2021, 23:01
Цитата Сообщение от Matrix3007 Посмотреть сообщение
Но всё-таки интересно было узнать, можно ли как-то с переменными решить по-другому.
Вариант с yield работает в два раза быстрее (до определенного числа - дальше эффективность снижается). И никаких замыканий, nonlocal и global не нужно.
1
 Аватар для Matrix3007
198 / 164 / 41
Регистрация: 13.05.2019
Сообщений: 844
14.02.2021, 23:09  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
в два раза быстрее
У меня при n=1000000 отрабатывает в 1,02 раза быстрее)
Цитата Сообщение от Garry Galler Посмотреть сообщение
до определенного числа
А что это за число? И почему дальше снижается?
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
15.02.2021, 00:25
Цитата Сообщение от Matrix3007 Посмотреть сообщение
У меня при n=1000000 отрабатывает в 1,02 раза быстрее)
1.02 это не быстрее. Это статистически незначимая разница и погрешность измерений :-)

У меня разница на миллионе как в сторону одного варианта, так и другого. Так что это уже по сути не имеет значения.
А пока числа маленькие (до 1000-5000 итераций) - yield ощутимо быстрее.
0
 Аватар для Matrix3007
198 / 164 / 41
Регистрация: 13.05.2019
Сообщений: 844
15.02.2021, 00:59  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
1.02 это не быстрее. Это статистически незначимая разница и погрешность измерений
Я понял) Хотел этим сказать, что не быстрее оно.
Цитата Сообщение от Garry Galler Посмотреть сообщение
А пока числа маленькие (до 1000-5000 итераций) - yield ощутимо быстрее
Попробовал - действительно быстрее, раза в полтора. Только вот почему, непонятно. Неужели из-за этого нонлокал?)
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7391 / 4818 / 1246
Регистрация: 30.03.2015
Сообщений: 13,687
Записей в блоге: 29
15.02.2021, 06:11
Цитата Сообщение от Matrix3007 Посмотреть сообщение
Можно ли как-то сэкономить время на интерпретации этого "nonlocal"?
интерпретируется ровно 1 раз, ничего ты там не сэкономишь. Потеря времени начинается, когда начинается поиск во внешнем скоупе этих имен и использование вложенности.
1
 Аватар для Matrix3007
198 / 164 / 41
Регистрация: 13.05.2019
Сообщений: 844
15.02.2021, 10:20  [ТС]
Welemir1, А если параметром передавать, быстрее будет?
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7391 / 4818 / 1246
Регистрация: 30.03.2015
Сообщений: 13,687
Записей в блоге: 29
15.02.2021, 10:27
Matrix3007, смотря как и куда, напиши реализацию, потестируй время
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
15.02.2021, 11:26
Matrix3007, охота вам извращаться с глобалками. Тут однозначно передавать параметрами. И это не тот аспект, где стоит экономить.
0
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
15.02.2021, 11:39
Цитата Сообщение от Matrix3007 Посмотреть сообщение
А если параметром передавать, быстрее будет?
Быстрее итеративной версии только быстрое возведение в степень матрицы {{0}, {1}} (или как-то по-другому, не помню). Вроде как есть еще аналитическая формула (Фибоначчи), но я бы ее не рекомендовал.
/upd
Matrix Exponentiation
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.02.2021, 11:39
Помогаю со студенческими работами здесь

Что вычислит данная программа? Укажите какие переменные являются локальными, а какие глобальными.
Что вычислит данная программа? Укажите какие переменные являются локальными, а какие глобальными. Program asf; var a,b,c :integer; ...

TextBox[], Label[]. Как их сделать глобальными?
В private void Knopka_Click(object sender, EventArgs e) есть такие массивы: TextBox questions = { textBox2, textBox3, textBox4,...

Как сделать объекты TBitmap глобальными для файла?
Есть вот такая штука #include <vcl.h> #pragma hdrstop #include "Unit4.h" ...

Можно ли описать переменные (присвоить им значения) в функции?
Добрый вечер. Меня интересует, можно ли описать переменные (x1, x2, y1, y2) в функции "сuvc"?(cмотреть код) Фрагмент кода: ...

Можно ли использовать в своем скрипте переменные и функции WP?
Всем доброго времени суток. Я пытаюсь сделать свой плагин для отправки данных из форм. Столкнулся с такой проблемой: Мои данные...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru