Π Π°Π·Π½ΠΎΠ΅

Π‘Π°ΠΉΡ‚ ΠΊΠΎΠ΄ python: Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ Python ΠΈ ΠΊΠ°ΠΊ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

ΠœΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΠΊΠ°Ρ†ΠΈΡ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Python / Π₯Π°Π±Ρ€

НСкотороС врСмя Π½Π°Π·Π°Π΄ ΠΌΠ½Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ достаточно Π½Π΅ΠΎΠ±Ρ‹Ρ‡Π½ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ, Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ нСстандартный ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Π² языкС python. Π­Ρ‚Π° Π·Π°Π΄Π°Ρ‡Π° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π»Π°ΡΡŒ Π² Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ питоновского ΠΊΠΎΠ΄Π° ΠΏΠΎ псСвдокоду, ΠΏΠΎΡ…ΠΎΠΆΠ΅ΠΌΡƒ Π½Π° ассСмблСр, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит Π² сСбС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ goto. Π‘Π»ΠΎΠΆΠ½Ρ‹ΠΉ лСксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΌΠ½Π΅ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½Π΅ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ goto Π² псСвдокодС использовался для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ†ΠΈΠΊΠ»ΠΎΠ² ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠ² ΠΏΠΎ условиям, ΠΈ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ ΠΈΠΌΠ΅Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΅Π³ΠΎ Π°Π½Π°Π»ΠΎΠ³ Π² ΠΏΠΈΡ‚ΠΎΠ½Π΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½Π΅Ρ‚.

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

Π˜Ρ‚Π°ΠΊ, Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, ΠΊΠ°ΠΊ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² ΠΏΠΈΡ‚ΠΎΠ½ ΠΏΠ°Ρ€Ρƒ Π½ΠΎΠ²Ρ‹Ρ… ΠΊΠΎΠΌΠ°Π½Π΄ ΠΈ ΠΊΠ°ΠΊ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΈΡ… Π²Π΅Ρ€Π½ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ (ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠΎ Π½ΡƒΠΆΠ½Ρ‹ΠΌ адрСсам). Для этого напишСм Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ΄Ρ†Π΅ΠΏΠ»ΡΡ‚ΡŒΡΡ ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ goto ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΊΠΈ (label), ΠΈ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ модулями dis, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ΠΎΠΌ ΠΏΠΈΡ‚ΠΎΠ½Π°, ΠΈ new, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΠΈΡ‚ΠΎΠ½Π° динамичСски.

Для Π½Π°Ρ‡Π°Π»Π°, опрСдСлимся с Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠΌ ΠΊΠΎΠΌΠ°Π½Π΄. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΠΈΡ‚ΠΎΠ½ ΠΈΠΌΠ΅Π΅Ρ‚ ряд ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ ΠΏΠΎ синтаксису, Ρ‚ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π²ΠΈΠ΄Π°

a:
goto a

ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π½Π΅ удастся. Однако, ΠΏΠΈΡ‚ΠΎΠ½ позволяСт Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ конструкции Π²ΠΈΠ΄Π°

label .a
goto .a

Π—Π΄Π΅ΡΡŒ слСдуСт Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° ΠΈΠ³Ρ€Π°Π΅Ρ‚ Π²Π°ΠΆΠ½ΡƒΡŽ Ρ€ΠΎΠ»ΡŒ, Ρ‚.ΠΊ. ΠΏΠΈΡ‚ΠΎΠ½ пропускаСт ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹ ΠΈ сводит это ΠΊ обращСниям ΠΊ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌ класса. Π—Π°ΠΏΠΈΡΡŒ Π±Π΅Π· Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ΡΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΡŽ ΠΎ синтаксичСской ошибкС. Π˜Ρ‚Π°ΠΊ, рассмотрим Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ Π΄Π°Π½Π½Ρ‹Ρ… ΠΊΠΎΠΌΠ°Π½Π΄. Для этого Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄:

>>> def f():
>>>     label .a
>>>     goto .a
>>> import dis
>>> dis.dis( f )
  2           0 LOAD_GLOBAL              0 (label)
              3 LOAD_ATTR                1 (a)
              6 POP_TOP

  3           7 LOAD_GLOBAL              2 (goto)
             10 LOAD_ATTR                1 (a)
             13 POP_TOP
             14 LOAD_CONST               0 (None)
             17 RETURN_VALUE

Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΊΠΎΠΌΠ°Π½Π΄Π° объявлСния ΠΌΠ΅Ρ‚ΠΊΠΈ ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° ΠΏΠΎ ΠΌΠ΅Ρ‚ΠΊΠ΅ сводится ΠΊ Ρ‚Ρ€Π΅ΠΌ опСрациям LOAD_GLOBAL, LOAD_ATTR, POP_TOP, основныС ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… β€” ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Π΄Π²Π΅. ΠœΠΎΠ΄ΡƒΠ»ΡŒ dis позволяСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ этих ΠΊΠΎΠΌΠ°Π½Π΄ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ словаря opmap ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΠΎ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Ρƒ ΠΈΡ… символьноС прСдставлСниС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ словаря opname.

>>> dis.opmap[ 'LOAD_GLOBAL' ]
116
>>> dis.opmap[ 'LOAD_ATTR' ]
105

Π‘Π°ΠΉΡ‚ΠΎΠ²ΠΎΠ΅ прСдставлСниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ f хранится Π² f.func_code.co_code, Π° ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ прСдставлСния Π΅Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… хранятся Π² f.func_code.co_names.

>>> f.func_code.co_names
('label', 'a', 'goto')

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎ Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹Ρ… прСдставлСниях ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‰ΠΈΡ… нас ΠΊΠΎΠΌΠ°Π½Π΄. По куску дизассСмблСра Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ LOAD_GLOBAL ΠΈ LOAD_ATTR ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ трСмя Π±Π°ΠΉΡ‚Π°ΠΌΠΈ (слСва ΡƒΠΊΠ°Π·Π°Π½ΠΎ смСщСниС), ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… β€” Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ (ΠΈΠ· opmap), Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΈ Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ β€” Π΄Π°Π½Π½Ρ‹Π΅ (младший ΠΈ ΡΡ‚Π°Ρ€ΡˆΠΈΠΉ Π±Π°ΠΉΡ‚ соотвСтствСнно), ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ собой индСкс Π² спискС f.func_code.co_names, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ‚ΠΎΠΌΡƒ, ΠΊΠ°ΠΊΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΈΠ»ΠΈ ΠΊΠ°ΠΊΠΎΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ.

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Π΅ΡΡ‚ΡŒ Π»ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Ρƒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ (ΠΈ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π΄Π»ΠΈΠ½Ρƒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π² Π±Π°ΠΉΡ‚Π°Ρ…), ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ сравнСния с dis.HAVE_ARGUMENT. Если ΠΎΠ½Π° большС ΠΈΠ»ΠΈ Ρ€Π°Π²Π½Π° Π΄Π°Π½Π½ΠΎΠΉ константС, Ρ‚ΠΎ ΠΎΠ½Π° ΠΈΠΌΠ΅Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, ΠΈΠ½Π°Ρ‡Π΅ β€” Π½Π΅Ρ‚. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для Ρ€Π°Π·Π±ΠΎΡ€Π° Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π”Π°Π»Π΅Π΅, замСняСм ΠΊΠΎΠ΄ ΠΌΠ΅Ρ‚ΠΎΠΊ Π½Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ NOP, Π° ΠΊΠΎΠ΄ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² goto Π½Π° JUMP_ABSOLUTE, которая Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ смСщСниС Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’ΠΎΡ‚, практичСски ΠΈ всС. Код Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Π° ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π½ΠΈΠΆΠ΅.

import dis, new

class MissingLabelError( Exception ):
    pass

class ExistingLabelError( Exception ):
    pass
    
def goto( function ):
    labels_dict = {}
    gotos_list = []
    command_name = ''
    previous_operation = ''
    i = 0

    while i < len( function.func_code.co_code ):
        operation_code = ord( function.func_code.co_code[ i ] )
        operation_name = dis.opname[ operation_code ]

        if operation_code >= dis.HAVE_ARGUMENT:
            lo_byte = ord( function.func_code.co_code[ i + 1 ] )
            hi_byte = ord( function.func_code.co_code[ i + 2 ] )
            argument_position = ( hi_byte << 8 ) ^ lo_byte
            
            if operation_name == 'LOAD_GLOBAL':
                command_name = function.func_code.co_names[ argument_position ]
                
            if operation_name == 'LOAD_ATTR' and previous_operation == 'LOAD_GLOBAL':
                if command_name == 'label':
                    label = function.func_code.co_names[ argument_position ]
                    if labels_dict.has_key( label ):
                        raise ExistingLabelError( 'Label redifinition: %s' % label )
                    labels_dict.update( { label : i - 3 } )
                elif command_name == 'goto':
                    gotos_list += [ ( function.func_code.co_names[ argument_position ], i - 3 ) ]
            
            i += 3
            
        else:
            i += 1

        previous_operation = operation_name
        
    codebytes_list = list( function.func_code.co_code )
    for label, index in labels_dict.items():
        codebytes_list[ index : index + 7 ] = [ chr( dis.opmap[ 'NOP' ] ) ] * 7
    # замСняСм 7 ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠ΄ΡƒΡ‰ΠΈΡ… Π±Π°ΠΉΡ‚ ΠΊΠΎΠΌΠ°Π½Π΄ LOAD_GLOBAL, LOAD_ATTR ΠΈ POP_TOP Π½Π° NOP

    for label, index in gotos_list:
        if label not in labels_dict:
            raise MissingLabelError( 'Missing label: %s' % label )
        
        target_index = labels_dict[ label ] + 7
        codebytes_list[ index ] = chr( dis.opmap[ 'JUMP_ABSOLUTE' ] )
        codebytes_list[ index + 1 ] = chr( target_index & 0xFF )
        codebytes_list[ index + 2 ] = chr( ( target_index >> 8 ) & 0xFF )

    # создаСм Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ для Π½ΠΎΠ²ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
    code = function.func_code
    new_code = new.code( code.co_argcount, code.co_nlocals, code.co_stacksize, code.co_flags,
        str().join( codebytes_list ), code.co_consts, code.co_names, code.co_varnames,
        code.co_filename, code.co_name, code.co_firstlineno, code.co_lnotab )
    
    # создаСм Π½ΠΎΠ²ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ
    new_function = new.function( new_code, function.func_globals )
    return new_function

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования:

@goto
def test_function( n ):
    
    goto .label1
     
    label .label2
    print n
    goto .label3
        
    label .label1
    print n
    n -= 1
    if n != 0:
        goto .label1
    else:
        goto .label2
        
    label .label3
    print 'the end'

test_function( 10 )

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

10
9
8
7
6
5
4
3
2
1
0
the end

Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Ρ…ΠΎΡ‡Ρƒ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π΄Π°Π½Π½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π΅ Π²ΠΏΠΎΠ»Π½Π΅ соотвСтствуСт ΠΎΠ±Ρ‰Π΅ΠΌΡƒ ΡΡ‚ΠΈΠ»ΡŽ ΠΏΠΈΡ‚ΠΎΠ½Π°: ΠΎΠ½ΠΎ Π½Π΅ слишком Π½Π°Π΄Π΅ΠΆΠ½ΠΎ ΠΈΠ·-Π·Π° сильной зависимости ΠΎΡ‚ вСрсии ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° (Π² Π΄Π°Π½Π½ΠΎΠΌ случаС использовался ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ 2.7, Π½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ для всСх вСрсий 2-ΠΊΠΈ), ΠΎΠ΄Π½Π°ΠΊΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ Π΅Ρ‰Π΅ Ρ€Π°Π· Π΄ΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ языка ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ добавлСния Π½ΠΎΠ²ΠΎΠΉ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

ΠŸΠΎΠ³Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΏΡƒΡ‡ΠΈΠ½Ρƒ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° Python. Π§1 / Π₯Π°Π±Ρ€

ΠžΡ‚ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°: НавСрно всСм интСрСсно, Ρ‡Ρ‚ΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρƒ инструмСнта, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΡˆΡŒ, этот интСрСс ΠΎΠ²Π»Π°Π΄Π΅Π» ΠΈ ΠΌΠ½ΠΎΠΉ, Π½ΠΎ Π³Π»Π°Π²Π½ΠΎΠ΅ Π½Π΅ ΡƒΡ‚ΠΎΠΏΠ°Ρ‚ΡŒ Π² Π½Ρ‘ΠΌ ΠΈ Π½Π΅ Π·Π°ΠΊΠΎΠΏΠ°Ρ‚ΡŒΡΡ Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π½Π΅ Π²Ρ‹Π»Π΅Π·Ρ‚ΠΈ. Найдя для сСбя интСрСсный ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π», я Ρ€Π΅ΡˆΠΈΠ» Π·Π°Π±ΠΎΡ‚Π»ΠΈΠ²ΠΎ пСрСвСсти Π΅Π³ΠΎ ΠΈ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ хабросообщСству (моя пСрвая публикация, ΠΏΡ€ΠΎΡˆΡƒ Π½ΠΎΠ³Π°ΠΌΠΈ сильно Π½Π΅ ΠΏΠΈΠ½Π°Ρ‚ΡŒ). Π’Π΅ΠΌ, ΠΊΠΎΠΌΡƒ интСрСсСн ΠΊΠ°ΠΊ Python Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° самом Π΄Π΅Π»Π΅, ΠΏΡ€ΠΎΡˆΡƒ ΠΏΡ€ΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ ΠΊΠ°Ρ‚.


ПослСдниС Ρ‚Ρ€ΠΈ мСсяца я ΠΏΠΎΡ‚Ρ€Π°Ρ‚ΠΈΠ» ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° byterun, ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ питоновского Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄Π°, написанного Π½Π° ΠΏΠΈΡ‚ΠΎΠ½Π΅. Π Π°Π±ΠΎΡ‚Π° Π½Π°Π΄ этим ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ Π±Ρ‹Π»Π° для мСня Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰Π΅ вСсёлой ΠΈ ΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ. Π― Π±Ρ‹Π» Π±Ρ‹ Ρ€Π°Π΄, Ссли Π±Ρ‹ Π²Ρ‹ Ρ‚ΠΎΠΆΠ΅ Π΅Π³ΠΎ ΠΏΠΎΡ‚Ρ‹ΠΊΠ°Π»ΠΈ. Но ΠΏΡ€Π΅ΠΆΠ΄Π΅ Π½Π°ΠΌ Π½Π°Π΄ΠΎ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ остСпСнится, ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ python, Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΡ‹ Π·Π½Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Π½Π° самом Π΄Π΅Π»Π΅ ΠΈ с Ρ‡Π΅ΠΌ Π΅Π³ΠΎ Сдят.

Π― ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°ΡŽ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ сСйчас Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, Ρ‡Ρ‚ΠΎ ΠΈ я Ρ‚Ρ€ΠΈ мСсяца Π½Π°Π·Π°Π΄. Π’Ρ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚Π΅ python, Π½ΠΎ понятия Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚Π΅ ΠΊΠ°ΠΊ ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.

НСбольшая Π·Π°ΠΌΠ΅Ρ‚ΠΊΠ°: Π― Ρ€Π°Π±ΠΎΡ‚Π°ΡŽ с вСрсиСй 2.7 Π² этом постС. Π’Ρ€Π΅Ρ‚ΡŒΡ вСрсия ΠΏΠΎΡ‡Ρ‚ΠΈ схоТа со Π²Ρ‚ΠΎΡ€ΠΎΠΉ, Π΅ΡΡ‚ΡŒ нСбольшиС различия Π² синтаксисС ΠΈ наимСнованиях, Π½ΠΎ Π² Ρ†Π΅Π»ΠΎΠΌ всё Ρ‚ΠΎΠΆΠ΅ самоС.

Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ python?

ΠœΡ‹ Π½Π°Ρ‡Π½Ρ‘ΠΌ с ΠΎΡ‡Π΅Π½ΡŒ (ΠΎΡ‡Π΅Π½ΡŒ ΠΎΡ‡Π΅Π½ΡŒ) высокого уровня Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹. Π§Ρ‚ΠΎ происходит ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ выполняСтС ΠΊΠΎΠ΄ Π² вашСм ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π΅?

~ $ python
Python 2.7.2 (default, Jun 20 2012, 16:23:33)
[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a = "hello"

Π“ΠΎΠ΄Ρ‹ ΠΈΠ΄ΡƒΡ‚, лСдянки Ρ‚Π°ΡŽΡ‚, Линус Π’ΠΎΡ€Π²Π°Π»ΡŒΠ΄Ρ ΠΏΠΈΠ»ΠΈΡ‚ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ΅ ядро, Π° 64 Π±ΠΈΡ‚Ρ‹ΠΉ процСссор Π±Π΅Π· устали трудится, Ρ‚Π΅ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ происходит Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ шага: лСксичСской Π°Π½Π°Π»ΠΈΠ·, парсинг, компиляция ΠΈ Π½Π°ΠΊΠΎΠ½Π΅Ρ† Ρ‚Π°ΠΊΠΈ интСрпрСтация. ΠŸΠ°Ρ€ΡΠ΅Ρ€ Π·Π°Π±ΠΈΡ€Π°Π΅Ρ‚ скормлСнныС Π΅ΠΌΡƒ инструкции ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ структуру которая ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ ΠΈΡ… связь формируя AST( АбстрактноС БинтаксичСскоС Π”Π΅Ρ€Π΅Π²ΠΎ). ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ AST Π² ΠΎΠ΄Π½ΠΈ (ΠΈΠ»ΠΈ нСсколько) ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΊΠΎΠ΄Π° (Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄ + обвязка). ΠŸΠΎΡ‚ΠΎΠΌ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ выполняСт ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.

Π― Π½Π΅ ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡΡŒ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΎΠ± лСксичСском Π°Π½Π°Π»ΠΈΠ·Π΅, парсингС ΠΈΠ»ΠΈ компиляции сСгодня, Π½Π°Π²Π΅Ρ€Π½ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ я сам ΠΏΡ€ΠΎ эти Π²Π΅Ρ‰ΠΈ Π½ΠΈ Ρ‡Π΅Π³ΠΎ Π½Π΅ знаю, Π½ΠΎ Π½Π΅ ΡƒΠ½Ρ‹Π²Π°ΠΉΡ‚Π΅: Π²Ρ‹ всСгда смоТСтС ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ это, ΠΏΠΎΡ‚Ρ€Π°Ρ‚ΠΈΠ² часов этак ΠΏΡΡ‚ΡŒΠ΄Π΅ΡΡΡ‚. ΠœΡ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ эти шаги ΠΏΡ€ΠΎΡˆΠ»ΠΈ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, ΠΈ Ρƒ нас Π΅ΡΡ‚ΡŒ Π½Π° Ρ€ΡƒΠΊΠ°Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ python ΠΊΠΎΠ΄Π°.

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

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Π’Ρ‹ Π½Π°Π²Π΅Ρ€Π½ΠΎ ΠΌΠΎΠ³Π»ΠΈ ΡΠ»Ρ‹ΡˆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎ Β«ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΒ». Π­Ρ‚ΠΎ Π²Π΅Ρ‰ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ люди ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°ΡŽΡ‚ ΠΊΠΎΠ³Π΄Π° говорят: Β«Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ β€” это ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ класса». Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΈΠ·ΡƒΡ‡ΠΈΠΌ ΠΈΡ… ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅:

>>> def foo(a):
...     x = 3
...     return x + a
...
>>> foo
<function foo at 0x107ef7aa0>

Β«Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ это ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ класса» ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Ρ‡Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ β€” это ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠ°ΠΊ список это ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΠ»ΠΈ экзСмпляры MyObject это ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹. Π Π°Π· foo это ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π΅Π³ΠΎ Π½Π΅ выполняя Π΅Π³ΠΎ (Π² этом ΠΈ Π΅ΡΡ‚ΡŒ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ foo() ΠΈ foo). ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€Π΅Π΄Π°Ρ‚ΡŒ foo ΠΊΠ°ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈΠ»ΠΈ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.

Π”Π°Π²Π°ΠΉΡ‚Π΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ посмотрим Π½Π° foo ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅ΠΉ:

>>> def foo(a):
...     x = 3
...     return x + a
...
>>> foo
<function foo at 0x107ef7aa0>
>>> foo.func_code
<code object foo at 0x107eeccb0, file "<stdin>", line 1>

Как Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Π² Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΊΠΎΠ΄Π° это Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠžΠ±ΡŠΠ΅ΠΊΡ‚ ΠΊΠΎΠ΄Π° гСнСрируСтся питоновским компилятором ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠΌ, ΠΎΠ½ содСрТит ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡƒΡŽ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°. Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΊΠΎΠ΄Π°:

>>> dir(foo.func_code)
['__class__', '__cmp__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__',
'__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__ne__', '__new__',
'__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__',
'__subclasshook__', 'co_argcount', 'co_cellvars', 'co_code', 'co_consts', 'co_filename',
'co_firstlineno', 'co_flags', 'co_freevars', 'co_lnotab', 'co_name', 'co_names', 'co_nlocals',
'co_stacksize', 'co_varnames']

Π—Π΄Π΅ΡΡŒ цСлая ΠΊΡƒΡ‡Π° Π½ΠΈΡˆΡ‚ΡΠΊΠΎΠ², Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½ΠΌ сСйчас Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ. Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ рассмотрим Ρ‚Ρ€ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° foo.

>>> foo.func_code.co_varnames
('a', 'x')
>>> foo.func_code.co_consts
(None, 3)
>>> foo.func_code.co_argcount
1

Π’ΠΎΡ‚ Ρ‡Ρ‚ΠΎ здСсь Π΅ΡΡ‚ΡŒ: ΠΈΠΌΠ΅Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ констант ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² нашСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ количСство ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌΡ‹Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Но ΠΌΡ‹ всё Π΅Ρ‰Ρ‘ Π½Π΅ Π²ΠΈΠ΄ΠΈΠΌ Π½ΠΈ Ρ‡Π΅Π³ΠΎ Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° инструкции. Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄ΠΎΠΌ ссылка, кстати это Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΊΠΎΠ΄Π°:

>>> foo.func_code.co_code
'd\x01\x00}\x01\x00|\x01\x00|\x00\x00\x17S'

Напоминаю Ρ‡Ρ‚ΠΎ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄ ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΊΠΎΠ΄Π° это Π½Π΅ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎΠΆΠ΅. Π‘Π°ΠΉΡ‚ΠΊΠΎΠ΄ это Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΊΠΎΠ΄Π° ΠΏΠΎΠΌΠΈΠΌΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ². Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΆΠ΅ Ρ‚Π°ΠΊΠΎΠ΅ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄? Ну это просто Π½Π°Π±ΠΎΡ€ Π±Π°ΠΉΡ‚. Они выглядят странно ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ ΠΈΡ… ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅ΠΌ ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π±Π°ΠΉΡ‚ΠΎΠΌ сопоставимы символы Π° Π΄Ρ€ΡƒΠ³ΠΈΠΌ Π½Π΅Ρ‚, Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π²Ρ‹Π²Π΅Π΄Π΅ΠΌ ΠΈΡ… ΠΊΠ°ΠΊ числа.

>>> [ord(b) for b in foo.func_code.co_code]
[100, 1, 0, 125, 1, 0, 124, 1, 0, 124, 0, 0, 23, 83]

Π’ΠΎΡ‚ Π±Π°ΠΉΡ‚Ρ‹ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ творят всю магию. Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈ бСзустанно Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ Π±Π°ΠΉΡ‚Ρ‹, ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅ ΠΎΠ½ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ ΠΈ с ΠΊΠ°ΠΊΠΈΠΌΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ ΠΈ ΠΈΡΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹. Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΉΡ‚ΠΈ Π΅Ρ‰Ρ‘ дальшС ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ исходный ΠΊΠΎΠ΄ Cpython Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ ceval.c Ρ‡Ρ‚ΠΎ ΠΌΡ‹ сдСлаСм ΠΏΠΎΠ·Π΄Π½Π΅Π΅.

ДизассСмблированиС Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄Π°

ДизассСмблированиС ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π²Π·ΡΡ‚ΡŒ всС эти Π±Π°ΠΉΡ‚Ρ‹ ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… Π²ΠΎ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠΈ способны ΠΏΠΎΠ½ΡΡ‚ΡŒ. Π­Ρ‚ΠΎ Π½Π΅ выполняСтся Π² стандартном Ρ†ΠΈΠΊΠ»Π΅ ΠΏΠΈΡ‚ΠΎΠ½Π°. БСгодня для этой Π·Π°Π΄Π°Ρ‡ΠΈ Π΅ΡΡ‚ΡŒ ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ инструмСнт β€” ΠΌΠΎΠ΄ΡƒΠ»ΡŒ dis. ΠœΡ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ dis.dis Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ наша foo.

>>> def foo(a):
...     x = 3
...     return x + a
...
>>> import dis
>>> dis.dis(foo.func_code)
  2           0 LOAD_CONST               1 (3)
              3 STORE_FAST               1 (x)

  3           6 LOAD_FAST                1 (x)
              9 LOAD_FAST                0 (a)
             12 BINARY_ADD
             13 RETURN_VALUE

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π½ΠΎΠΌΠ΅Ρ€ это строка исходного python ΠΊΠΎΠ΄Π°, Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π½ΠΎΠΌΠ΅Ρ€ это смСщСниС Π²Π½ΡƒΡ‚Ρ€ΠΈ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄Π°: LOAD_CONST находится Π½Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 0, Π° STORE_FAST Π½Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 3 ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅. БрСдняя ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° это Π½Π°Π·Π²Π°Π½ΠΈΠ΅ самой инструкции, послСдниС Π΄Π²Π΅ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ Π΄Π°ΡŽΡ‚ понятиС ΠΎΠ± Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°Ρ… инструкции (Π΅Π»ΠΈ ΠΎΠ½ΠΈ Π΅ΡΡ‚ΡŒ), чСтвСртая ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ сам Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдставляСт собой индСкс Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΊΠΎΠ΄Π°. Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ для LOAD_CONST это индСкс Π² спискС co_consts, Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ для STORE_FAST это индСкс Π² co_varnames, Π² пятой ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ΅ выводятся ΠΈΠΌΠ΅Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ констант. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ с Π»Π΅Π³ΠΊΠΎΡΡ‚ΡŒΡŽ это ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ:

>>> foo.func_code.co_consts[1]
3
>>> foo.func_code.co_varnames[1]
'x'

Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ Π²Ρ‚ΠΎΡ€ΡƒΡŽ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ STORE_FAST которая находится ΠΏΠΎ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 3 Π² Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄Π΅. Если инструкция ΠΈΠΌΠ΅Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π΄Π²Π° Π±Π°ΠΉΡ‚Π° ΠΈ Π΅ΡΡ‚ΡŒ этот Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚. Π Π°Π±ΠΎΡ‚Π° ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° ΠΊΠ°ΠΊ Ρ€Π°Π· Ρ‚Π°ΠΊΠΈ Π² Ρ‚ΠΎΠΌ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ запутаСтся ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ ΡΠ΅ΡΡ‚ΡŒ Ρ€Π°Π·ΡƒΠΌΠ½ΠΎΠ΅, Π΄ΠΎΠ±Ρ€ΠΎΠ΅, Π²Π΅Ρ‡Π½ΠΎΠ΅. (Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ BINARY_ADD Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², Π½Π΅ Π²ΠΎΠ»Π½ΡƒΠΉΡ‚Π΅ΡΡŒ ΠΌΡ‹ Π΅Ρ‰Ρ‘ вСрнСмся ΠΊ этому)

Π‘Ρ‹Π»Π° ΠΎΠ΄Π½Π° вСшь которая удивляла мСня ΠΊΠΎΠ³Π΄Π° я Π½Π°Ρ‡Π΅Π» Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ python, ΠΊΠ°ΠΊ python ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ динамичСским, Ссли ΠΎΠ½ Π΅Ρ‰Ρ‘ ΠΈ «компилируСтся»? ΠžΠ±Ρ‹Ρ‡Π½ΠΎ эти Π΄Π²Π° слова Β«Π°Π½Ρ‚ΠΎΠ½ΠΈΠΌΡ‹Β», Π΅ΡΡ‚ΡŒ динамичСскиС языки Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Python, Ruby, ΠΈ Javascript, Π° Π΅ΡΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ Ρ‚Π°ΠΊΠΈ ΠΊΠ°ΠΊ C, Java, ΠΈ Haskell.

Когда люди говорят ΠΎΠ± ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… языках ΠΎΠ½ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ Π²Π²ΠΈΠ΄Ρƒ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ Π² Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ x86/ARM/etc инструкции. Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ язык Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ компиляции Π²ΠΎΠΎΠ±Ρ‰Π΅, Ρ€Π°Π·Π²Π΅ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ «компилируСтся» Π½Π° Π»Π΅Ρ‚Ρƒ Π² Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄. Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ ΠΏΠΈΡ‚ΠΎΠ½Π° Ρ€Π°Π·Π±ΠΈΡ€Π°Π΅Ρ‚ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄ ΠΈ выполняСт Π΅Π³ΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹, Ρ‡Ρ‚ΠΎ кстати достаточно ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹, Π½ΠΎ ΠΌΡ‹ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎΠ± этом ΠΏΠΎΠ·Π΄Π½Π΅Π΅.

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Ρ‚ΡŒ динамичСским Π½Π°Π΄ΠΎ Π±Ρ‹Ρ‚ΡŒ абстрактным, Π΄Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Ρ‡Ρ‚ΠΎ это Π·Π½Π°Ρ‡ΠΈΡ‚:

>> def modulus(x, y):
...     return x % y
...
>>> [ord(b) for b in modulus.func_code.co_code]
[124, 0, 0, 124, 1, 0, 22, 83]
>>> dis.dis(modulus.func_code)
  2           0 LOAD_FAST                0 (x)
              3 LOAD_FAST                1 (y)
              6 BINARY_MODULO
              7 RETURN_VALUE

Π­Ρ‚Π° дизассСмблированая функция Π² Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄Π΅. К Ρ‚ΠΎΠΌΡƒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ΅Π½ΠΈΠ΅ функция modus Π±Ρ‹Π»Π° скомпилирована ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΊΠΎΡ€Π΄Π° Π±Ρ‹Π» сгСнСрирован. Достаточно Π²Π½Π΅Π·Π°ΠΏΠ½ΠΎ, Π½ΠΎ опСрация остатка ΠΎΡ‚ дСлСния % (опСрация modulus) прСобразуСтся Π² BINARY_MODULO. ΠŸΠΎΡ…ΠΎΠΆΠ΅ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для чисСл:

>>> modulus(15,4)
3

НСплохо, Π° Ρ‡Ρ‚ΠΎ Ссли ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΄ΠΈΠΌ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ строку.

>>> modulus("hello %s", "world")
'hello world'

Опана, Ρ‡Ρ‚ΠΎ это Ρ‚ΡƒΡ‚? Π’Ρ‹ Π½Π°Π²Π΅Ρ€Π½ΠΎ ΡƒΠΆΠ΅ Π²ΠΈΠ΄Π΅Π»ΠΈ это Ρ€Π°Π½ΡŒΡˆΠ΅:

>>> print "hello %s" % "world"
hello world

Когда опСрация BINARY_MODULO выполняСтся для Π΄Π²ΡƒΡ… строк ΠΎΠ½Π° выполняСт подстановку строк вмСсто остатка ΠΎΡ‚ дСлСния. Π­Ρ‚Π° ситуация ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ динамичСской Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ. Когда компилятор Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΊΠΎΠ΄Π° для modulus ΠΎΠ½ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ понятия Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ x ΠΈ y, строки Π»ΠΈ ΠΎΠ½ΠΈ ΠΈΠ»ΠΈ числа ΠΈΠ»ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΅Ρ‰Ρ‘. Он просто выполняСт инструкции: Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π΅Π½Π½ΡƒΡŽ, Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΡƒΡŽ, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΏΡ€Π΅ΠΏΠ°Ρ€Π°Ρ†ΠΈΡŽ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ модуля, Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. Π Π°Π±ΠΎΡ‚Π° ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° Π² Ρ‚ΠΎΠΌ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ BINARY_MODULO Π·Π½Π°Ρ‡ΠΈΡ‚ Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ контСкстС. Наша функция modulus ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ остаток, ΠΏΠΎΠ΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ строки… ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΅Ρ‰Ρ‘? Если ΠΌΡ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ класс с ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ __mod__ Ρ‚ΠΎ ΠΌΡ‹ смоТСм ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ ΡƒΠ³ΠΎΠ΄Π½ΠΎ.

>>> class Surprise(object):
...     def __init__(self, num):
...         self.num = num
...     def __mod__(self, other):
...         return self.num + other.num
...
>>> seven = Surprise(7)
>>> four = Surprise(4)
>>> modulus(seven, four)
11
>>> modulus(7,4)
3
>>> modulus("hello %s", "world")
'hello world'

Одна ΠΈ Ρ‚Π° ΠΆΠ΅ функция с ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄ΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π² зависимости ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° контСкста. Π’Π°ΠΊΠΆΠ΅ функция modulus ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π±ΡƒΠ΄ΠΈΡ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° TypeError Ссли ΠΌΡ‹ Π²Ρ‹Π·ΠΎΠ²Π΅ΠΌ Π΅Π³ΠΎ для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹.

Π­Ρ‚ΠΎ являСтся ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΠΏΡ€ΠΈΡ‡ΠΈΠ½ Ρ‚ΠΎΠ³ΠΎ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ python. Π’Ρ‹ Π½Π΅ Π·Π½Π°Π΅Ρ‚Π΅, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ ΠΊΠΎΠ΄ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄, Ρ‡Ρ‚ΠΎ Π·Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅. Russell Power ΠΈ Alex Rubinsteyn написали ΡΡ‚Π°Ρ‚ΡŒΡŽ Β«ΠΊΠ°ΠΊ быстр ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ pythonΒ», это ΡΡ‚Π°Ρ‚ΡŒΡ достаточного ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ.

На сСгодня ΠΏΠΎΠΊΠ° всС. ΠžΡ€ΠΈΠ³ΠΈΠ½Π°Π» ΡΡ‚Π°Ρ‚ΡŒΠΈ Ρ‚ΡƒΡ‚. ΠŸΡ€ΠΎΡˆΡƒ ΠΏΡ€ΠΎΡˆΠ΅Π½ΠΈΡ Π·Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ошибки Ρ‚.ΠΊ. ΠΎΡ‚ ΠΏΡ€ΠΈΡ€ΠΎΠ΄Ρ‹ обладаю Π²Ρ€ΠΎΠΆΠ΄Ρ‘Π½Π½ΠΎΠΉ Π±Π΅Π·Π³Ρ€Π°ΠΌΠΎΡ‚Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈ Π²Ρ‹Π½ΡƒΠΆΠ΄Π΅Π½ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΌ способом ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ тСкста.

Python 3 — ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ Π² Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄

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

инструкции Π² тСкстовом Ρ„Π°ΠΉΠ»Π΅. Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ Π°Π±Π·Π°Ρ†Π΅ Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ Ρ„Ρ€Π°Π·Ρƒ — практичСски Π½Π΅Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ для вас. Если ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Python Π½Π° вашСм ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ ΠΏΡ€Π°Π²ΠΎΠΌ записи, ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² Π²ΠΈΠ΄Π΅ Ρ„Π°ΠΉΠ»Π° с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ .рус (.рус — это ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ исходный Ρ„Π°ΠΉΠ» .Ρ€Ρƒ). Π’Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Ρ‚ΡŒ эти Ρ„Π°ΠΉΠ»Ρ‹ послС запуска ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΏΠΎ сосСдству с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ, содСрТащими исходныС тСксты (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅).

Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ сохраняСт Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ для ускорСния запуска ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅Ρ‚Π΅ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ свою ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Python Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ Ρ„Π°ΠΉΠ» .рус ΠΈ ΠΌΠΈΠ½ΡƒΠ΅Ρ‚ этап компиляции — ΠΏΡ€ΠΈ условии, Ρ‡Ρ‚ΠΎ исходный тСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π΅ измСнялся с ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° послСднСй компиляции. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π»ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ, Python автоматичСски сравнит врСмя послСднСго измСнСния Ρ„Π°ΠΉΠ»Π° с исходным тСкстом ΠΈ Ρ„Π°ΠΉΠ»Π° с Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ΠΎΠΌ.

Если исходный тСкст сохранялся Π½Π° диск послС компиляции, ΠΏΡ€ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Π΅Π³ΠΎ запускС ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ автоматичСски Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΡƒΡŽ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Если ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ окаТСтся Π½Π΅ Π² состоянии Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» с Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ΠΎΠΌ Π½Π° диск, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΎΡ‚ этого Π½Π΅ пострадаСт, просто Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ сгСнСрирован Π² памяти ΠΈ исчСзнСт ΠΏΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.1 Однако ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ„Π°ΠΉΠ»Ρ‹ .рус ΠΏΠΎΠ²Ρ‹ΡˆΠ°ΡŽΡ‚ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ запуска ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π²Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ ΠΈΡ…, особСнно для Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ„Π°ΠΉΠ»Ρ‹ с Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ΠΎΠΌ — это Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· способов распространСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π½Π° языкС Python. Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ запустит Ρ„Π°ΠΉΠ» .рус, Π΄Π°ΠΆΠ΅ Ссли Π½Π΅Ρ‚ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² с исходными тСкстами. (Π’ Ρ€Π°Π·Π΄Π΅Π»Π΅ «ЀиксированныС Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Π΅ файлы»  описываСтся Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ способ распространСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ).

Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚-ΠΌΠ°Π³Π°Π·ΠΈΠ½ plitka.ua, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ ΠΊΠ΅Ρ€Π°ΠΌΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΌΠΎΠ·Π°ΠΈΠΊΡƒ Π½Π° складС ΠΈ ΠΏΠΎΠ΄ Π·Π°ΠΊΠ°Π·. ВыставочныС ΠΎΠ±Ρ€Π°Π·Ρ†Ρ‹ Π² салонах ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ.

Как ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π° Π² Python?

Всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° скрипт Python компилируСтся, ΠΎΠ½ автоматичСски Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ скомпилированный ΠΊΠΎΠ΄, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ. Π‘Π°ΠΉΡ‚-ΠΊΠΎΠ΄ фактичСски Π½Π΅ интСрпрСтируСтся для машинного ΠΊΠΎΠ΄Π°, Ссли Π½Π΅ сущСствуСт ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ экзотичСской Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠ°ΠΊ PyPy .

Π‘Π°ΠΉΡ‚-ΠΊΠΎΠ΄ загруТаСтся Π²ΠΎ врСмя выполнСния Python ΠΈ интСрпрСтируСтся Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ машиной, которая прСдставляСт собой Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ Π² Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π΅ ΠΈ выполняСт Π»ΡŽΠ±ΡƒΡŽ ΡƒΠΊΠ°Π·Π°Π½Π½ΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ.

Π‘Π°ΠΉΡ‚-ΠΊΠΎΠ΄ автоматичСски создаСтся Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅, Ρ‡Ρ‚ΠΎ ΠΈ Ρ„Π°ΠΉΠ» .py, ΠΊΠΎΠ³Π΄Π° ΠΌΠΎΠ΄ΡƒΠ»ΡŒ python импортируСтся Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅ ΠΈΠ»ΠΈ ΠΊΠΎΠ³Π΄Π° источник Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½ΠΈΠΉ, Ρ‡Π΅ΠΌ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ скомпилированный Ρ„Π°ΠΉΠ». Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π°, ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Python ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ этот Ρ„Π°ΠΉΠ», Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ этап компиляции.

Запуск сцСнария Π½Π΅ считаСтся ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΎΠΌ, ΠΈ Ρ„Π°ΠΉΠ» .pyc Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ создан. НапримСр, Π΄Π°Π²Π°ΠΉΡ‚Π΅ напишСм Ρ„Π°ΠΉΠ» скрипта abc.py, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ xyz.py. Π’Π΅ΠΏΠ΅Ρ€ΡŒ запуститС Ρ„Π°ΠΉΠ» abc.py , xyz.pyc Π±ΡƒΠ΄Π΅Ρ‚ создан, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ xyz ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½, Π½ΠΎ Ρ„Π°ΠΉΠ» abc.pyc Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ создан, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ abc.py Π½Π΅ импортируСтся.

Но ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ встроСнныС ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ py_compile ΠΈ compileall, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Π»Π΅Π³Ρ‡Π°ΡŽΡ‚ созданиС Ρ„Π°ΠΉΠ»Π° .pyc.

  1. ИспользованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ py_compile.compile : ΠΌΠΎΠ΄ΡƒΠ»ΡŒ py_compile ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ любой ΠΌΠΎΠ΄ΡƒΠ»ΡŒ. Одним ΠΈΠ· способов являСтся ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅ использованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ py_compile.compile Π² этом ΠΌΠΎΠ΄ΡƒΠ»Π΅:
    >>> import py_compile
    >>> py_compile.compile('abc.py')
    

    Π­Ρ‚ΠΎ Π·Π°ΠΏΠΈΡˆΠ΅Ρ‚ .pyc Π² Ρ‚ΠΎ ΠΆΠ΅ мСсто, Ρ‡Ρ‚ΠΎ ΠΈ abc.py.

  2. ИспользованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ py_compile.main () : ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ нСсколько Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ.
    >>> import py_compile
    >>> py_compile.main(['File1.py','File2.py','File3.py'])
    
  3. ИспользованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ compileall.compile_dir () : ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ„Π°ΠΉΠ» python, ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π² прСдоставлСнном ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅.
    >>> import compileall
    >>> compileall.compile_dir(directoryname)
    
  4. ИспользованиС py_compile Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅:
    $ python -m py_compile File1.py File2.py File3.py ...
    

    Или для ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ компиляции Ρ„Π°ΠΉΠ»ΠΎΠ²

    $ python -m py_compile -
      File1.py
      File2.py
      File3.py
       .
       .
       .
    
  5. ИспользованиС compileall Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅: эта ΠΊΠΎΠΌΠ°Π½Π΄Π° автоматичСски рСкурсивно ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ ΠΈ создаСт Ρ„Π°ΠΉΠ»Ρ‹ .pyc для всСх Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² python.
    $ python -m compileall 
    

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ . ΠœΠΎΠ΄ΡƒΠ»ΡŒ compileall ΠΈ py_compile являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ python, поэтому для Π΅Π³ΠΎ использования Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Π½ΠΈΡ‡Π΅Π³ΠΎ лишнСго.

Бсылки:
1. https://docs.python.org/3/library/py_compile.html
2. https://docs.python.org/2/library/compileall.html
3. Π­Ρ„Ρ„Π±ΠΎΡ‚

Π­Ρ‚Π° ΡΡ‚Π°Ρ‚ΡŒΡ прСдоставлСна Shubham Bansal . Если Π²Ρ‹ ΠΊΠ°ΠΊ GeeksforGeeks ΠΈ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π±Ρ‹ внСсти свой Π²ΠΊΠ»Π°Π΄, Π²Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΡΡ‚Π°Ρ‚ΡŒΡŽ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ contribute.geeksforgeeks.org ΠΈΠ»ΠΈ ΠΏΠΎ ΠΏΠΎΡ‡Ρ‚Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ [email protected]. Π‘ΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ свою ΡΡ‚Π°Ρ‚ΡŒΡŽ, ΠΏΠΎΡΠ²Π»ΡΡŽΡ‰ΡƒΡŽΡΡ Π½Π° Π³Π»Π°Π²Π½ΠΎΠΉ страницС GeeksforGeeks, ΠΈ ΠΏΠΎΠΌΠΎΠ³ΠΈΡ‚Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠΌ Π²ΡƒΠ½Π΄Π΅Ρ€ΠΊΠΈΠ½Π΄Π°ΠΌ.

Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌΡ‹Π΅ посты:

Как ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π° Π² Python?

0.00 (0%) 0 votes

ВсС, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ ΠΎ Π±Π°ΠΉΡ‚Π°Ρ… Π² Python

НовыС Ρ‚ΠΈΠΏΡ‹ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Ρ… ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡΡ… ΠΏΠΎΡ…ΠΎΠΆΠΈ Π½Π° Ρ‚ΠΈΠΏ str Π² Python 2. Π“Π»Π°Π²Π½ΠΎΠ΅ Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ β€” это Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Π²Π° основных встроСнных Ρ‚ΠΈΠΏΠ° Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Ρ… ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ: нСизмСняСмый Ρ‚ΠΈΠΏ bytes, появившийся Π² Python 3, ΠΈ измСняСмый Ρ‚ΠΈΠΏ bytearray, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹ΠΉ Π² Python 2.6.

ΠšΡΡ‚Π°Ρ‚ΠΈ, Π² Python 2.6 Π±Ρ‹Π» Ρ‚Π°ΠΊΠΆΠ΅ Π²Π²Π΅Π΄Π΅Π½ Ρ‚ΠΈΠΏ bytes, Π½ΠΎ лишь ΠΊΠ°ΠΊ псСвдоним Ρ‚ΠΈΠΏΠ° str, ΠΎΠ½ Π²Π΅Π΄Π΅Ρ‚ сСбя ΠΈΠ½Π°Ρ‡Π΅, Ρ‡Π΅ΠΌ Ρ‚ΠΈΠΏ bytes Π² Python 3.

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт bytes ΠΈΠ»ΠΈ bytearray β€” Ρ†Π΅Π»ΠΎΠ΅ число ΠΎΡ‚ 0 Π΄ΠΎ 255, Π° Π½Π΅ односимвольная строка, ΠΊΠ°ΠΊ Π² Ρ‚ΠΈΠΏΠ΅ str Π² Python 2 str.

Однако срСз Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ всСгда являСтся Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ‚ΠΈΠΏΠ°, Π΄Π°ΠΆΠ΅ Ссли это срСз Π΄Π»ΠΈΠ½Ρ‹.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ β„–1. ΠŸΡΡ‚ΠΈΠ±Π°ΠΉΡ‚ΠΎΠ²Π°Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π² Π²ΠΈΠ΄Π΅ bytes ΠΈ bytearray.

>>> cafe = bytes(‘cafΓ©’, encoding=»utf_8″) # (1)
>>> cafe
b’caf\xc3\xa9’
>>> cafe[0] # (2)
99
>>> cafe[:1] # (3)
b’c’
>>> cafe_arr = bytearray(cafe)
>>> cafe_arr # (4)
bytearray(b’caf\xc3\xa9′)
>>> cafe_arr[-1:] # (5)
bytearray(b’\xa9′)
>>>



>>> cafe = bytes(‘cafΓ©’, encoding=»utf_8″) # (1)

>>> cafe

b’caf\xc3\xa9′

>>> cafe[0] # (2)

99

>>> cafe[:1] # (3)

b’c’

>>> cafe_arr = bytearray(cafe)

>>> cafe_arr # (4)

bytearray(b’caf\xc3\xa9′)

>>> cafe_arr[-1:] # (5)

bytearray(b’\xa9′)

>>>

1. bytes ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ· str, Ссли извСстна ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ°.

2. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт β€” Ρ†Π΅Π»ΠΎΠ΅ число Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ range(256).

3. Π‘Ρ€Π΅Π·Ρ‹ bytes Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ‚ΠΈΠΏ bytes, Π΄Π°ΠΆΠ΅ Ссли срСз состоит ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π±Π°ΠΉΡ‚Π°

4. Для Ρ‚ΠΈΠΏΠ° bytearray Π½Π΅ сущСствуСт Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ синтаксиса: Π² ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ этого Ρ‚ΠΈΠΏΠ° ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ Π² Π²ΠΈΠ΄Π΅ конструктора bytearray(), Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ являСтся Π»ΠΈΡ‚Π΅Ρ€Π°Π» Ρ‚ΠΈΠΏΠ° bytes.

5. Π‘Ρ€Π΅Π· cafe_arr Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏΠ° bytearray

Π’ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ my_bytes[0] Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ int, Π° my_bytes[:1] β€” ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ bytes Π΄Π»ΠΈΠ½Ρ‹ 1, Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ удивлСния. ЕдинствСнный Ρ‚ΠΈΠΏ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ s[0] == s[:1] β€” это Ρ‚ΠΈΠΏΠ° str.

И хотя Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ этот Ρ‚ΠΈΠΏ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ сплошь ΠΈ рядом, Π΅Π³ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ β€” ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· ΠΏΡ€Π°Π²ΠΈΠ»Π°. Для всСх ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ s[i] Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ элСмСнт, Π° s[i:i+1] β€” ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, ΡΠΎΡΡ‚ΠΎΡΡ‰ΡƒΡŽ ΠΈΠ· СдинствСнного элСмСнта s[i].

Π₯отя Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ β€” Π½Π° самом Π΄Π΅Π»Π΅, ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Ρ†Π΅Π»Ρ‹Ρ… чисСл, Π² ΠΈΡ… Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΡŒΠ½ΠΎΠΉ Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½ Ρ‚ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ часто ΠΎΠ½ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ ASCII-тСкст.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ способы отобраТСния, зависящиС ΠΎΡ‚ значСния ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π±Π°ΠΉΡ‚Π°.

  • Для Π±Π°ΠΉΡ‚ΠΎΠ² ΠΈΠ· Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° символов ASCII, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ… графичСскоС Π½Π°Ρ‡Π΅Ρ€Ρ‚Π°Π½ΠΈΠ΅ β€” ΠΎΡ‚ ΠΏΡ€ΠΎΠ±Π΅Π»Π° Π΄ΠΎ ~ выводится сам символ ASCII.
  • Для Π±Π°ΠΉΡ‚ΠΎΠ², ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… символам табуляции, Π½ΠΎΠ²ΠΎΠΉ строки, Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΊΠ°Ρ€Π΅Ρ‚ΠΊΠΈ ΠΈ \, выводятся ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ \t, \n, \r ΠΈ \\.
  • Для всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… Π±Π°ΠΉΡ‚ΠΎΠ² выводится ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΠΎΠ΅ прСдставлСниС, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½ΡƒΠ»Π΅Π²ΠΎΠΉ Π±Π°ΠΉΡ‚ прСдставляСтся ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ \x00.

ИмСнно поэтому Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ β„–1 ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ прСдставлСниС b’caf\xc3\xa9β€². ΠŸΠ΅Ρ€Π²Ρ‹Π΅ Ρ‚Ρ€ΠΈ Π±Π°ΠΉΡ‚Π° b’caf’ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρƒ символов ASCII с графичСским Π½Π°Ρ‡Π΅Ρ€Ρ‚Π°Π½ΠΈΠ΅ΠΌ, послСдний β€” Π½Π΅Ρ‚.

Оба Ρ‚ΠΈΠΏΠ° bytes ΠΈ bytearray ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ всС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ‚ΠΈΠΏΠ° str ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚Π΅Ρ…, Ρ‡Ρ‚ΠΎ относятся ΠΊ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ(format, format_map), ΠΈ Π΅Ρ‰Π΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ…, прямо зависящих ΠΎΡ‚ особСнностСй Unicode, Π² Ρ‚ΠΎΠΌ числС casefold, isdecimal, isidentifier, isnumeric, isprintable ΠΈ encode.

Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΌΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡΠΌΠΈ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π·Π½Π°ΠΊΠΎΠΌΡ‹ΠΌΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ строк, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ endswith, replace, strip, translate, upper ΠΈ дСсятками Π΄Ρ€ΡƒΠ³ΠΈΡ…, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΈΠΏ bytes, Π° Π½Π΅ str.

К Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΌ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с рСгулярными выраТСниями ΠΈΠ· модуля re, Ссли рСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ ΠΈΠ· Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Π° Π½Π΅ ΠΈΠ· str.

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ % Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΌΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡΠΌΠΈ Π² вСрсиях ΠΎΡ‚ Python 3.0 Π΄ΠΎ 3.4, Π½ΠΎ, Ссли Π²Π΅Ρ€ΠΈΡ‚ΡŒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρƒ PEP 461, Ρ‚ΠΎ Π΅Π³ΠΎ прСдполагаСтся ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ.

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ % часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… языках программирования. Один ΠΌΠΎΠΉ Π·Π½Π°ΠΊΠΎΠΌΡ‹ΠΉ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ для WordPress ΠΊΠ°ΠΊ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ThemeForest Grand Conference рассказал Ρ‡Ρ‚ΠΎ Π±Π΅Π· ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° % ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π±Ρ‹ ΠΈΠ·ΠΎΠ±Ρ€Π΅Ρ‚Π°Ρ‚ΡŒ вСлосипСды ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ дСнь.

Для Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Ρ… ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ сущСствуСт ΠΌΠ΅Ρ‚ΠΎΠ΄ класса, ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π² Ρ‚ΠΈΠΏΠ΅ str: fromhex, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ строит ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, разбирая ΠΏΠ°Ρ€Ρ‹ ΡˆΠ΅ΡΠ½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½Ρ‹Ρ… Ρ†ΠΈΡ„Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Ρ‹ ΠΏΡ€ΠΎΠ±Π΅Π»Π°ΠΌΠΈ, хотя это ΠΈ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ.

>>> bytes.fromhex(«34 FF FA A3 A5»)
b’4\xff\xfa\xa3\xa5’
>>>



>>> bytes.fromhex(«34 FF FA A3 A5»)

b’4\xff\xfa\xa3\xa5′

>>>

Π”Ρ€ΡƒΠ³ΠΈΠ΅ способы построСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² bytes ΠΈ bytearray связаны с Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… конструкторов:

  • с ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ str ΠΈ encoding;
  • с ΠΈΡ‚Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°ΡŽΡ‰ΠΈΠΌ элСмСнты со значСниями ΠΎΡ‚ 0 Π΄ΠΎ 255;
  • с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» Π±ΡƒΡ„Π΅Ρ€Π° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, bytes, bytearray, memoryview, array.array), ΠΏΡ€ΠΈ этом Π±Π°ΠΉΡ‚Ρ‹ ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΈΠ· исходного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π²ΠΎ вновь ΡΠΎΠ·Π΄Π°Π½Π½ΡƒΡŽ Π΄Π²ΠΎΠΈΡ‡Π½ΡƒΡŽ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ.

ΠŸΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ΠΈΠ΅ Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈΠ· Π±ΡƒΡ„Π΅Ρ€ΠΎΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Β  β€” это низкоуровнСвая опСрация, которая ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ привСдСния Ρ‚ΠΈΠΏΠΎΠ².

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ β„–2. Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Π±Π°ΠΉΡ‚ΠΎΠ² Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, хранящимися Π² массивС.

>>> import array
>>> numbers = array.array(‘h’, [-3, -2, -1, 0, 1, 2, 3]) # (1)
>>> octets = bytes(numbers) # (2)
>>> octets
b’\xfd\xff\xfe\xff\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00′ # (3)
>>>



>>> import array

>>> numbers = array.array(‘h’, [-3, -2, -1, 0, 1, 2, 3]) # (1)

>>> octets = bytes(numbers) # (2)

>>> octets

b’\xfd\xff\xfe\xff\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00′ # (3)

>>>

1. Код Ρ‚ΠΈΠΏΠ° β€˜h’ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ созданиС массива ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΡ… Ρ†Π΅Π»Ρ‹Ρ… (16-разрядных).
2. Π’ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ octets хранится копия Π±Π°ΠΉΡ‚ΠΎΠ², ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… составлСны числа Π² массивС numbers.
3. Π­Ρ‚ΠΎ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π½Π°Π΄Ρ†Π°Ρ‚ΡŒ Π±Π°ΠΉΡ‚ΠΎΠ², ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… сСмь ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΡ… Ρ†Π΅Π»Ρ‹Ρ… чисСл.

Π—Π°Ρ‡Π΅ΠΌ Π½ΡƒΠΆΠ½Ρ‹ Π±ΠΎΡ‚Ρ‹ Π² Π³Ρ€ΡƒΠΏΠΏΠ΅ Π’Πš? ΠŸΠΎΡ‡Π΅ΠΌΡƒ ΠΈΠ½ΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ Π»ΡƒΡ‡ΡˆΠ΅, Ρ‡Π΅ΠΌ люди? ΠŸΠΎΡ€Ρ‚Π°Π» https://pricesmm.com/ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΠ» Π½Π° ΠΊΠ°Π²Π΅Ρ€Π·Π½Ρ‹Π΅ вопросы ΠΈ выяснил, ΠΊΠ°ΠΊ Π½Π°ΠΊΡ€ΡƒΡ‚ΠΈΡ‚ΡŒ Π±ΠΎΡ‚ΠΎΠ² Π’ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚Π΅ Π·Π° дСньги ΠΈ Π±Π΅Π· Π·Π°Ρ‚Ρ€Π°Ρ‚. Для вас ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΈ чСстный ΠΎΠ±Π·ΠΎΡ€ всСх доступных способов, Π° Ρ‚Π°ΠΊΠΆΠ΅ условия ΠΈ сСкрСты, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠΈΡ‚ΡŒ процСсс.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° bytes ΠΈΠ»ΠΈ bytearray ΠΈΠ· Π±ΡƒΡ„Π΅Ρ€ΠΎΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ источника всСгда сопровоТдаСтся ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π±Π°ΠΉΡ‚ΠΎΠ².

Напротив, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ‚ΠΈΠΏΠ° memoryview ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Ρ€Π°Π·Π½Ρ‹ΠΌ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΌ структурам Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти.

Для извлСчСния структурированной ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΈΠ· Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π±Π΅ΡΡ†Π΅Π½Π½ΡƒΡŽ ΠΏΠΎΠ»ΡŒΠ·Ρƒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ struct.

Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎΠ΅ Π²ΠΈΠ΄Π΅ΠΎ для нашСй Π°ΡƒΠ΄ΠΈΡ‚ΠΎΡ€ΠΈΠΈ

Python | ΠΌΠ΅Ρ‚ΠΎΠ΄ bytes ()

ВзаимодСйствиС ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… обСспСчиваСтся языком Python с Π»Π΅Π³ΠΊΠΎΡΡ‚ΡŒΡŽ. Π­Ρ‚Π° ΡΡ‚Π°Ρ‚ΡŒΡ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π° Π½Π° Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€Π°Ρ†ΠΈΡŽ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ прСобразования Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… Π² bytes (), ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… для схСм кодирования.
byte () ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² нСизмСняСмый прСдставлСнный Π±Π°ΠΉΡ‚ΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΈ Π΄Π°Π½Π½Ρ‹Ρ….

Syntax : bytes(src, enc, err)

Parameters :
src : The source object which has to be converted
enc : The encoding required in case object is a string
err : Way to handle error in case the string conversion fails.

Returns :
Byte immutable object consisting of unicode 0-256 characters according to src type.
integer : Returns array of size initialized to null
iterable : Returns array of iterable size with elements equal to iterable elements( 0-256 )
string : Returns the encoded string acc. to enc and if encoding fails, performs action according
to err specified.
no arguments : Returns array of size 0.

Код β„–1: дСмонстрация byte () для Ρ†Π΅Π»Ρ‹Ρ… чисСл, none ΠΈ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ

Β Β 

a = 4

lis1 = [1, 2, 3, 4, 5]

Β Β 

print ("Byte conversion with no arguments : " + str(bytes()))Β 

Β Β 

print ("The integer conversion results in : "Β  + str(bytes(a)))

print ("The iterable conversion results in : "Β  + str(bytes(lis1)))

Π’Ρ‹Ρ…ΠΎΠ΄:

Byte conversion with no arguments : b''
The integer conversion results in : b'\x00\x00\x00\x00'
The iterable conversion results in : b'\x01\x02\x03\x04\x05'

ПовСдСниС Π±Π°ΠΉΡ‚ΠΎΠ² со строками

Π‘Π°ΠΉΡ‚Ρ‹ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ строку Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΈ для Π΅Π΅ выполнСния трСбуСтся схСма кодирования. НаиболСС Π²Π°ΠΆΠ½Ρ‹ΠΌ аспСктом этого являСтся ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибок Π² случаС сбоя кодирования, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… схСм ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ошибок:

String Error Handlers :
strict : Raises the default UnicodeDecodeError in case of encode failure.
ignore : Ignores the unencodable character and encodes the remaining string.
replace : Replaces the unencodable character with a β€˜?’.

Код β„– 2: дСмонстрация bytes () с использованиСм строки

Β Β 

str1 = 'GeeksfΓ–rGeeks'

Β Β 

print ("Byte conversion with ignore error : " +

Β Β Β Β Β Β str(bytes(str1, 'ascii', errors = 'ignore')))Β 

Β Β 

print ("Byte conversion with replace error : " +

Β Β Β Β Β Β str(bytes(str1, 'ascii', errors = 'replace')))Β 

Β Β 

print ("Byte conversion with strict error : " +

Β Β Β Β Β Β str(bytes(str1, 'ascii', errors = 'strict')))Β 

Π’Ρ‹Ρ…ΠΎΠ΄:

Byte conversion with ignore error : b'GeeksfrGeeks'
Byte conversion with replace error : b'Geeksf?rGeeks'

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅:

Traceback (most recent call last):
  File "/home/0458f7fae57c6f4102366356593842ef.py", line 15, in 
    print ("Byte conversion with strict error : " + str(bytes(str1, 'ascii', errors = 'strict'))) 
UnicodeEncodeError: 'ascii' codec can't encode character '\xd6' in position 6: ordinal not in range(128)

Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌΡ‹Π΅ посты:

Python | ΠΌΠ΅Ρ‚ΠΎΠ΄ bytes ()

0.00 (0%) 0 votes

Π‘Π°ΠΉΡ‚ ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΡ€ΠΎΡ‚ΠΈΠ² Π‘Ρ‚Ρ€ΠΎΠΊΠΈ Π² ΠŸΠΈΡ‚ΠΎΠ½Π΅

Π’ Python 2 ΠΈ str, ΠΈ Π±Π°ΠΉΡ‚Ρ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ΄Π½ΠΈΠΌΠΈ ΠΈ Ρ‚Π΅ΠΌΠΈ ΠΆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ typeByte, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π² Python 3 Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Π² Python 3, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой Β« ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π±Π°ΠΉΡ‚ΠΎΠ² Β» ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ Β« unicode Β» ΠΈΠ· Python 2. Однако Π΅ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠΉ Π² строках ΠΈ Π‘Π°ΠΉΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹. НСкоторыС ΠΈΠ· Π½ΠΈΡ… ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Ρ‹ Π½ΠΈΠΆΠ΅:
`

  • Π‘Π°ΠΉΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ β€” это ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π±Π°ΠΉΡ‚ΠΎΠ² , Π° строки β€” это ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ символов .
  • Π’Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ находятся Π² ΠΌΠ°ΡˆΠΈΠ½ΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅, строки β€” Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΡƒΠ΄ΠΎΠ±ΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅.
  • ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΌΠ°ΡˆΠΈΠ½ΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΌΠΈ, ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ нСпосрСдствСнно сохранСны Π½Π° дискС . ΠŸΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ Π²ΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ строки Π½ΡƒΠΆΠ΄Π°ΡŽΡ‚ΡΡ Π² ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ, ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ сохранСны Π½Π° дискС.

Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для прСобразования Π±Π°ΠΉΡ‚ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² String ΠΈ String Π² Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹.

ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

PNG, JPEG, MP3, WAV, ASCII, UTF-8 ΠΈ Ρ‚. Π”. Π―Π²Π»ΡΡŽΡ‚ΡΡ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ Ρ„ΠΎΡ€ΠΌΠ°ΠΌΠΈ кодирования. ΠšΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ° β€” это Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ для прСдставлСния Π°ΡƒΠ΄ΠΈΠΎ, ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, тСкста ΠΈ Ρ‚. Π”. Π’ Π±Π°ΠΉΡ‚Π°Ρ…. ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ строк Π² Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ называСтся ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ. Π­Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ тСкст ΠΌΠΎΠ³ Π±Ρ‹Ρ‚ΡŒ сохранСн Π½Π° дискС с использованиСм сопоставлСния с использованиСм ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² кодирования ASCII ΠΈΠ»ΠΈ UTF-8 .

Π­Ρ‚Π° Π·Π°Π΄Π°Ρ‡Π° достигаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ encode () . Π’ качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ° кодирования. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠ° UTF-8 .

Β Β 

a = 'GeeksforGeeks'

Β Β 

c = b'GeeksforGeeks'

Β Β 

d = a.encode('ASCII')

Β Β 

if (d==c):

Β Β Β Β print ("Encoding successful")

else : print ("Encoding Unsuccessful")

Π’Ρ‹Ρ…ΠΎΠ΄:

Encoding successful

Π”Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

Аналогично, Decoding β€” это процСсс для прСобразования ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Byte Π² String . Π­Ρ‚ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ с использованиСм decode () . Π‘Ρ‚Ρ€ΠΎΠΊΠ° Π±Π°ΠΉΡ‚ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π° ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² строку символов, Ссли Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅, какая ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ° использовалась для Π΅Π΅ кодирования. ΠšΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΌΠΈ процСссами.

Β Β 

a = 'GeeksforGeeks'

Β Β 

c = b'GeeksforGeeks'

Β Β 

d = c.decode('ASCII')

Β Β 

if (d==a):

Β Β Β Β print ("Decoding successful")

else : print ("Decoding Unsuccessful")

Π’Ρ‹Ρ…ΠΎΠ΄:

Decoding successful

Π­Ρ‚Π° ΡΡ‚Π°Ρ‚ΡŒΡ прСдоставлСна ΠœΠ°Π½Π΄ΠΆΠΈΡ‚ΠΎΠΌ Π‘ΠΈΠ½Π³Ρ…ΠΎΠΌ . Если Π²Ρ‹ ΠΊΠ°ΠΊ GeeksforGeeks ΠΈ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π±Ρ‹ внСсти свой Π²ΠΊΠ»Π°Π΄, Π²Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΡΡ‚Π°Ρ‚ΡŒΡŽ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ contribute.geeksforgeeks.org ΠΈΠ»ΠΈ ΠΏΠΎ ΠΏΠΎΡ‡Ρ‚Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ [email protected]. Π‘ΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ свою ΡΡ‚Π°Ρ‚ΡŒΡŽ, ΠΏΠΎΡΠ²Π»ΡΡŽΡ‰ΡƒΡŽΡΡ Π½Π° Π³Π»Π°Π²Π½ΠΎΠΉ страницС GeeksforGeeks, ΠΈ ΠΏΠΎΠΌΠΎΠ³ΠΈΡ‚Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠΌ Π²ΡƒΠ½Π΄Π΅Ρ€ΠΊΠΈΠ½Π΄Π°ΠΌ.

ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π°, ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ, Ссли Π²Ρ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚Π΅ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ ΠΈΠ»ΠΈ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΏΠΎ обсуТдаСмой Π²Ρ‹ΡˆΠ΅ Ρ‚Π΅ΠΌΠ΅.

Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌΡ‹Π΅ посты:

Π‘Π°ΠΉΡ‚ ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΡ€ΠΎΡ‚ΠΈΠ² Π‘Ρ‚Ρ€ΠΎΠΊΠΈ Π² ΠŸΠΈΡ‚ΠΎΠ½Π΅

0.00 (0%) 0 votes

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ Python

Если Π²Ρ‹ ΠΊΠΎΠ³Π΄Π°-Π»ΠΈΠ±ΠΎ писали ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ просто использовали Python, Π²Ρ‹, вСроятно, ΠΏΡ€ΠΈΠ²Ρ‹ΠΊΠ»ΠΈ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ исходного ΠΊΠΎΠ΄Π° Python; ΠΈΡ… ΠΈΠΌΠ΅Π½Π° Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π½Π° .py . Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΈΠ΄Π΅Π»ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ‚ΠΈΠΏ Ρ„Π°ΠΉΠ»Π° с ΠΈΠΌΠ΅Π½Π΅ΠΌ, Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΌΡΡ Π½Π° .pyc , ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡΠ»Ρ‹ΡˆΠ°Π»ΠΈ, Ρ‡Ρ‚ΠΎ это Ρ„Π°ΠΉΠ»Ρ‹ Β«Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π°Β» Python. (Π˜Ρ… Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ слоТнСС ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π² Python 3 — вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅, Ρ‡Ρ‚ΠΎ ΠΈ ваши Ρ„Π°ΠΉΠ»Ρ‹ .py , ΠΎΠ½ΠΈ ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ Π² ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ с ΠΈΠΌΠ΅Π½Π΅ΠΌ __pycache__ .) И, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Ρ‹ ΡΠ»Ρ‹ΡˆΠ°Π»ΠΈ, Ρ‡Ρ‚ΠΎ это своСго Ρ€ΠΎΠ΄Π° экономия Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, которая ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° исходного ΠΊΠΎΠ΄Π° Python ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ запускС.

Но ΠΏΠΎΠΌΠΈΠΌΠΎ Β«ΠΎ, это Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ PythonΒ», Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»ΠΈ Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ находится Π² этих Ρ„Π°ΠΉΠ»Π°Ρ… ΠΈ ΠΊΠ°ΠΊ Python ΠΈΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚?

Если Π½Π΅Ρ‚, Ρ‚ΠΎ сСгодня ваш счастливый дСнь! Π― расскаТу Π²Π°ΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ Python, ΠΊΠ°ΠΊ Python ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΅Π³ΠΎ для выполнСния вашСго ΠΊΠΎΠ΄Π° ΠΈ ΠΊΠ°ΠΊ Π·Π½Π°Π½ΠΈΠ΅ этого ΠΌΠΎΠΆΠ΅Ρ‚ Π²Π°ΠΌ ΠΏΠΎΠΌΠΎΡ‡ΡŒ.

Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Python

Python часто описываСтся ΠΊΠ°ΠΊ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ язык, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ваш исходный ΠΊΠΎΠ΄ транслируСтся Π² собствСнныС инструкции ЦП ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π½ΠΎ это Π²Π΅Ρ€Π½ΠΎ лишь отчасти.Python, ΠΊΠ°ΠΊ ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ языки, фактичСски ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ исходный ΠΊΠΎΠ΄ Π² Π½Π°Π±ΠΎΡ€ инструкций для Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹, Π° ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Python являСтся Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ этой Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹. Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ называСтся Β«Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ΠΎΠΌΒ».

Π˜Ρ‚Π°ΠΊ, Ρ‚Π΅ .pyc Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Python оставляСт Π±Π΅Π· внимания, Π½Π΅ просто Β«Π±ΠΎΠ»Π΅Π΅ быстрая» ΠΈΠ»ΠΈ «оптимизированная» вСрсия вашСго исходного ΠΊΠΎΠ΄Π°; это инструкции Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ машиной Python ΠΏΡ€ΠΈ запускС вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€.Π’ΠΎΡ‚ классичСский Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Β«Hello, World!Β» написано Π½Π° Python:

 

def hello ()
print (Β«Hello, World!Β»)

А Π²ΠΎΡ‚ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ½ прСвращаСтся (ΠΏΠ΅Ρ€Π΅Π²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π² ΡƒΠ΄ΠΎΠ±ΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ):

 

2 0 LOAD_GLOBAL 0 (ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ)
2 LOAD_CONST 1 ('Hello, World!')
4 CALL_FUNCTION 1

Если Π²Ρ‹ Π½Π°Π±Π΅Ρ€Π΅Ρ‚Π΅ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ hello () ΠΈ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ΡΡŒ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠΌ CPython для Π΅Π΅ запуска, Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ список Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Python Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚.Однако это ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ странно, поэтому Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π³Π»ΡƒΠ±ΠΆΠ΅ посмотрим, Ρ‡Ρ‚ΠΎ происходит.

Π’Π½ΡƒΡ‚Ρ€ΠΈ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ Python

CPython ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΌΠ°ΡˆΠΈΠ½Ρƒ Π½Π° основС стСка. Π’ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΠ½ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ Π½Π° структуры Π΄Π°Π½Π½Ρ‹Ρ… стСка (Π³Π΄Π΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Β«ΠΏΡ€ΠΎΡ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΒ» элСмСнт Β«Π½Π°Π²Π΅Ρ€Ρ…Β» структуры ΠΈΠ»ΠΈ Β«Π²Ρ‹Ρ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΒ» элСмСнт «свСрху»).

CPython ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‚Ρ€ΠΈ Ρ‚ΠΈΠΏΠ° стСков:

  1. Π‘Ρ‚Π΅ΠΊ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² . Π­Ρ‚ΠΎ основная структура Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Python. Он ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ элСмСнт — Β«Ρ„Ρ€Π΅ΠΉΠΌΒ» — для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ ниТняя Ρ‡Π°ΡΡ‚ΡŒ стСка являСтся Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ Π²Ρ…ΠΎΠ΄Π° Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ.ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ ΠΊΠ°Π΄Ρ€ Π² стСк Π²Ρ‹Π·ΠΎΠ²ΠΎΠ², ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ возвращаСтся, Π΅Π³ΠΎ ΠΊΠ°Π΄Ρ€ удаляСтся.
  2. Π’ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΊΠ°Π΄Ρ€Π΅ Π΅ΡΡ‚ΡŒ стСк ΠΎΡ†Π΅Π½ΠΊΠΈ (Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ стСком Π΄Π°Π½Π½Ρ‹Ρ… ). Π’ этом стСкС происходит Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Python, Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° Python состоит Π² основном ΠΈΠ· помСщСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² этот стСк, манипулирования ΠΈΠΌΠΈ ΠΈ ΠΈΡ… удалСния.
  3. Π’Π°ΠΊΠΆΠ΅ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΊΠ°Π΄Ρ€Π΅ Π΅ΡΡ‚ΡŒ стСка Π±Π»ΠΎΠΊΠΎΠ² . Π­Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Python для отслСТивания ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² структур управлСния: Ρ†ΠΈΠΊΠ»Ρ‹, ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ, /, ΠΊΡ€ΠΎΠΌΠ΅ Π±Π»ΠΎΠΊΠΎΠ², ΠΈ с Π±Π»ΠΎΠΊΠ°ΠΌΠΈ, всС Π·Π°ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ записи ΠΏΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒΡΡ Π² стСк Π±Π»ΠΎΠΊΠΎΠ², ΠΈ стСк Π±Π»ΠΎΠΊΠΎΠ² всплываСт всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π²Ρ‹ΠΉΡ‚ΠΈ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· этих структур.Π­Ρ‚ΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Python Π·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ Π±Π»ΠΎΠΊΠΈ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ Π² любой Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ continue ΠΈΠ»ΠΈ break ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ²Π»ΠΈΡΡ‚ΡŒ Π½Π° ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Π±Π»ΠΎΠΊ.

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ инструкций Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π° Python ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΡƒΡŽΡ‚ стСком ΠΎΡ†Π΅Π½ΠΊΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΊΠ°Π΄Ρ€Π° стСка Π²Ρ‹Π·ΠΎΠ²ΠΎΠ², хотя Π΅ΡΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ инструкции, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π΅Π»Π°ΡŽΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π²Π΅Ρ‰ΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ инструкциям ΠΈΠ»ΠΈ ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ стСком Π±Π»ΠΎΠΊΠΎΠ²).

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡ‡ΡƒΠ²ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ это, ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: my_function (my_variable, 2) .Python ΠΏΠ΅Ρ€Π΅Π²Π΅Π΄Π΅Ρ‚ это Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ· Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… инструкций Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π°:

  1. Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ LOAD_NAME , которая ΠΈΡ‰Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ my_function ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π΅Π³ΠΎ Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ стСка ΠΎΡ†Π΅Π½ΠΊΠΈ
  2. Π•Ρ‰Π΅ ΠΎΠ΄Π½Π° инструкция LOAD_NAME , Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ my_variable ΠΈ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π΅Π΅ ΠΏΠΎΠ²Π΅Ρ€Ρ… стСка ΠΎΡ†Π΅Π½ΠΊΠΈ
  3. Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ LOAD_CONST для помСщСния Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ цСлочислСнного значСния 2 Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ стСка ΠΎΡ†Π΅Π½ΠΊΠΈ
  4. A CALL_FUNCTION инструкция

Команда CALL_FUNCTION Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ 2, Ρ‡Ρ‚ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Python Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ Π΄Π²Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΈΠ· Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ части стСка; Ρ‚ΠΎΠ³Π΄Π° вызываСмая функция Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Π²Π΅Ρ€Ρ…Ρƒ, ΠΈ Π΅Π΅ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ (для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ с ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ другая инструкция — CALL_FUNCTION_KW , Π½ΠΎ с Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹, ΠΈ Ρ‚Ρ€Π΅Ρ‚ΡŒΡ инструкция, CALL_FUNCTION_EX , ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ распаковку Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² * ΠΈΠ»ΠΈ ** ).Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Python ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ всС это, ΠΎΠ½ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ Π½ΠΎΠ²Ρ‹ΠΉ Ρ„Ρ€Π΅ΠΉΠΌ Π² стСкС Π²Ρ‹Π·ΠΎΠ²ΠΎΠ², Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ для Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ my_function Π²Π½ΡƒΡ‚Ρ€ΠΈ этого Ρ„Ρ€Π΅ΠΉΠΌΠ°. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ это Π±ΡƒΠ΄Π΅Ρ‚ сдСлано, ΠΊΠ°Π΄Ρ€ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ ΠΈΠ· стСка Π²Ρ‹Π·ΠΎΠ²ΠΎΠ², Π° Π² исходном ΠΊΠ°Π΄Ρ€Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ my_function Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ΠΎ ΠΏΠΎΠ²Π΅Ρ€Ρ… стСка ΠΎΡ†Π΅Π½ΠΊΠΈ.

Доступ ΠΈ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π° Python

Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с этим, ΠΌΠΎΠ΄ΡƒΠ»ΡŒ dis Π² стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Python Π²Π°ΠΌ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚; ΠΌΠΎΠ΄ΡƒΠ»ΡŒ dis прСдоставляСт «дизассСмблСр» для Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π° Python, Ρ‡Ρ‚ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΡƒΠ΄ΠΎΠ±ΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΠΉ вСрсии ΠΈ поиск Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… инструкций Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π°.ДокумСнтация для модуля dis рассматриваСт Π΅Π³ΠΎ содСрТимоС ΠΈ прСдоставляСт ΠΏΠΎΠ»Π½Ρ‹ΠΉ список инструкций Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π° вмСстС с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π΄Π΅Π»Π°ΡŽΡ‚ ΠΈ ΠΊΠ°ΠΊΠΈΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΎΠ½ΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚.

НапримСр, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ список Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π° для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ hello () , ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π²Ρ‹ΡˆΠ΅, я Π²Π²Π΅Π» Π΅Π³ΠΎ Π² ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Python, Π° Π·Π°Ρ‚Π΅ΠΌ запустил:

 

Ѐункция dis.dis () Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΈΠ·Π°ΡΡΠ΅ΠΌΠ±Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΌΠ΅Ρ‚ΠΎΠ΄, класс, ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, скомпилированный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΊΠΎΠ΄Π° Python ΠΈΠ»ΠΈ строковый Π»ΠΈΡ‚Π΅Ρ€Π°Π», содСрТащий исходный ΠΊΠΎΠ΄, ΠΈ Ρ€Π°ΡΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ Π²Π΅Ρ€ΡΠΈΡŽ, ΡƒΠ΄ΠΎΠ±Π½ΡƒΡŽ для чтСния.Π•Ρ‰Π΅ ΠΎΠ΄Π½Π° удобная функция Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ dis distb () . Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΅ΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ трассировки Python ΠΈΠ»ΠΈ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ послС возникновСния ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, ΠΈ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΈΠ·Π°ΡΡΠ΅ΠΌΠ±Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ°ΠΌΡƒΡŽ Π²Π΅Ρ€Ρ…Π½ΡŽΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² стСкС Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Π²ΠΎ врСмя ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, Ρ€Π°ΡΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ свой Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ ΠΈ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ, которая Π²Ρ‹Π·Π²Π°Π»Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅.

Π’Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° скомпилированныС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Python создаСт для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ этих ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΊΠΎΠ΄Π°.Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ hello () :

 

>>> hello .__ code__
<ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΊΠΎΠ΄Π° hello at 0x104e46930, Ρ„Π°ΠΉΠ» "", строка 1>
>>> hello .__ code __. Co_consts
(None, 'Hello, World!')
>>> hello .__ code __. co_varnames
()
>>> ΠΏΡ€ΠΈΠ²Π΅Ρ‚ .__ code __. co_names
('print',)

ΠšΠΎΠ΄ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ доступСн ΠΊΠ°ΠΊ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ __code__ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ нСсСт нСсколько Π²Π°ΠΆΠ½Ρ‹Ρ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ²:

  • co_consts — ΠΊΠΎΡ€Ρ‚Π΅ΠΆ Π»ΡŽΠ±Ρ‹Ρ… Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ Π² Ρ‚Π΅Π»Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
  • co_varnames — это ΠΊΠΎΡ€Ρ‚Π΅ΠΆ, содСрТащий ΠΈΠΌΠ΅Π½Π° Π»ΡŽΠ±Ρ‹Ρ… Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π² Ρ‚Π΅Π»Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
  • co_names — это ΠΊΠΎΡ€Ρ‚Π΅ΠΆ Π»ΡŽΠ±Ρ‹Ρ… Π½Π΅Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠΌΠ΅Π½, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΅ΡΡ‚ΡŒ ссылки Π² Ρ‚Π΅Π»Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

МногиС инструкции Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π° — особСнно Ρ‚Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‚ значСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½Ρ‹ Π² стСк ΠΈΠ»ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ значСния Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°Ρ…, — ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ индСксы Π² этих ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ°Ρ… Π² качСствС своих Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ².

Π˜Ρ‚Π°ΠΊ, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ½ΡΡ‚ΡŒ список Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ hello () :

  1. LOAD_GLOBAL 0 : ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Python ΠΈΡΠΊΠ°Ρ‚ΡŒ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ссылаСтся имя с индСксом 0 ΠΈΠ· co_names (Ρ‡Ρ‚ΠΎ являСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ print ), ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π΅Π³ΠΎ Π² стСк ΠΎΡ†Π΅Π½ΠΊΠΈ
  2. LOAD_CONST 1 : ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ с индСксом 1 ΠΈΠ· co_consts ΠΈ Ρ‚ΠΎΠ»ΠΊΠ°Π΅Ρ‚ Π΅Π³ΠΎ (Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ с индСксом 0 — это Π»ΠΈΡ‚Π΅Ρ€Π°Π» None , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ присутствуСт Π² co_consts , ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Python ΠΈΠΌΠ΅ΡŽΡ‚ нСявноС Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ НСт , Ссли Π½Π΅ достигнуто явноС return )
  3. CALL_FUNCTION 1 : ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Python Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ; Π΅ΠΌΡƒ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ ΠΈΠ· стСка ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, Ρ‚ΠΎΠ³Π΄Π° новая Π²Π΅Ρ€ΡˆΠΈΠ½Π° стСка Π±ΡƒΠ΄Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ для Π²Ρ‹Π·ΠΎΠ²Π°.

«НСобработанный» Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ — ΠΊΠ°ΠΊ Π±Π°ΠΉΡ‚Ρ‹, Π½Π΅Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹Π΅ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠΎΠΌ — Ρ‚Π°ΠΊΠΆΠ΅ доступСн Π² ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ ΠΊΠ°ΠΊ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ co_code . Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ список dis.opname для поиска ΠΈΠΌΠ΅Π½ инструкций Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π° ΠΏΠΎ ΠΈΡ… дСсятичным значСниям Π±Π°ΠΉΡ‚ΠΎΠ², Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Π΄ΠΈΠ·Π°ΡΡΠ΅ΠΌΠ±Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ.

ИспользованиС Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π°

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π΄ΠΎΡ‡ΠΈΡ‚Π°Π»ΠΈ Π΄ΠΎ этого мСста, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ: Β«Π₯ΠΎΡ€ΠΎΡˆΠΎ, я Π΄ΡƒΠΌΠ°ΡŽ, это ΠΊΡ€ΡƒΡ‚ΠΎ, Π½ΠΎ Π² Ρ‡Π΅ΠΌ практичСская Ρ†Π΅Π½Π½ΠΎΡΡ‚ΡŒ этого знания?Β» ΠžΡΡ‚Π°Π²ΠΈΠ² Π² сторонС Π»ΡŽΠ±ΠΎΠΏΡ‹Ρ‚ΡΡ‚Π²ΠΎ Ρ€Π°Π΄ΠΈ Π»ΡŽΠ±ΠΎΠΏΡ‹Ρ‚ΡΡ‚Π²Π°, ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π° Python ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡΡ….

Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ выполнСния Python ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π²Π°ΠΌ ΠΏΠΎΠ½ΡΡ‚ΡŒ свой ΠΊΠΎΠ΄. Π›ΡŽΠ΄ΡΠΌ нравится ΡˆΡƒΡ‚ΠΈΡ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ C являСтся своСго Ρ€ΠΎΠ΄Π° Β«ΠΏΠΎΡ€Ρ‚Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ ассСмблСром», Π³Π΄Π΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ…ΠΎΡ€ΠΎΡˆΠΎ Π΄ΠΎΠ³Π°Π΄Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΎ Ρ‚ΠΎΠΌ, Π² ΠΊΠ°ΠΊΠΈΠ΅ ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹Π΅ инструкции прСвратится ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ исходного ΠΊΠΎΠ΄Π° C. ПониманиС Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π° даст Π²Π°ΠΌ Ρ‚Π΅ ΠΆΠ΅ возмоТности, Ρ‡Ρ‚ΠΎ ΠΈ Π² Python — Ссли Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, Π² ΠΊΠ°ΠΊΠΎΠΉ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ прСвращаСтся ваш исходный ΠΊΠΎΠ΄ Python, Π²Ρ‹ смоТСтС ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ обоснованныС Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Π΅Π³ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.

Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π° — ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ способ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ Π½Π° вопросы ΠΎ Python.НапримСр, я часто Π²ΠΈΠΆΡƒ, ΠΊΠ°ΠΊ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠ΅ программисты Python Π·Π°Π΄Π°ΡŽΡ‚ΡΡ вопросом, ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΎΠ΄Π½ΠΈ конструкции быстрСС Π΄Ρ€ΡƒΠ³ΠΈΡ… (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΡ‡Π΅ΠΌΡƒ {} быстрСС, Ρ‡Π΅ΠΌ dict () ). Π—Π½Π°Π½ΠΈΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ Python, ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π²Π°ΠΌ Π½Π°ΠΉΡ‚ΠΈ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹ (ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅: dis.dis ("{}") ΠΏΡ€ΠΎΡ‚ΠΈΠ² dis.dis ("dict ()") ).

НаконСц, ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π° ΠΈ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Python выполняСт Π΅Π³ΠΎ, Π΄Π°Π΅Ρ‚ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ взгляд Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Π²ΠΈΠ΄ программирования, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ программисты Python Π½Π΅ часто Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ΡΡ: ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° основС стСка.Если Π²Ρ‹ ΠΊΠΎΠ³Π΄Π°-Π»ΠΈΠ±ΠΎ использовали стСк-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ язык, Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠ°ΠΊ FORTH ΠΈΠ»ΠΈ Factor, это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ старая Π½ΠΎΠ²ΠΎΡΡ‚ΡŒ, Π½ΠΎ Ссли Π²Ρ‹ Π½Π΅ Π·Π½Π°ΠΊΠΎΠΌΡ‹ с этим ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠΌ, ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π° Python ΠΈ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π΅Π³ΠΎ стСк-ориСнтированная модСль программирования, — это изящная Π·Π°Π΄Π°Ρ‡Π°. способ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ свои знания Π² области программирования.

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Π°

Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡƒΠ·Π½Π°Ρ‚ΡŒ большС ΠΎ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π΅ Python, Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ машинС Python ΠΈ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚, я Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ эти рСсурсы:


Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ большС, посСтитС Π΄ΠΎΠΊΠ»Π°Π΄ ДТСймса Π‘Π΅Π½Π½Π΅Ρ‚Π° «НСмного ΠΎ Π±Π°ΠΉΡ‚Π°Ρ…: ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π° PythonΒ» Π½Π° PyCon Cleveland 2018.

.

ИспользованиС Python Как я ΠΌΠΎΠ³Ρƒ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π±ΠΈΡ‚Ρ‹ Π² Π±Π°ΠΉΡ‚Π°Ρ…?

ΠŸΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ стСка

  1. Около
  2. ΠŸΡ€ΠΎΠ΄ΡƒΠΊΡ‚Ρ‹

  3. Для ΠΊΠΎΠΌΠ°Π½Π΄
  1. ΠŸΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ стСка
    ΠžΠ±Ρ‰Π΅ΡΡ‚Π²Π΅Π½Π½Ρ‹Π΅ вопросы ΠΈ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹

  2. ΠŸΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ стСка для ΠΊΠΎΠΌΠ°Π½Π΄
    Π“Π΄Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΈ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈ дСлятся частными знаниями с ΠΊΠΎΠ»Π»Π΅Π³Π°ΠΌΠΈ

  3. Вакансии
    ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ связанныС с Π½ΠΈΠΌ тСхничСскиС возмоТности ΠΊΠ°Ρ€ΡŒΠ΅Ρ€Π½ΠΎΠ³ΠΎ роста

  4. Π’Π°Π»Π°Π½Ρ‚
    НанимайтС тСхничСских спСциалистов ΠΈ создавайтС свой Π±Ρ€Π΅Π½Π΄ работодатСля

  5. Π Π΅ΠΊΠ»Π°ΠΌΠ°
    ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ ΠΊ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ ΠΈ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³Π°ΠΌ со всСго ΠΌΠΈΡ€Π°

  6. О компании

Загрузка…

.

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *