eFusion 06 сСнтября 2020

πŸ” Как ΠΏΠΈΡΠ°Ρ‚ΡŒ Β«ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅Β» Ρ†ΠΈΠΊΠ»Ρ‹ Π½Π° Python: разбираСмся Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…

НСсколько сообраТСний ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ Ρ†ΠΈΠΊΠ»ΠΎΠ² Python Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΈ ясным с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ встроСнного модуля itertools: product, isslice, takewhile.
πŸ” Как ΠΏΠΈΡΠ°Ρ‚ΡŒ Β«ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅Β» Ρ†ΠΈΠΊΠ»Ρ‹ Π½Π° Python: разбираСмся Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…

Бинтаксис ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° Ρ†ΠΈΠΊΠ»Π° Π² Python ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΈ прост, ΠΈ Π½Π΅ Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π΅Π½. По ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с C-ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌΠΈ языками Ρ†ΠΈΠΊΠ»Ρ‹ Π² Python Π»ΠΈΡˆΠ΅Π½Ρ‹ ΠΎΠ±Ρ‰Π΅ΠΉ трСхступСнчатой структуры for (init, condition, increment). Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв достаточно for <item> in <iterable>. Π¦ΠΈΠΊΠ» while <condition> ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ€Π΅ΠΆΠ΅.

Π₯отя синтаксис Ρ†ΠΈΠΊΠ»Π° Π½Π΅ Ρ‚Π°ΠΊ ΡƒΠΆ слоТСн, Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ Ρ†ΠΈΠΊΠ» Π½Π΅ всСгда просто Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ. Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ рассмотрим нСсколько ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠ², ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΡ… ΠΏΠΈΡΠ°Ρ‚ΡŒ чистый ΠΊΠΎΠ΄ Π΄Π°ΠΆΠ΅ для самых слоТных Ρ†ΠΈΠΊΠ»ΠΎΠ² Π½Π° Python.

НСуТСли Ρ†ΠΈΠΊΠ» ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Β«Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌΒ»?

Π£ всякого языка программирования Π΅ΡΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΈΠ»ΠΈ ΠΌΠ΅Π½Π΅Π΅ ΡƒΠ΄Π°Ρ‡Π½Ρ‹Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΎΠ΄Π½ΠΈΡ… ΠΈ Ρ‚Π΅Ρ… ΠΆΠ΅ Π·Π°Π΄Π°Ρ‡. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΠΌ, Π²Ρ‹ спросили ΠΊΠΎΠ³ΠΎ-Ρ‚ΠΎ, ΠΊΡ‚ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ·ΡƒΡ‡Π°Π΅Ρ‚ Python: «Как ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ индСкс ΠΏΡ€ΠΈ ΠΎΠ±Ρ…ΠΎΠ΄Π΅ списка?Β». ΠžΡ‚Π²Π΅Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ:

        index = 0

for name in names: 
    print(index, name)
    index += 1
    

Π₯отя ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» Π²Π΅Ρ€Π΅Π½, это Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π΅ Π² стилС Python. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ с Ρ‚Ρ€Π΅Ρ…Π»Π΅Ρ‚Π½ΠΈΠΌ ΠΎΠΏΡ‹Ρ‚ΠΎΠΌ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΡ‚ Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄:

        for i, name in enumerate(names):
     print(i, name)
    

enumerate() – это встроСнная функция Python, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΈΡ‚Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, Π° Π·Π°Ρ‚Π΅ΠΌ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ – Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ Π²ΠΈΠ΄Π° (Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ индСкс, Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ элСмСнт). Π­Ρ‚ΠΎ Π»ΡƒΡ‡ΡˆΠΈΠΉ способ для Π΄Π°Π½Π½ΠΎΠ³ΠΎ случая: ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎ понятный ΠΊΠΎΠ΄, ΠΊ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ ΠΎΠ½ ΠΈ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΈΠ²Π½Π΅Π΅.

КопнСм ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΠ³Π»ΡƒΠ±ΠΆΠ΅. Π¦ΠΈΠΊΠ» for состоит ΠΈΠ· структуры for <item> in <iterable>. ЛСвая ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π° присваиваСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ item. Π’ ΠΏΡ€Π°Π²ΠΎΠΉ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π΅ находится ΠΈΡ‚Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π² качСствС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΡ‹ использовали Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ enumerate(). Π­Ρ‚ΠΎ ΠΏΠΎΠ΄Π²ΠΎΠ΄ΠΈΡ‚ нас ΠΊ ΠΏΠ΅Ρ€Π²ΠΎΠΉ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ.

РСкомСндация 1: ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠ΅ ΠΈΡ‚Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚

ИспользованиС Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Π° для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΡ‚Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ Π²Π»ΠΈΡΡ‚ΡŒ Π½Π° ΠΊΠΎΠ΄ Ρ†ΠΈΠΊΠ»Π°. ΠŸΡ€Π΅ΠΊΡ€Π°ΡΠ½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ – встроСнный ΠΌΠΎΠ΄ΡƒΠ»ΡŒ itertools. Π­Ρ‚ΠΎ Π½Π°Π±ΠΎΡ€ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, содСрТащий мноТСство ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΈΡ‚Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². О самом ΠΌΠΎΠ΄ΡƒΠ»Π΅ ΠΌΡ‹ писали Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ Β«Π˜Ρ‚Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΒ». Π’ этом ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π΅ ΠΌΡ‹ рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ использования Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ модуля Π² практичСских Π·Π°Π΄Π°Ρ‡Π°Ρ….

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ product() для компактности

ВсС ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ «плоский» ΠΊΠΎΠ΄ Π»ΡƒΡ‡ΡˆΠ΅ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ. Но ΠΈΠ½ΠΎΠ³Π΄Π° приходится ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Π΅ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Ρ†ΠΈΠΊΠ»Ρ‹:

        def find_twelve(num_list1, num_list2, num_list3):
    """Находит всС ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ чисСл ΠΈΠ· Ρ‚Ρ€Π΅Ρ… списков,
    Π² суммС Π΄Π°ΡŽΡ‰ΠΈΠ΅ 12"""

    for num1 in num_list1:
        for num2 in num_list2:
            for num3 in num_list3:
                if num1 + num2 + num3 == 12:
                    return num1, num2, num3
    

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ Ρ†ΠΈΠΊΠ»Ρ‹, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠ΅ ΠΎΠ±Ρ…ΠΎΠ΄ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ product(). Ѐункция ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ нСсколько ΠΈΡ‚Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ создаСт ΠΈΡ… Π΄Π΅ΠΊΠ°Ρ€Ρ‚ΠΎΠ²ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅.

        from itertools import product

def find_twelve2(num_list1, num_list2, num_list3):
    for n1, n2, n3 in product(lst1, lst2, lst3):
        if n1 + n2 + n3 == 12:
            return n1, n2, n3
    

По ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ, Ρ†ΠΈΠΊΠ», ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ product(), нуТдаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΠ΄Π½ΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅ влоТСнности. Код становится Π±ΠΎΠ»Π΅Π΅ Π»Π°ΠΊΠΎΠ½ΠΈΡ‡Π½Ρ‹ΠΌ.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ islice(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π°ΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Ρ†ΠΈΠΊΠ»Π°

Рассмотрим Ρ„Π°ΠΉΠ» с Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°ΠΌΠΈ постов Reddit ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Π²ΠΈΠ΄Π°:

        py-guide: Python guidebook, written for humans.
---
Python 3 Death Clock
---
Run any Python Script with an Alexa Voice Command
---
<...>
    

ΠœΠ΅ΠΆΠ΄Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠ°Ρ€ΠΎΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ², присутствуСт Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ ---, Π° Π½Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ. ΠžΡΠ½ΠΎΠ²Ρ‹Π²Π°ΡΡΡŒ Π½Π° Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΡƒΠΆΠ΅ Π·Π½Π°Π΅ΠΌ ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ enumerate(), ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΠΈ ΠΏΠΎ Π½Π΅Ρ‡Π΅Ρ‚Π½Ρ‹ΠΌ Π½ΠΎΠΌΠ΅Ρ€Π°ΠΌ:

        def parse_titles(filename):
   """Π§ΠΈΡ‚Π°Π΅ΠΌ имя ΡΡ‚Π°Ρ‚ΡŒΠΈ reddit ΠΈΠ· Ρ„Π°ΠΉΠ»Π°"""

   with open(filename,'r') as fp:
      for i, line in enumerate(fp):
          # ΠžΠΏΡƒΡΠΊΠ°Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ
          if i% 2 == 0;
             yield line.strip()
    

Однако использованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ islice() ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ itertools позволяСт ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ сам ΠΈΡ‚Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄. Ѐункция islice (seq, start, end, step) ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠΎΡ‡Ρ‚ΠΈ Ρ‚Π΅ ΠΆΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, Ρ‡Ρ‚ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ срСза (list[start:stop:step]). Установим Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° step Π² 2 (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ 1).

        from itertools import islice

def parse_ttiles_v2(filename):
    with open(filename, 'r') as fp:
        # УстанавливаСм step=2
        # упускаСм Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ '---'
        for line in islice(fp, 0, None, 2):
            yield line.strip()
    

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ takewhile вмСсто break

Иногда Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Π½Π°Π΄ΠΎ Π»ΠΈ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΡ‚ΡŒ Ρ†ΠΈΠΊΠ» Π² самом Π΅Π³ΠΎ Π½Π°Ρ‡Π°Π»Π΅. НапримСр:

        for user in users:
    # ΠŸΡ€ΠΈ появлСнии ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π½Π΅ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
    # дальнСйшая ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π΅ производится
    if not is_qualified(user):
        break
    # ВыполняСм ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ... 
    

Для Ρ€Π°Π½Π½Π΅Π³ΠΎ прСрывания Ρ†ΠΈΠΊΠ»ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ takewhile(). Ѐункция takewhile (predicate, iterable) ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎ всСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ ΠΈΠ· iterable ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Π°, ΠΏΠ΅Ρ€Π΅Π΄Π°Π² Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, ΠΈ провСряСт Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

Если функция ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ True, гСнСрируСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈ Ρ†ΠΈΠΊΠ» продолТаСтся, Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ случаС Ρ†ΠΈΠΊΠ» прСрываСтся.

        from itertools import takewhile

for user in takewhile(is_qualified, users):
   # ВыполняСм ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ...
    

Π’ itertools Π΅ΡΡ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ интСрСсныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ вмСстС с Ρ†ΠΈΠΊΠ»Π°ΠΌΠΈ:

  • функция chain() позволяСт ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ плоскими Π΄Π²ΡƒΡ…ΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Π΅ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Ρ†ΠΈΠΊΠ»Ρ‹;
  • функция zip_longest() ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ†ΠΈΠΊΠ» сразу ΠΏΠΎ нСскольким ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ.

Если вас ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ Π·Π° подробностями ΠΊ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΈΠ»ΠΈ ΠΊ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π²ΡˆΠ΅ΠΉΡΡ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ для написания своСго Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Π°

ΠšΡ€ΠΎΠΌΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ itertools, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π² сочСтании с Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ. Π’ΠΎΠ·ΡŒΠΌΠ΅ΠΌ простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€.

        def sum_even_only(numbers):
   """Π‘ΡƒΠΌΠΌΠΈΡ€ΡƒΠ΅Ρ‚ всС Ρ‡Π΅Ρ‚Π½Ρ‹Π΅ числа"""

   result = 0
   for num in numbers:
       if num % 2 == 0:
           result += num
   return result
    

Для Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ всСх Π½Π΅Ρ‡Π΅Ρ‚Π½Ρ‹Ρ… чисСл Π² Ρ‚Π΅Π»Π΅ Ρ†ΠΈΠΊΠ»Π° здСсь ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ if. Но Ссли конструкция встрСчаСтся часто ΠΈ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ Ρ‚Π΅Π»ΠΎ Ρ†ΠΈΠΊΠ»Π°, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ для Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ Ρ‡Π΅Ρ‚Π½Ρ‹Ρ… чисСл:

        def even_only(numbers):
   for num in numbers:
      if num% 2 == 0:
         yield num

def sum_even_only_v2(numbers):
   """Π‘ΡƒΠΌΠΌΠΈΡ€ΡƒΠ΅Ρ‚ всС Ρ‡Π΅Ρ‚Π½Ρ‹Π΅ числа"""

   result = 0
   for num in even_only(numbers):
       result += num
   return result
    

ПослС дСкорирования ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ numbers Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ even_only, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sum_even_only_v2 Π½Π΅ приходится Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Π΅Ρ‚Π½Ρ‹Π΅ Π½ΠΎΠΌΠ΅Ρ€Π° – остаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΎΡΡƒΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅
ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Π°Ρ простая функция Π½Π° самом Π΄Π΅Π»Π΅ искусствСнна. Π’ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ ΠΌΠΈΡ€Π΅ Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΈΠ»ΠΈ списка: sum(num for num in numbers if num% 2 == 0).

РСкомСндация 2: Ρ€Π°Π·Π±Π΅Ρ€ΠΈΡ‚Π΅ слоТныС Π±Π»ΠΎΠΊΠΈ ΠΊΠΎΠ΄Π° Π½Π° ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅

Когда ΠΌΡ‹ пишСм Π½ΠΎΠ²Ρ‹ΠΉ Π±Π»ΠΎΠΊ с Ρ†ΠΈΠΊΠ»ΠΎΠΌ, Π½Π°ΠΌ хочСтся Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ побольшС ΠΊΠΎΠ΄Π°, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡŽ нСдопустимых элСмСнтов, ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ Π»ΠΎΠ³ΠΎΠ² ΠΈ Ρ‚. Π΄. Π”Π°ΠΆΠ΅ нСбольшиС куски ΠΊΠΎΠ΄Π°, Π½Π΅ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΠ΅ ΠΊ Ρ‚ΠΎΠΉ ΠΆΠ΅ абстракции, ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΌΠ΅ΡˆΠ°Π½Ρ‹ Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ магичСском ΠΊΠΎΡ‚Π΅Π»ΠΊΠ΅.

Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° рассмотрим бизнСс-сцСнарий Π½Π° Π½Π΅ΠΊΠΎΠ΅ΠΌ Π²Π΅Π±-сайтС, выполняСмый ΠΊΠ°ΠΆΠ΄Ρ‹Π΅ 30 Π΄Π½Π΅ΠΉ. Π—Π°Π΄Π°Ρ‡Π° скрипта – Π½Π°ΠΉΡ‚ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, Π²Ρ…ΠΎΠ΄ΠΈΠ²ΡˆΠΈΡ… Π² систСму ΠΊΠ°ΠΆΠ΄Ρ‹Π΅ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ мСсяца, ΠΈ Π²Ρ‹ΡΠ»Π°Ρ‚ΡŒ ΠΈΠΌ Π·Π° это Π½Π°Π³Ρ€Π°Π΄Π½Ρ‹Π΅ Π±Π°Π»Π»Ρ‹.

        import time
import datetime
 
def award_active_users_in_last_30days():
    """ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ всСх ΡŽΠ·Π΅Ρ€ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ вошли Π² систСму с 8 Π²Π΅Ρ‡Π΅Ρ€Π° Π΄ΠΎ 10 Π²Π΅Ρ‡Π΅Ρ€Π° 
    Π² Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π½ΠΈ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ послСдних 30 Π΄Π½Π΅ΠΉ ΠΈ отправляСм ΠΈΠΌ бонусныС Π±Π°Π»Π»Ρ‹
    """

    days = 30
    for days_delta in range(days):
        dt = datetime.date.today()-datetime.timedelta(days=days_delta)
        # 5: Saturday, 6: Sunday
        if dt.weekday() not in (5, 6):
            continue
 
        time_start = datetime.datetime(dt.year, dt.month, dt.day, 20, 0)
        time_end = datetime.datetime(dt.year, dt.month, dt.day, 23, 0)
 
        # ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π² unix timestamp, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡƒΡŽ для ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… запросов ORM
        ts_start = time.mktime(time_start.timetuple())
        ts_end = time.mktime(time_end.timetuple())
 
        # ΠžΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌ ΡŽΠ·Π΅Ρ€ΠΎΠ² ΠΈ отправляСм 1000 бонусных Π±Π°Π»Π»ΠΎΠ²
        for record in LoginRecord.filter_by_range(ts_start, ts_end):
            # Π—Π΄Π΅ΡΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΡΠ»ΠΎΠΆΠ½ΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ
            send_awarding_points(record.user_id, 1000)
    

Π’Ρ‹ΡˆΠ΅ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚Π°Ρ функция состоит ΠΈΠ· Π΄Π²ΡƒΡ… ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ. ΠžΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ внСшнСго Ρ†ΠΈΠΊΠ»Π° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² отслСТивании Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ посСщСния Π·Π° послСдниС 30 Π΄Π½Π΅ΠΉ, ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΈ Π΅Π³ΠΎ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ UNIX timestamp. Π­Ρ‚ΠΈ Π΄Π²Π΅ ΠΌΠ΅Ρ‚ΠΊΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΌ Ρ†ΠΈΠΊΠ»ΠΎΠΌ для дальнСйшСй ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ.

РассмотрСв эти Π²Π΅Ρ‰ΠΈ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΈΠΉΡ‚ΠΈ ΠΊ Π²Ρ‹Π²ΠΎΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ всС Ρ‚Π΅Π»ΠΎ Ρ†ΠΈΠΊΠ»Π° посвящСно Π΄Π²ΡƒΠΌ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½Π΅ зависящим Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π° Π·Π°Π΄Π°Ρ‡Π°ΠΌ: Π²Ρ‹Π±ΠΎΡ€ Π΄Π°Ρ‚Ρ‹ ΠΈ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° ΠΌΠ΅Ρ‚ΠΊΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ рассылки Π½Π°Π³Ρ€Π°Π΄Π½Ρ‹Ρ… Π±Π°Π»Π»ΠΎΠ².

Как ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒΡΡ со слоТными Ρ†ΠΈΠΊΠ»Π°ΠΌΠΈ

ΠšΠ°ΠΊΠΎΠ²Ρ‹ нСдостатки Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°? Π’ ΠΎΠ΄ΠΈΠ½ прСкрасный дСнь Π²Ρ‹ΡΡΠ½ΠΈΠ»ΠΎΡΡŒ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ Π½Π΅ спят послС ΠΏΠΎΠ»ΡƒΠ½ΠΎΡ‡ΠΈ ΠΏΠΎ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹ΠΌ ΠΈ сидят Π½Π° сайтС. Появилось Π½ΠΎΠ²ΠΎΠ΅ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅: Β«ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΡŽΠ·Π΅Ρ€Π°ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ вошли Π² систСму ΠΌΠ΅ΠΆΠ΄Ρƒ 3:00 ΠΈ 5:00 Π² Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π½ΠΈ Π·Π° послСдниС 30 Π΄Π½Π΅ΠΉΒ».

Π›Π΅Π³ΠΊΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ новая ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π° ΠΎΠΏΠΈΡΠ°Π½Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠΎΠ΄ΠΎΠΌ. Но, Ссли ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° Ρ‚Π΅Π»ΠΎ Ρ†ΠΈΠΊΠ»Π°, станСт ясно, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использован ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ. Π’Π½ΡƒΡ‚Ρ€ΠΈ Ρ†ΠΈΠΊΠ»Π° слишком тСсно связаны Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ Ρ€Π°Π·Π½Ρ‹Π΅ Π»ΠΎΠ³ΠΈΠΊΠΈ: Β«Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ врСмя» ΠΈ Β«Ρ€Π°Π·ΠΎΡΠ»Π°Ρ‚ΡŒ Π½Π°Π³Ρ€Π°Π΄Π½Ρ‹Π΅ Π±Π°Π»Π»Ρ‹Β».

Π§Ρ‚ΠΎΠ±Ρ‹ эффСктивно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ, Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰Π΅ΠΉ Π·Π° Β«Π²Ρ‹Π±ΠΎΡ€ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈΒ», ΠΎΡ‚ Ρ‚Π΅Π»Π° Ρ†ΠΈΠΊΠ»Π°. И Π² этом Π½Π°ΠΌ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ наш старый Π΄Ρ€ΡƒΠ³, функция-Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€.

Π Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚Π΅Π»Π° Ρ†ΠΈΠΊΠ»Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚Π²ΡΠ·Π°Ρ‚ΡŒ Π²Ρ‹Π±ΠΎΡ€ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΎΡ‚ Ρ†ΠΈΠΊΠ»Π°, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ gen_weekend_ts_ranges(), которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΌΠ΅Ρ‚ΠΎΠΊ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ UNIX:

        def gen_weekend_ts_ranges(days_ago, hour_start, hour_end):
    """Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ суббота-Π²ΠΎΡΠΊΡ€Π΅ΡΠ΅Π½ΡŒΠ΅
    ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Π΅Π³ΠΎ Π² Π²ΠΈΠ΄Π΅ UNIX timestamp.
    """
    
    for days_delta in range(days_ago):
        dt = datetime.date.today()-datetime.timedelta(days=days_delta)
        # 5: Saturday, 6: Sunday
        if dt.weekday() not in (5, 6):
            continue
 
        time_start = datetime.datetime(dt.year, dt.month, dt.day, hour_start, 0)
        time_end = datetime.datetime(dt.year, dt.month, dt.day, hour_end, 0)
 
        # ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π² unix timestamp, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ для ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… запросов ORM
        ts_start = time.mktime(time_start.timetuple())
        ts_end = time.mktime(time_end.timetuple())
        yield ts_start, ts_end
    

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½ΠΎΠ²ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΡΡ‚Π°Ρ€ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ Β«Ρ€Π°Π·ΠΎΡΠ»Π°Ρ‚ΡŒ Π½Π°Π³Ρ€Π°Π΄Π½Ρ‹Π΅ Π±Π°Π»Π»Ρ‹Β» ΠΈ Π½ΠΎΠ²ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ Β«Ρ€Π°Π·ΠΎΡΠ»Π°Ρ‚ΡŒ увСдомлСния» ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹ΠΌ использованиСм ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ†ΠΈΠΊΠ»Π°:

        def award_active_users_in_last_30days_v2(): 
    """ΠžΡ‚ΠΏΡ€Π°Π²Π»ΡΠ΅Ρ‚ бонусныС Π±Π°Π»Π»Ρ‹"""

    for ts_start, ts_end in gen_weekend_ts_ranges(30, hour_start=20, hour_end=23):
        for record in LoginRecord.filter_by_range(ts_start, ts_end):
            send_awarding_points(record.user_id, 1000)
    

Подводя ΠΈΡ‚ΠΎΠ³ΠΈ

Π’ Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ сначала ΠΊΡ€Π°Ρ‚ΠΊΠΎ ΠΏΡ€ΠΎΠ±Π΅ΠΆΠ°Π»ΠΈΡΡŒ ΠΏΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ Β«ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎΒ» ΠΊΠΎΠ΄Π° Ρ†ΠΈΠΊΠ»ΠΎΠ². Π—Π°Ρ‚Π΅ΠΌ Π²ΠΎΠ·Π½ΠΈΠΊΠ»ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠ΅ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅: ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρ‹ для ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Π’ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ бизнСс-сцСнария описали Π²Π°ΠΆΠ½ΠΎΡΡ‚ΡŒ «дроблСния» ΠΊΠΎΠ΄Π° Π² Ρ†ΠΈΠΊΠ»Π΅ Π² зависимости ΠΎΡ‚ исполняСмых этим ΠΊΠΎΠ΄ΠΎΠΌ Π·Π°Π΄Π°Ρ‡.

ΠšΡ€Π°Ρ‚ΠΊΠΎ ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°Ρ…:

  • использованиС Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ΠΎΠ² для измСнСния ΠΈΡ‚Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ Ρ†ΠΈΠΊΠ»ΠΎΠ²;
  • мноТСство ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, способных ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ Ρ†ΠΈΠΊΠ» содСрТит ΠΌΠΎΠ΄ΡƒΠ»ΡŒ itertools;
  • ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ для простого опрСдСлСния собствСнного Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Π°;
  • Π½Π΅ Π·Π°Π±Ρ‹Π²Π°ΠΉΡ‚Π΅ Ρ€Π°Π·Π΄Π΅Π»ΡΡ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΡƒ бизнСс-Π·Π°Π΄Π°Ρ‡ ΠΏΡ€ΠΈ разрастании Ρ†ΠΈΠΊΠ»ΠΎΠ²;
  • ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ для раздСлСния Π±Π»ΠΎΠΊΠΎΠ² ΠΊΠΎΠ΄Π° Π² Ρ†ΠΈΠΊΠ»Π΅, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΡ… Ρ€Π°Π·Π½Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ²Ρ‹ΡΠΈΡ‚ΡŒ Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ.

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° программиста надССтся, Ρ‡Ρ‚ΠΎ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ эти ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹ Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΆΠ΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌΠΈ, ΠΊΠ°ΠΊ ΠΈ ΠΌΡ‹. Π£Π΄Π°Ρ‡ΠΈ Π² ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠΈ!

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊΠΈ

ΠœΠ•Π ΠžΠŸΠ Π˜Π―Π’Π˜Π―

ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

Π’ΠΠšΠΠΠ‘Π˜Π˜

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ вакансию

Π›Π£Π§Π¨Π˜Π• БВАВЬИ ПО Π’Π•ΠœΠ•