Générateurs pour les plus petits

Bonjour à tous! Lorsque j'étudiais Python par moi-même, j'ai trouvé suffisamment de matériel théorique sur le langage et ses capacités. Cependant, même après avoir lu plusieurs articles sur divers sites et livres, beaucoup de choses ne rentraient pas dans ma tête (oui, je suis tellement serré). Des concepts incompréhensibles ont dû être entassés "sur la foi" sans compréhension profonde, car les exemples pratiques dans les articles étaient difficiles pour moi. Le temps a passé, je suis devenu plus expérimenté, la compréhension est venue sur des problèmes pratiques, et à un moment donné, j'ai commencé à enseigner Python à mes amis. Grâce au mentorat, j'ai découvert qu'il me semblait avoir tracé une voie dans laquelle des concepts complexes peuvent être expliqués en termes simples.





En ce qui concerne l'ensemble de la communauté informatique à l'occasion de la Journée des enfants et dans l'espoir de pouvoir aider les débutants à comprendre la beauté et les avantages des choses difficiles et incompréhensibles à première vue, j'écris mon premier article.





Aujourd'hui, je veux parler à nouveau des générateurs. Alors, au combat !





Nous comprendrons les concepts et définirons la tâche

La première chose à toujours garder à l'esprit lorsque quelqu'un vous parle de générateurs Python est de ne pas confondre « compréhensions » et « générateurs d'itérateurs ». Le premier est un sucre syntaxique puissant pour générer des collections à la volée, le second est un moyen de récupérer des valeurs à la demande. Aujourd'hui, nous allons nous concentrer sur la seconde.





, , : « !» , - .





      .
.

: (, , ..) -. - «». ( 3 10, - 10).





: , , . . , , , .





, :





  1. . .





  2. . .





. : , - - . , (-, , ) , - . , , . . , :)





:





    ,      .
, .

, , , . , . «», , , , - . .





:





-









20 .





40 .









30 .





50 .









25 .





5 .









15 .





35 .









10 .





25 .









30 .





35 .









30 .





50 .









20 .





15 .









15 .





15 .





Python. - . 0 100 000 000.





859 724 472 , 6 . , - , . , , . . : . ?





«» . , n , - . - -. , - . , .





, , , — . : next



, .





, , . , . , , , . , .





, , next: ,





: , 100 000 000 . 2 , — 10, (5) (3). «».





, next , -. - 100 000 000 120 ( — ), 0,00009 . , , , ( — ), .





:





  • - , , - . , , .





  • - , , . , . .





Python. , - , 0 n.





, (). , - . , 4, 2 . .





def skat(n): 
    """,     0  n""" 
    #     range,   range  -.
    res = []
    cnt = 0
    while cnt < n:
        res.append(cnt)
        cnt += 1
    return res

def first_eater(eda_list): 
""" """ 
    for eda in eda_list: 
        print(f"   {eda}  : ", str(eda)) 
      
      
def second_eater(eda_list): 
""" """ 
    for eda in eda_list: 
        print(f"   {eda}  : ", str(eda) * 4) 
      
      
def third_eater(eda_list): 
""" """ 
    for eda in eda_list: 
        print(f"   {eda}  : ", str(eda) * 10)
      
      
#  
eda_list = skat(100_000_000) 
#   
golod_1 = 2 
golod_2 = 3 
golod_3 = 4 
# 
first_eater(eda_list[:golod_1])
second_eater(eda_list[golod_1:golod_2 + golod_1])
third_eater(eda_list[golod_2 + golod_1:golod_2 + golod_1 + golod_3])

# ,     :
# >>>    0  :  0
# >>>    1  :  1
# >>>    2  :  2222
# >>>    3  :  3333
# >>>    4  :  4444
# >>>    5  :  5555555555
# >>>    6  :  6666666666
# >>>    7  :  7777777777
# >>>    8  :  8888888888
      
      



, : . , , . . , , . , , , pop



, ( ), .





, , — . ? . - (return



- ) ( return



None



). , Python return



, — yield



.





, :





def my_func_1():
  print("  ")
  return 1


def my_func_2():
  print("  ")
  yield 1
      
      



( , , ):





print(my_func_1)
print(my_func_2)

# ,     :
# >>> <function my_func_1 at 0x10c399950>
# >>> <function my_func_2 at 0x10c3a4290>
      
      



, my_func_1



my_func_2



, . . , :





print(my_func_1())
print(my_func_2())

# ,     
# >>>   
# >>> 1
# >>> <generator object my_func_2 at 0x108a702d0>
      
      



« ?» — .





« !» — .





, , yield



, - (generator-object



). , - — , , . ! , -, my_func_2



.





? ! Python next



( , ?), - ( -, , ) yield



, yield



. :





print(next(my_func_2()))

# ,     :
# >>> 1
      
      



! ! «... yield



...»? , , , - , yield



! - my_func_2



yield



:





def my_func_2():
    print("  ") 
    yield 1 
    print("   ") 
    yield 2 
    print("  !")

#     :
gen_o = my_func_2() #          generator-object

print(next(gen_o))
print(",       -  !") 
print(next(gen_o))

# ,     :
# >>>   
# >>> 1
# >>> ,       -  !
# >>>    
# >>> 2
      
      



, generator-object



next



yield



. , next



. «», . , , generator-object



, . ! .





next



:





gen_o = my_func_2()
print(next(gen_o))
print(",       -  !")
print(next(gen_o))
print(next(gen_o))

# ,     :
# >>> 1
# >>> ,       -  !
# >>>    
# >>> 2
# >>>   !
# >>> Traceback (most recent call last):
# >>> File "<  >", line 13, in <module>
# >>> print(next(gen_o))
# >>> StopIteration
      
      



, «» generator-object



. , yield



, . - , , StopIteration



.





: generator-object



«» . - «» . . generator-object



, my_func_2



.





   ,    "  ?"
, " ?"

. , , . , n, . , generator-object



, -, :





def skat(n):
    """,   -,    
        0  n"""
    cnt = 0
    while cnt < n:
        yield cnt
        cnt += 1


def first_eater(golod, skat):
    """ """
    while golod > 0:
        eda = next(skat)
        print(f"   {eda}    : ", eda)
        golod -= 1


def second_eater(golod, skat):
    """ """
    eda = next(skat)
    while golod > 0:
        print(f"   {eda}    : ", str(eda) * 4)
        golod -= 1


def third_eater(golod, skat):
    """ """
    eda = next(skat)
    while golod > 0:
        print(f"   {eda}    : ", str(eda) * 10)
        golod -= 1


skat_gen_obj = skat(100_000_000)
golod_1 = 2
golod_2 = 3
golod_3 = 4

try:
    first_eater(golod_1, skat_gen_obj)
    second_eater(golod_2, skat_gen_obj)
    third_eater(golod_3, skat_gen_obj)
except StopIteration:
    print("   !")

# ,     :
# >>>    0    :  0
# >>>    1    :  1
# >>>    2    :  2222
# >>>    2    :  2222
# >>>    2    :  2222
# >>>    3    :  3333333333
# >>>    3    :  3333333333
# >>>    3    :  3333333333
# >>>    3    :  3333333333
      
      



try - except



, . , , , .





     ,
,

«» ( , ). , , , . , , , (, «» :D) — generator-object



.





        ,         -
, -

- . , .





- . .





- , , .





, :





  • ,









  • , ,





    , :





  • ,





- , !





, :





  • , ( ) , , ,





: , , ..





,    -.
, -.

, ! , , — ). - , for



, .








All Articles