2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3, 4, 5, 6, 7 ... 11  След.
 
 Re: Курс по Python
Сообщение11.06.2018, 17:59 
Заслуженный участник
Аватара пользователя


30/01/06
72407
realeugene
Вы сами не знаете, что там есть, но советуете. Что меня интересует - я назвал, вы отмолчались. Извините, ваше дальнейшее вмешательство излишне.

 Профиль  
                  
 
 Re: Курс по Python
Сообщение11.06.2018, 18:04 


27/08/16
10452
Munin,
мне никогда не было интересно то, что интересно сейчас вам. Вам нужно что-то конкретное - ищите сами. Экосистема Питона слишком большая, чтобы знать про все возможные пакеты. Для этого есть поиск.

И вам всего хорошего.

 Профиль  
                  
 
 Re: Курс по Python
Сообщение11.06.2018, 19:10 


10/04/12
705
Munin в сообщении #1318994 писал(а):
Используется синтаксис Python
def fib(x):
    if x>1:
        ar=fib(x-1)
        ar.append(ar[len(ar)-1]+ar[len(ar)-2])
        return ar
    else:
        ar=[]
        ar.append(1)
        ar.append(1)
        return ar

print(fib(10))

Что плохого в этом коде?


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

Основной недостаток в том, что если мы хотим просто распечатать миллион чисел Фиббоначи, то нам будет сформировать в памяти список из миллиона элементов, и только потом распечатать. Хотя выделения миллиона элементов в памяти можно избежать.

Для этого есть генераторы. Мы можем просто написать
Используется синтаксис Python
def fibb():
    a, b = 1, 1
    while True:
        yield a
        a, b = b, a+b
 

в результате fibb() будет возвращать генератор чисел Фиббоначи. Его преимущества в том, что он будет возвращать элементы по мере необходимости, а не вычислять всё сразу (ленивые вычисления). В результате мы получаем очень простой код, в котором нет ни списков, ни append, только правило получения очередного числа Фиббоначчи.

Например, распечатать первые 10 чисел можно так:
Используется синтаксис Python
it = iter(fibb())
for _ in range(10):
    print(next(it))
 


Тут мы получаем итератор на последовательность, и последовательно читаем первые 10 значений. Мы так можем прочитать хоть миллион — в памяти они не будут выделены, а будут возвращаться по требованию. Итератор он как-бы контекст функции. Каждый раз после yield мы возвращаем текущий элемент, и сохраняем все локальные переменные функции. Каждый раз, когда нам нужен следующий элемент, мы востанавливаем локальные переменные функции и выполняем следующую инструкцию после yeild

Мы можем работать со значением, которое возвращает fibb() как со списком. Например, вот ещё один способ распечатать 10 элементов:
Используется синтаксис Python
fibb_list = fibb()
for index, value in enumerate(fibb_list, 1):
    print(value)
    if index >= 10:
        break
 


Можно думать, что fibb_list это бесконечный список чисел Фиббоначи, а метод enumerate возвращает бесконечный список пар, где первое число — номер числа Фиббоначчи, второе — само число Фиббоначчи. Мы перебираем бесконечный список, и как только номер превышает десять, мы выходим из цикла печати.

Можно поиграться с enumerate, например, запустив следующий код
Используется синтаксис Python
>>> print(list(enumerate([3,4,5],0)))
[(0, 3), (1, 4), (2, 5)]
>>> print(list(enumerate([3,4,5],1)))
[(1, 3), (2, 4), (3, 5)]
>>> print(list(enumerate([3,4,5],3)))
[(3, 3), (4, 4), (5, 5)]
>>> print(list(enumerate([3,4,5])))
[(0, 3), (1, 4), (2, 5)]
>>> print(enumerate([3,4,5]))
<enumerate object at 0x7f126df63948>
 


Тут видно, что метод принимает в качестве первого элемента массив, второго — начальный индекс (по умолчанию нуль) и возвращает массив пар. Тут же видна «ленивость» вычисление, если мы не будет преобразовывать результат явно в список, то ответом будет enumerate object at 0x7f126df63948, что следует понимать примерно так, что по указанному адресу располагается объект, от которого можно получать одним за другим элементы данной последовательности.

Ну... получить первые 10 элементов генератора стандартными средствами средствами несколько извратно, но есть метод islice из itertools, который позволит это сделать
Используется синтаксис Python
import itertools
print(list(itertools.islice(fibb(), 10)))

# Или так, печатаем элементы в столбик
list(map(lambda x: print(x), itertools.islice(fibb(), 10)))

# Или 10 элементов начиная с 1000-го, при этом никакого списка из 1000 элементов в памяти не будет (!) выделено.
print(list(itertools.islice(fibb(), 1000, 1010)))
 

 Профиль  
                  
 
 Re: Курс по Python
Сообщение11.06.2018, 19:45 
Заслуженный участник


20/08/14
11867
Россия, Москва
mustitz в сообщении #1319092 писал(а):
Используется синтаксис Python
a, b = b, a+b
Вот за эту форму присвоения отдельное спасибо! О таком надо говорить в самом начале курса, сразу после (или непосредственно перед) словами о типах данных. kotenok gav, Вам на вид. :-)

 Профиль  
                  
 
 Re: Курс по Python
Сообщение11.06.2018, 19:51 
Заслуженный участник


27/04/09
28128
Тут много о чём можно говорить. Например, об отрицательном индексировании. Проще референс засесть читать вперемешку с официальным tutorial. (Корень документации — https://docs.python.org/3/index.html, плюс то же копируется локально при установке Python себе.) Да, может, идиоматического кода там не сильно достаточно чтобы сформировать чувство вкуса и границ, но как минимум можно будет писать рабочий и корректный код и пользоваться многими модулями библиотеки.

 Профиль  
                  
 
 Re: Курс по Python
Сообщение11.06.2018, 20:22 
Заслуженный участник
Аватара пользователя


30/01/06
72407
mustitz
Спасибо, это уже интересно!

А правильно ли я понимаю, что если мы захотим этим способом (через yield - iter - next) найти сначала 1000-е число Фи Боначчи, потом 999-е, потом 998-е, и т. д. - то у нас получится потеря времени (за счёт экономии памяти)?

И можно ли "в функциональном стиле" переписать вариант, который всё-таки затрачивает память, зато сохраняет (кэширует) на будущее все промежуточные вычисленные значения?

Это я к тому, что хотелось бы и треугольник Паскаля тоже "более другими средствами" нарисовать :-)

-- 11.06.2018 20:34:18 --

Dmitriy40 в сообщении #1319113 писал(а):
Вот за эту форму присвоения отдельное спасибо!

Было бы особенно хорошо, если бы она была гарантированно атомарной в параллельном контексте.

 Профиль  
                  
 
 Re: Курс по Python
Сообщение12.06.2018, 12:35 


10/04/12
705
Немного продолжу.
Вопрос:
— Чем плох вариант с возвратом списка фиксированной длины?
Ответ:
— Тем, что нам надо знать длину списка.

Например, мы хотим получить список из 10 первых простых чисел Фиббоначчи. Сколько чисел Фиббоначчи нам надо прочитать в список? Прочитать с «запасом» — ненужные накладные раскоды. Прочитать недостаточное количество — ещё хуже. В общем возникают ненужные вопросы, когда в качестве решения хочется скопипастить код генерации чисел Фиббоначчи и похачить его для нашей задачи.

Но в случае с генераторами нам не надо об этом заботиться. Общий план такой — вначале мы создаём объект для вычисления чисел Фиббоначчи (бесконечный список чисел Фиббоначчи). Потом его фильтруем и получаем объект для вычисления простых чисел Фиббоначи (тоже бесконечный список). Потом получаем из него первые десять элементов. Эти вычисления тоже ленивые. И только потом, когда мы получаем спискок, запускаются все высисления:

код: [ скачать ] [ спрятать ]
Используется синтаксис Python
#!/usr/bin/env python3

import itertools
from sympy import isprime

def fibb():
    a, b = 1, 1
    while True:
        print("Generate new fibb", a)
        yield a
        a, b = b, a+b

fibb_iterator = fibb()
prime_fibb_iterator = filter(lambda x: isprime(x), fibb_iterator)
prime_fibb_10_iterator = itertools.islice(prime_fibb_iterator, 10)
print("Print list:")
print(list(prime_fibb_10_iterator))
 


prime_fibb_10_iterator запрашивает элемент у prime_fibb_iterator,
prime_fibb_iterator запрашивает элемент у fibb_iterator (это 1), и пропускает его потому что это число непростое
prime_fibb_iterator снова запрашивает элемент у fibb_iterator (это 1), и пропускает его потому что это число непростое
prime_fibb_iterator снова запрашивает элемент у fibb_iterator (это 2), и возвращает его, потому что это простое
prime_fibb_10_iterator возвращает 2 и снова запрашивает элемент у prime_fibb_iterator,
prime_fibb_iterator запрашивает элемент у fibb_iterator (это 3), и возвращает его, потому что это простое
prime_fibb_10_iterator возвращает 3 и снова запрашивает элемент у prime_fibb_iterator,
prime_fibb_iterator запрашивает элемент у fibb_iterator (это 5), и возвращает его, потому что это простое
prime_fibb_10_iterator возвращает 3 и снова запрашивает элемент у prime_fibb_iterator,
prime_fibb_iterator запрашивает элемент у fibb_iterator (это 8), и пропускает его потому что это число непростое
prime_fibb_iterator запрашивает элемент у fibb_iterator (это 13), и возвращает его, потому что это простое
...
prime_fibb_10_iterator возвращает 433494437 и останавливается, потому что получено 10 чисел

код: [ скачать ] [ спрятать ]
  1. $ ./fibb.py  
  2. Print list: 
  3. Generate new fibb 1 
  4. Generate new fibb 1 
  5. Generate new fibb 2 
  6. Generate new fibb 3 
  7. Generate new fibb 5 
  8. Generate new fibb 8 
  9. Generate new fibb 13 
  10. Generate new fibb 21 
  11. Generate new fibb 34 
  12. Generate new fibb 55 
  13. Generate new fibb 89 
  14. Generate new fibb 144 
  15. Generate new fibb 233 
  16. Generate new fibb 377 
  17. Generate new fibb 610 
  18. Generate new fibb 987 
  19. Generate new fibb 1597 
  20. Generate new fibb 2584 
  21. Generate new fibb 4181 
  22. Generate new fibb 6765 
  23. Generate new fibb 10946 
  24. Generate new fibb 17711 
  25. Generate new fibb 28657 
  26. Generate new fibb 46368 
  27. Generate new fibb 75025 
  28. Generate new fibb 121393 
  29. Generate new fibb 196418 
  30. Generate new fibb 317811 
  31. Generate new fibb 514229 
  32. Generate new fibb 832040 
  33. Generate new fibb 1346269 
  34. Generate new fibb 2178309 
  35. Generate new fibb 3524578 
  36. Generate new fibb 5702887 
  37. Generate new fibb 9227465 
  38. Generate new fibb 14930352 
  39. Generate new fibb 24157817 
  40. Generate new fibb 39088169 
  41. Generate new fibb 63245986 
  42. Generate new fibb 102334155 
  43. Generate new fibb 165580141 
  44. Generate new fibb 267914296 
  45. Generate new fibb 433494437 
  46. [2, 3, 5, 13, 89, 233, 1597, 28657, 514229, 433494437] 

 Профиль  
                  
 
 Re: Курс по Python
Сообщение12.06.2018, 12:45 


10/03/16
4444
Aeroport
Ребят, давайте придерживаться некоей линии изложения, А? Неподалёку тусуется тема что-то вроде «введение в RAPI/GP», и несмотря на то что это GP мне ни на какое место не упало, я аж зачитался — настолько там последовательное и доходчивое изложение. Тем кому интересны группы, подподгруппы, полукольца, замыкания и размыкания, могут, во-первых, ответить на вопрос, хотели бы они записаться на курсы вождения, и чтоб на первом занятии обсуждались особенности впрыска закиси азота при дрэге, а далее создать отдельную тему на этом или каком-нибудь профильном форуме.

kotenok gav, давайте все по новой. Вас тут не слышно и не видно, что в общем логично, учитывая во что превратили тред. Не стесняйтесь впрямую раздавать люлей, жать восклицательные кнопки и т.д., тема которую вы открыли — это точно в TOP 5 лучших тем этого форума. Я понимаю что есть стопицот форумов с такими же темами, но черт подери, на нашем форуме, наконец то, да ещё и от юного дарования!

Давайте начнём не с printf (*), а с того, как работает Пайтон. Это интерпретатор, да? То есть нужна виртуальная машина, и на ноуте из коробки ваша прога на пайтоне (дисклеймер: всюду в дальнейшем я буду говорить «питон»)) ) не запустится. Самое главное: с каких сайтов и что качать, в какой последовательности устанавливать?

 Профиль  
                  
 
 Re: Курс по Python
Сообщение12.06.2018, 12:50 


10/04/12
705
Munin в сообщении #1319124 писал(а):
mustitz
И можно ли "в функциональном стиле" переписать вариант, который всё-таки затрачивает память, зато сохраняет (кэширует) на будущее все промежуточные вычисленные значения?


Попробуем решить вопрос с кешированием значений. Тут в пакете itertools есть волшебный метод tee, который делает копию (одну или несколько) из итератора. Но копию не простую, а с кешрованием. Если один из итераторов уже возвращал значение, то второй использует уже закешированное значение.

Попробуем на практике.

код: [ скачать ] [ спрятать ]
Используется синтаксис Python
#!/usr/bin/env python3

import itertools
from sympy import isprime

def fibb():
    a, b = 1, 1
    while True:
        print("Generate new fibb", a)
        yield a
        a, b = b, a+b

f1, f2 = itertools.tee(fibb())
f1 = itertools.islice(f1, 10)
f2 = filter(lambda x: isprime(x), f2)
f2 = itertools.islice(f2, 10)
print("Print 10 fibb:")
print(list(f1))
print("Print 10 prime fibb:")
print(list(f2))
 


f1, f2 = itertools.tee(fibb()) — тут мы создаём две копии генератора чисел Фиббоначчи, f1 и f2.
f1 = itertools.islice(f1, 10) — из первого генератора получаем 10 чисел (пока это только вычисление)
f2 = filter(lambda x: isprime(x), f2) — второй мы вначале фильтруем так, чтобы в нём остались только простые числе
f2 = itertools.islice(f2, 10) — и берём из него 10 простых

print(list(f1)) Теперь выводим на экран первый список. Мы видим, что в момент формирования списка при вызове list происходит запуск вычислений для получения первых десяти чисел Фиббоначчи
print(list(f2)) Теперь мы выводим на экран сторой список. Также в момент формирования списка при вызове list происходит запуск вычислений для получения первых десятипростых числе Фиббоначчи. Но... следующую сгенерированное число Фиббоначчи будет 89. Это 11-е число Фиббоначчи, потому как предыдущие 10 уже были сгенерированы, и мы не генерировали их повторно, а просто воспользовались старыми результатами.

код: [ скачать ] [ спрятать ]
Используется синтаксис Bash
$ ./fibb.py
Print 10 fibb:
Generate new fibb 1
Generate new fibb 1
Generate new fibb 2
Generate new fibb 3
Generate new fibb 5
Generate new fibb 8
Generate new fibb 13
Generate new fibb 21
Generate new fibb 34
Generate new fibb 55
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
Print 10 prime fibb:
Generate new fibb 89
Generate new fibb 144
Generate new fibb 233
Generate new fibb 377
Generate new fibb 610
Generate new fibb 987
Generate new fibb 1597
Generate new fibb 2584
Generate new fibb 4181
Generate new fibb 6765
Generate new fibb 10946
Generate new fibb 17711
Generate new fibb 28657
Generate new fibb 46368
Generate new fibb 75025
Generate new fibb 121393
Generate new fibb 196418
Generate new fibb 317811
Generate new fibb 514229
Generate new fibb 832040
Generate new fibb 1346269
Generate new fibb 2178309
Generate new fibb 3524578
Generate new fibb 5702887
Generate new fibb 9227465
Generate new fibb 14930352
Generate new fibb 24157817
Generate new fibb 39088169
Generate new fibb 63245986
Generate new fibb 102334155
Generate new fibb 165580141
Generate new fibb 267914296
Generate new fibb 433494437
[2, 3, 5, 13, 89, 233, 1597, 28657, 514229, 433494437]
 

 Профиль  
                  
 
 Re: Курс по Python
Сообщение12.06.2018, 13:07 
Заслуженный участник
Аватара пользователя


30/01/06
72407
ozheredov
На ваш вопрос как раз уже ответил выше по теме realeugene:
post1318992.html#p1318992
post1319056.html#p1319056

-- 12.06.2018 13:15:22 --

mustitz
Спасибо!

Насчёт затрат памяти для кэширования вопрос повис в воздухе. (Понятно, что это $O(N),$ но хотелось бы узнать соотношение затрат по сравнению с питоновским же массивом.)

Вопрос в сторону:

(Оффтоп)

Можно ли импортировать itertools так, чтобы не писать каждый раз префикс itertools. ?


Теперь попробую придумать архитектуру для треугольника Паскаля, основываясь на сообщённых вами приёмах.

 Профиль  
                  
 
 Re: Курс по Python
Сообщение12.06.2018, 13:26 


21/05/16
4292
Аделаида
ozheredov в сообщении #1319258 писал(а):
Самое главное: с каких сайтов и что качать, в какой последовательности устанавливать?

Лично у меня стоит установленный с его официального сайта https://www.python.org/downloads/release/python-365/ Python 3.

-- 12 июн 2018, 19:59 --

Munin в сообщении #1319264 писал(а):
Можно ли импортировать itertools так, чтобы не писать каждый раз префикс itertools. ?

Да, тремя способами:
Используется синтаксис Python
from itertools import tee
from itertools import * (импортирует все)
from itertools import tee as t


-- 12 июн 2018, 20:02 --

Есть еще одна интересная штука:
Используется синтаксис Python
from itertools import tee, islice

 Профиль  
                  
 
 Re: Курс по Python
Сообщение12.06.2018, 13:37 


10/04/12
705
ozheredov в сообщении #1319258 писал(а):
Давайте начнём не с printf (*), а с того, как работает Пайтон. Это интерпретатор, да? То есть нужна виртуальная машина, и на ноуте из коробки ваша прога на пайтоне (дисклеймер: всюду в дальнейшем я буду говорить «питон»)) ) не запустится. Самое главное: с каких сайтов и что качать, в какой последовательности устанавливать?


Хорошо, Python это скриптовый язык программирования, расчитанный прежде всего на удобство при написания кода, а не на скорость его исполнения. Поэтому его ниша это задачи, которые не требуют производительности и своеобразный клей между разными системами. Часто части, которые требуют производительности, пишут на соответствующих языках программирования а потом используют в Python как пакет. Например, есть пакет NumPy для работы с матрицами. Части, которые требуют высокой производительности в нём написаны на C. В результате получается удобный инструмент, с которым можно работать из скрипта без компиляции C программы.

Виртуальная машина? Это за пределами языка Python. Есть разные реализации, которые используют свои решения. В целом можно на заморачиваться этим вопросом.

Как ставить Python? Ну... я ничего не могу сказать про Windows, потому что считаю что это операционная система не очень хорошо подходит для программирования. Под Linux Python идёт из коробки. Но есть засада. Дело в том, что на сегодня есть две несовместимые версии Python. Одна Python версии 2.x (последняя 2.7), другая Python версии 3.x. И программы, написанные для Python 2.7 часто не работают для Python 3.6. Часто для работы нужны обе версии, потому что часть легаси кода напиана на втором Python, часть на третьем. Так что их надо различать.

Для этого предлагают такое решение как виртуальная среда. Подробнее об этом можно узнать в документе virtualenv. Под Ubuntu я решаю проблему примерно так:

Используется синтаксис Bash
sudo apt install python3-pip
python3 -m venv ~/.venv-py3/
 


И далее переключаюсь в Python3 виртуальное окрущение путём команды

Используется синтаксис Bash
$ source ~/.venv-py3/bin/activate
(.venv-py3) $
 


И дальше работаю с Python уже в ней. Для этой цели у меня даже alias в .bashrc:
Используется синтаксис Bash
alias venv-py3="source ~/.venv-py3/bin/activate"
 


А дальше, например, пробуем запустить мой пример:
Используется синтаксис Bash
$ ./test.py
Traceback (most recent call last):
  File "./test.py", line 4, in <module>
    from sympy import isprime
ImportError: No module named 'sympy'
 


Не найдем модуль simpy. Ставим его

Используется синтаксис Bash
pip install sympy
 


Запускаем снова — работает!

Тут скорее всего лучше видео на youtube :)

 Профиль  
                  
 
 Re: Курс по Python
Сообщение12.06.2018, 14:03 
Заслуженный участник


27/04/09
28128
mustitz в сообщении #1319276 писал(а):
Как ставить Python? Ну... я ничего не могу сказать про Windows, потому что считаю что это операционная система не очень хорошо подходит для программирования.
Я не знаю, чего ozheredov спрашивает, не открыв перед тем официальный сайт. :-) Оттуда легко найти установщик для виндовса. Или документацию открыть. И вообще много чего — полезно смотреть официальные сайты интересующих языков программирования.

 Профиль  
                  
 
 Re: Курс по Python
Сообщение12.06.2018, 14:06 
Аватара пользователя


11/06/12
10390
стихия.вздох.мюсли
ozheredov в сообщении #1319258 писал(а):
Ребят, давайте придерживаться некоей линии изложения, А?
Поддерживаю. Мне этот топик и так нравится, здесь уже написано много интересного, но тем не менее, на соответствие своему заголовку он не тянет. So, либо переименовывать топик в «А давайте наконец все вместе потрындим про Питон» либо как-то организовать это дело. Уважаемый kotenok gav должен над этим подумать, ему ведь тянуть гуж ;-)

Далее то, что хотел еще несколько дней назад отметить соббсна по языку.
Munin в сообщении #1318944 писал(а):
2. Какие есть простейшие встроенные типы данных.
kotenok gav в сообщении #1318961 писал(а):
Числа
Два важных замечания, касающиеся отличий от других языков:
а) тип int не ограничен сверху. Целые числа могут быть сколь угодно большими по модулю, и операции с ними будут корректны, коль скоро у вас достаточно оперативной памяти;
б) имеется встроенный тип complex. Комплексные числа могут использоваться без импортирования каких-либо модулей и могут быть использованы наравне с числами типа int в целочисленной арифметике и с числами типа float в арифметике с плавающей запятой. Их синтаксис выглядит так:
Используется синтаксис Python
z1 = 1 + 2j
z2 = 1.12 - 3.2j
Здесь нужно обратить внимание на отсутствие пробела между мнимой частью числа и буквой j, а также на то, что собственно буква j не зарезервирована в качестве ключевого слова и может быть использована для обозначения переменной.

 Профиль  
                  
 
 Re: Курс по Python
Сообщение12.06.2018, 14:09 


21/05/16
4292
Аделаида
Еще есть функции int, str и bool - переводят что угодно в число, строку или булеан (True или False).

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 163 ]  На страницу Пред.  1, 2, 3, 4, 5, 6, 7 ... 11  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group