W tym tutorialu poznamy mechanizm formatowania stringów. Ciąg f to najlepszy sposób na sformatowanie ciągu. Styl formatowania ciągu sprawia, że ciąg jest bardziej czytelny, zwięzły i mniej podatny na błędy. Jest także szybszy od drugiego.
Zanim zagłębimy się w ten temat, najpierw omówimy techniki stosowane przed struną f.
Stare formatowanie ciągów w Pythonie
Istnieją dwa główne sposoby formatowania ciągu: % - formatowanie i str.format(). Obie metody mają jednak pewne ograniczenia. Przedstawmy krótko te metody.
1,% - formatowanie
Jest to tradycyjny sposób formatowania ciągu, ale dokumentacja zaleca tę metodę, która zawiera następującą instrukcję.
„Opisane tutaj operacje formatowania wykazują różnorodne dziwactwa, które prowadzą do kilku typowych błędów (takich jak nieprawidłowe wyświetlanie krotek i słowników).
Używanie nowszych sformatowanych literałów łańcuchowych lub str.format() interfejs pomaga uniknąć tych błędów.' - Oficjalna dokumentacja .
Jak używać% - formatowanie
Możemy wykonać wbudowaną operację za pomocą operatora %. Rozumiemy następujący przykład.
wzorzec projektowy Java
student = 'Michel' 'Hello, %s.' % student
Wyjście:
Hello Michel
Możemy również użyć krotki do przechowywania wielu zmiennych. Zobaczmy następujący przykład.
name = 'Sharma' age = 24 'Hello, %s. You are %s.' % (name, age)
Wyjście:
Hello Sharma You are 24.
Dlaczego nie zaleca się formatowania %
Ponieważ w miarę zwiększania zmiennej i wydłużania łańcucha, nasz kod staje się znacznie mniej czytelny. Kod wygląda niechlujnie. Zobaczmy następujący przykład.
Przykład -
first_name = 'Steve' last_name = 'Rogers' age = 70 profession = 'Superhero' group = 'Marvel? print(''Hello, %s %s. Your age is %s. You are a %s. You were a member of %s.' %(first_name, last_name, age, profession)')
Wyjście:
Hello, Steve Rogers. Your age is 70. You are a Superhero. You were a member of Marvel.
Jak widać w powyższym kodzie, kod stał się trudny do odczytania i bardziej podatny na błędy. Dlatego ten sposób formatowania ciągu nie jest dobry.
Metoda 2.str.format().
Jest to kolejny popularny sposób formatowania ciągu wprowadzony w Pythonie 2.6. Zobaczmy, jak możemy to wykorzystać.
Jak korzystać ze str.format()
Jest to ulepszenie formatowania procentowego. Przypomina to normalną wbudowaną funkcję wywoływaną na obiekcie i konwertowanie obiektu na ciąg znaków.
Zobaczmy następujący przykład.
Przykład -
first_name = 'Mathew' last_name = 'Zukerburg' age = 45 print('Hello, {}. You are {}.'.format(name, age)')
Aby uzyskać dostęp do elementu słownika w metodzie format, możemy przekazać klucz w metodzie format().
person = {'name': 'Peter', 'age': 17} 'Hello, {name}. You are {age}.'.format(name=person['name'], age=person['age'])
Wyjście:
Hello Peter, You are 17
Dlaczego metoda str.format() nie jest zalecana?
Metoda str.format() jest znacznie wydajniejsza niż metoda %-format, ale nadal może być dość gadatliwa, gdy mamy do czynienia z wieloma parametrami.
Metoda strun F
Jest to nowy mechanizm formatowania ciągów wprowadzony przez PEP 498. Jest również znany jako interpolacja ciągów literalnych lub częściej jako ciągi F (znak f poprzedzający literał ciągu). Głównym celem tego mechanizmu jest ułatwienie interpolacji.
obiektywna Java
Kiedy poprzedzamy ciąg literą „F”, ciąg ten sam staje się ciągiem f. Ciąg f można sformatować w podobny sposób jak ciąg str.format() metoda. Ciąg F oferuje wygodny sposób osadzania wyrażeń Pythona w literałach łańcuchowych w celu formatowania.
Przykład -
# Python3 program introducing f-string val = 'Geeks' print(f'{val}for{val} is a portal for {val}.') name = 'Tushar' age = 23 print(f'Hello, My name is {name} and I'm {age} years old.')
Wyjście:
Hello, My name is Tushar and I'm 28 years old.
W powyższym kodzie użyliśmy ciągu f do sformatowania ciągu. Ocenia w czasie wykonywania; możemy w nich umieścić wszystkie prawidłowe wyrażenia Pythona.
Możemy go użyć w jednym stwierdzeniu.
print(f'{2 * 30})'
Wyjście:
60
Moglibyśmy jednak użyć funkcji.
def upercase(input): return input.uper() name = 'Sachin Tendulkar' f'{upercase(name)} is great.'
Wyjście:
Sachin Tendulkar is great
Ciąg f może być również używany z obiektem klasy. Rozumiemy następujący przykład.
Przykład -
class Actor: def __init__(self, first_name, last_name, movie): self.first_name = first_name self.last_name = last_name self.movie = movie def __str__(self): return f'{self.first_name} {self.last_name}'s superhit movie is {self.movie}.' def __repr__(self): return f'{self.first_name} {self.last_name} {self.movie}. Superhi!' ac = Actor('Keenu', 'Reevs', 'Matrix') print(f'{ac}')
Wyjście:
Keenu Reevs's superhit movie is Matrix.
Wyjaśnienie -
W powyższym kodzie użyliśmy funkcji __str__() i __repr__(), reprezentujących obiekt w postaci ciągu znaków. Musimy zatem uwzględnić co najmniej jedną z tych metod w definicji klasy. Ciąg f będzie korzystał z metody __str__(); możemy również użyć funkcji __repr__(), dołączając flagę konwersji! R.
print(f'{ac}') print(f'{ac}'!r)
Wyjście:
Keenu Reevs's superhit movie is Matrix. Keenu Reevs Matrix Superhit
Ciąg F w słowniku
Musimy zachować ostrożność podczas pracy z kluczami słownikowymi wewnątrz łańcucha f. Istnieje inny cytat dotyczący używania kluczy słownika i ciągu f. Rozumiemy następujący przykład.
Przykład -
detail = {'name': 'John', 'age': 19} print(f'{detail['name']} is {detail['age']} years old.')
Wyjście:
John is 19 years old.
Poniższa metoda nie jest dozwolona w przypadku słownika.
Przykład -
detail = {'name': 'John', 'age': 19} print(f'{detail['name']} is {detail['age']} years old.')
Wyjście:
File '', line 2 print(f'{detail['name']} is {detail['age']} years old.') ^ SyntaxError: invalid syntax
Jak widać w powyższym kodzie, zamieniamy podwójny cudzysłów na pojedynczy cudzysłów, co powoduje wyświetlenie błędu.
Prędkość
Powodem dostosowania tego stylu formatowania jest jego szybkość. Ciąg f ocenia w czasie wykonywania, a nie wartości stałe. Osadza wyrażenie w literałach łańcuchowych, używając minimalnej składni. Jest szybki, ponieważ ocenia w czasie wykonywania, a nie stałą wartość.
Zobaczmy następujące porównanie ciągów.
Przykład 1:
import timeit print(timeit.timeit('''name = 'Sachin' age = 74 '%s is %s.' % (name, age)''', number = 10000))
Wyjście:
0.0022497819736599922
Przykład - 2:
import timeit print(timeit.timeit('''name = 'Mathew' age = 40 '{} is {}.'.format(name, age)''', number = 10000))
Wyjście:
0.0025783719611354172
Przykład - 3:
import timeit print(timeit.timeit('''name = 'Rockey' age = 74 f'{name} is {age}.'''', number = 10000))
Wyjście:
metoda podciąg Java
0.0019360429723747075
Jak możemy zaobserwować, ciąg f znajduje się na górze listy.
Aparat ortodontyczny
Aby w kodzie pojawiały się nawiasy klamrowe, należy użyć podwójnych cudzysłowów w następujący sposób. Rozumiemy następujący przykład.
Przykład -
a b c liczby
f'{{70 + 40}}'
Wyjście:
{70 + 40}
Jeśli użyjemy potrójnych nawiasów klamrowych, w naszym ciągu zostaną wyświetlone pojedyncze nawiasy klamrowe. Rozumiemy następujący przykład.
Przykład -
f'{{{90 + 4}}}'
Wyjście:
{94}
Możemy wyświetlić więcej nawiasów, jeśli użyjemy więcej niż potrójnych nawiasów klamrowych.
Przykład -
f'{{{{70 + 4}}}}'
Wyjście:
{{70 + 4}}
Ukośniki odwrotne
Możemy użyć znaków ucieczki odwrotnego ukośnika w części ciągu f-stringu. Nie możemy jednak używać ukośników odwrotnych do ucieczki w części wyrażającej ciągu f. Rozumiemy następujący przykład.
Przykład -
f'{'Medric Pacalo'}' File '', line 1 f'{'Medric Pacalo'}'
Wyjście:
SyntaxError: f-string expression part cannot include a backslash
Komentarze wbudowane
W wyrażeniu nie możemy umieścić symbolu #. Spowoduje to błąd składniowy. Rozumiemy następujący przykład.
Przykład -
f'Tony is {10 * 73 #Hate this!}.' f'Tonyr is {2 * 37 #Hate this!}.'
Wyjście:
SyntaxError: f-string expression part cannot include '#'
Wniosek
Możemy użyć dowolnej metody z trzech, ale metoda f-string zapewnia bardziej zwięzły, czytelny i wygodny sposób. Jest szybszy i mniej podatny na błędy. Wyjaśniliśmy prawie każdy możliwy scenariusz off-stringowy i dlaczego warto rozważyć to podejście w programowaniu.