Syntax error invalid syntax perhaps you forgot a comma

Python's "invalid syntax" error message comes up often, especially when you're first learning Python. What usually causes this error and how can you fix it?

It’s a sadly unhelpful error message and it’s one that you’ll see quite often when learning Python.

What does SyntaxError: invalid syntax mean?
What is Python trying to tell you with this error and how can you fix your code to make Python happy?

What is a SyntaxError in Python?

This is Python’s way of saying «I don’t understand you».
Python knows that what you’ve typed isn’t valid Python code but it’s not sure what advice to give you.

When you’re lucky, your SyntaxError will have some helpful advice in it:

$ python3 greet.py
  File "/home/trey/greet.py", line 10
    if name == "Trey"
                     ^
SyntaxError: expected ':'

But if you’re unlucky, you’ll see the message invalid syntax with nothing more:

$ python3.9 greet.py
  File "/home/trey/greet.py", line 4
    name
    ^
SyntaxError: invalid syntax

This error message gives us no hints as to what might be going on outside of a line number and a bit of highlighting indicating where Python thinks the error occurred.

Causes of SyntaxError: invalid syntax

What are the likely causes of this mysterious error message?

When my Python students hit this error, the most likely causes are typically:

  1. Missing a colon (:) at the end of a line or mixing up other symbols
  2. Missing opening or closing parentheses (()), brackets ([]), braces ({}), or quotes ("")
  3. Misspelled or missing keywords or mistyping syntax within a block or expression
  4. Attempting to use a reserved keyword as a variable name
  5. Incorrectly indented code or other whitespace errors
  6. Treating statements like expressions
  7. Copying Python code into the REPL or copying from the REPL into a Python file

That’s a lot of options and they’re not the only options.
How should you approach fixing this problem?

Fixing SyntaxError: invalid syntax

The first step in fixing SyntaxErrors is narrowing down the problem.

I usually take the approach of:

  1. Note the line number and error message from the traceback, keeping in mind that both of these just guesses that Python’s making
  2. Working through the above list of common causes
  3. Attempting to read the code as Python would, looking for syntax mistakes
  4. Narrowing down the problem by removing blocks of code that I suspect may be the culprit

It’s easier to address that dreaded SyntaxError: invalid syntax exception when you’re familiar with its most common causes.
Let’s attempt to build up our intuitions around SyntaxError: invalid syntax by touring the common causes of this error message.

Upgrading Python improves error messages

Before diving into specific errors, note that upgrading your Python version can drastically improve the helpfulness of common error messages.

Take this error message:

$ python3 square.py
  File "/home/trey/square.py", line 2
    return [
    ^
SyntaxError: invalid syntax

On Python 3.10 it looks considerably different:

$ python3.10 square.py
  File "/home/trey/square.py", line 1
    def square_all(numbers:
                  ^
SyntaxError: '(' was never closed

We’re running the same square.py file in both cases:

def square_all(numbers:
    return [
        n**2
        for n in numbers
    ]

But Python 3.10 showed a much more helpful message: the line number, the position, and the error message itself are all much clearer for many unclosed parentheses and braces on Python 3.10 and above.

The dreaded missing colon is another example.
Any expression that starts a new block of code needs a : at the end.

Here’s the error that Python 3.9 shows for a missing colon:

$ python3 greet.py
  File "/home/trey/greet.py", line 10
    if name == "Trey"
                     ^
SyntaxError: invalid syntax

And here’s the same error in Python 3.10:

$ python3 greet.py
  File "/home/trey/greet.py", line 10
    if name == "Trey"
                     ^
SyntaxError: expected ':'

Much more helpful, right?
It’s still a SyntaxError exception, but the message is much clearer than simply invalid syntax.

Python 3.10 also includes friendlier error messages when you use = where you likely meant ==:

>>> name = "Trey"
>>> if name = "Trey":
  File "<stdin>", line 1
    if name = "Trey":
       ^^^^^^^^^^^^^
SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?

Newer Python versions include more helpful error messages for missing commas, inline if expressions, unclosed braces/brackets/parentheses, and more.

If you have the ability to run your code on a newer version of Python, try it out.
It might help you troubleshoot your syntax errors more effectively.

Count your parentheses

Forgetting closing parentheses, brackets, and braces is also a common source of coding errors.

Fortunately, recent Python versions have started noting unclosed brackets in their SyntaxError messages.

When running this code:

def colors():
    c = ['red',
        'blue',
    return c

Python 3.9 used to show simply invalid syntax:

$ python3.9 colors.py
  File "/home/trey/colors.py", line 4
    return c
    ^
SyntaxError: invalid syntax

But Python 3.10 shows a more helpful error message:

$ python3.10 colors.py
  File "/home/trey/colors.py", line 2
    c = ['red',
        ^
SyntaxError: '[' was never closed

But sometimes Python can get a little confused when guessing the cause of an error.
Take this populate.py script:

import random
import names

random_list=["a1","a2","a3","b1","b2","b3","c1","c2","c3"]

with open("one.txt","w+") as one, 
     open("two.txt","w+") as two, 
     open("three.txt","w+") as three:
      for i in range(0,3):
          one.write("%sn" "%s" % (names.get_first_name(),
              random.choice(random_list))
          two.write("%sn" "%s" % (names.get_first_name(),
              random.choice(random_list))
          three.write("%sn" "%s" % (names.get_first_name(),
              random.choice(random_list))

When running this script, Python 3.10 shows this error message:

$ python3.10 populate.py
  File "/home/trey/populate.py", line 9
    one.write("%sn" "%s" %
              ^^^^^^^^^^^^^
SyntaxError: invalid syntax. Perhaps you forgot a comma?

The problem is that all 3 of those write method calls are missing closing parentheses.

Count your parentheses!

Many code editors highlight matching parentheses, brackets, and braces (when your cursor is at an opening parentheses the closing one will change color).
Use your code editor to see if each pair of parenthesis matches up properly (and that the one in matches seems correct).

Misspelled, missing, or misplaced keywords

Can you see what’s wrong with this line of code?

>>> drf sum_of_squares(numbers):
  File "<stdin>", line 1
    drf sum_of_squares(numbers):
        ^
SyntaxError: invalid syntax

We were trying to define a function, but we misspelled def as drf.
Python couldn’t figure out what we were trying to do, so it showed us that generic invalid syntax message.

What about this one?

>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> squares = [n**2 for numbers]
  File "<stdin>", line 1
    squares = [n**2 for numbers]
                               ^
SyntaxError: invalid syntax

Python’s pointing to the end of our comprehension and saying there’s a syntax error.
But why?

Look a bit closer.
There’s something missing in our comprehension.

We meant type this:

>>> numbers = [2, 1, 3, 4, 7, 11, 18]
>>> squares = [n**2 for n in numbers]

We were missing the in in our comprehension’s looping component.

Misspelled keywords and missing keywords often result in that mysterious invalid syntax, but extra keywords can cause trouble as well.

You can’t use reserved words as variable names in Python:

>>> class = "druid"
  File "<stdin>", line 1
    class = "druid"
          ^
SyntaxError: invalid syntax

Python sees that word class and it assumes we’re defining a class.
But then it sees an = sign and gets confused and can’t tell what we’re trying to do, so it throws its hands in the error and yells invalid syntax!

This one is a bit more mysterious:

>>> import urlopen from urllib.request
  File "<stdin>", line 1
    import urlopen from urllib.request
                   ^^^^
SyntaxError: invalid syntax

That looks right, doesn’t it?
So what’s the problem?

In Python the importfrom syntax is actually a fromimport syntax.
We meant to write this instead:

>>> from urllib.request import urlopen

Watch out for misspelled keywords, missing keywords, and re-arranged syntax.
Also be sure not to use reserved words as variable names (e.g. class, return, and import are invalid variable names).

Subtle spacing problems

Can you see what’s wrong in this code?

>>> class Thing:
...     def __init _(self, name, color):
  File "<stdin>", line 2
    def __init _(self, name, color):
               ^
SyntaxError: invalid syntax

Notice the extra space in the function name (__init_ _ instead of __init__)?

Can you identify what’s wrong in this line?

>>> class Thing:
...     def__init__(self, name, color):
  File "<stdin>", line 2
    def__init__(self, name, color):
                                  ^
SyntaxError: invalid syntax

This one might be harder to spot.

Everything on that line is correct except that there’s no space between def and __init__.

When one space character is valid, you can usually use more than one space character as well.
But adding an extra space in the middle of an identifier or removing spaces where there should be spaces can often cause syntax errors.

Forgotten quotes and extra quotes

If you code infrequently, you likely forget to put quotes around your strings often.
This is a very common mistake, so rest assured that you’re not alone!

Forgotten quotes can sometimes result in this cryptic invalid syntax error message:

>>> print(Four!) if n
  File "<stdin>", line 1
    print(Four!) if n
              ^
SyntaxError: invalid syntax

Be careful with quotes within quotes:

>>> question = 'What's that?'
  File "<stdin>", line 1
    question = 'What's that?'
                     ^
SyntaxError: invalid syntax

You’ll need to switch to a different quote style (using double quotes for example) or escape those quotes.

Mixing up your symbols

Sometimes your syntax might look correct but you’ve actually confused one bit of syntax for another common bit of syntax.

That’s what happened here:

>>> things = {duck='purple', monkey='green'}
  File "<stdin>", line 1
    things = {duck='purple', monkey='green'}
              ^^^^^^^^^^^^^
SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?

We’re trying to make a dictionary and we’ve accidentally used = instead of : to separate our key-value pairs.

Here’s another dictionary symbol mix up:

>>> states = [
...     'Oregon': 'OR',
  File "<stdin>", line 2
    'Oregon': 'OR',
            ^
SyntaxError: invalid syntax

It looks like we’re trying to define a dictionary, but we started with an open square bracket ([) instead of an open curly brace ({).

Another common syntax mistake is missing periods:

  File "/home/trey/file_info.py", line 15
    size = path.stat()st_size
                      ^^^^^^^
SyntaxError: invalid syntax

We’re trying to access the st_size attribute on the object returned from that path.stat() call, but we’ve forgot to put a . before st_size.

Sometimes syntax errors are due to characters being swapped around:

>>> name = "Trey"
>>> name[]0
  File "<stdin>", line 1
    name[]0
         ^
SyntaxError: invalid syntax

And some syntax errors are due to extra symbols you didn’t intend to write:

>>> name = "Trey"
>>> name.lower.()
  File "<stdin>", line 1
    name.lower.()
               ^
SyntaxError: invalid syntax

We wrote an extra . before our parentheses above.

Indentation errors in disguise

Sometimes a SyntaxError is actually an indentation error in disguise.

For example this code has an else clause that’s too far indented:

import sys

name = sys.argv[1]

if name == "Trey":
    print("I know you")
    print("Your name is Troy... no, Trent? Trevor??")
    else:
        print("Hello stranger")

When we run the code we’ll see a SyntaxError:

$ python greet.py
  File "/home/trey/greet.py", line 8
    else:
    ^^^^
SyntaxError: invalid syntax

Indentation issues often result in IndentationError exceptions, but sometimes they’ll manifest as SyntaxError exceptions instead.

Embedding statements within statements

A «statement» is either a block of Python code or a single line of Python code that can stand on its own.

An «expression» is a chunk of Python code that evaluates to a value.
Expressions contain identifiers (i.e. variables), literals (e.g. [1, 2], "hi", and 4), and operators (e.g. +, in, and *).

In Python we can embed one expression within another.
But some expressions are actually «statements» which must be a line all on their own.

Here we’ve tried to embed one statement within another:

>>> def square_all(numbers):
...     return result = [n**2 for n in numbers]
  File "<stdin>", line 2
    return result = [n**2 for n in numbers]
                  ^
SyntaxError: invalid syntax

Assignments are statements in Python (result = ... is a statement).
Python’s return is also a statement.
We’ve tried to embed one statement inside another and Python didn’t understand us.

We likely meant either this:

def square_all(numbers):
    result = [n**2 for n in numbers]
    return result

Or this:

def square_all(numbers):
    return [n**2 for n in numbers]

Here’s the same issue with the global statement (see assigning to global variables):

>>> def connect(*args, **kwargs):
...     global _connection = sqlite3.connect(*args, **kwargs)
  File "<stdin>", line 2
    global _connection = sqlite3.connect(*args, **kwargs)
                       ^
SyntaxError: invalid syntax

And the same issue with the del statement:

trey_count = del counts['Trey']
  File "<stdin>", line 1
    trey_count = del counts['Trey']
                 ^^^
SyntaxError: invalid syntax

If assignment is involves in your statement-inside-a-statement, an assignment expression (via Python’s walrus operator) may be helpful in resolving your issue.
Though often the simplest solution is to split your code into multiple statements over multiple lines.

Errors that appear only in the Python REPL

Some errors are a bit less helpful within the Python REPL.

Take this invalid syntax error:

def square_all(numbers:
    return [
  File "<stdin>", line 2
    return [
    ^^^^^^
SyntaxError: invalid syntax

We’ll see that error within the Python REPL even on Python 3.11.

The issue is that the first line doesn’t have a closing parentheses.
Python 3.10+ would properly point this out if we ran our code from a .py file instead:

$ python3.10 square.py
  File "/home/trey/square.py", line 1
    def square_all(numbers:
                  ^
SyntaxError: '(' was never closed

But at the REPL Python doesn’t parse our code the same way (it parses block-by-block in the REPL) and sometimes error messages are a bit less helpful within the REPL as a result.

Here’s another REPL-specific error:

>>> def greet(name):
...     print(f"Howdy {name}!")
... greet("Trey")
  File "<stdin>", line 3
    greet("Trey")
    ^^^^^
SyntaxError: invalid syntax

This is valid Python code:

def greet(name):
    print(f"Howdy {name}!")
greet("Trey")

But that can’t be copy-pasted directly into the REPL.
In the Python REPL a blank line is needed after a block of code to end that block.

So we’d need to put a newline between the function definition and the function call:

>>> def greet(name):
...     print(f"Howdy {name}!")
...
>>> greet("Trey")
Howdy Trey!

Some errors are due to code that feels like it should work in a Python REPL but doesn’t.
For example running python from within your Python REPL doesn’t work:

>>> python greet.py
  File "<stdin>", line 1
    python greet.py
           ^^^^^
SyntaxError: invalid syntax
>>> python -m pip install django
  File "<stdin>", line 1
    python -m pip install django
              ^^^
SyntaxError: invalid syntax

The above commands would work from our system command-prompt, but they don’t work within the Python REPL.

If you’re trying to launch Python or send a command to your prompt outside Python (like ls or dir), you’ll need to do it from your system command prompt (Terminal, Powershell, Command Prompt, etc.).
You can only type valid Python code from within the Python REPL.

Problems copy-pasting from the REPL

Copy-pasting from the Python REPL into a .py file will also result in syntax errors.

Here’s we’re running a file that has >>> prefixes before each line:

$ python numbers.py
  File "/home/trey/numbers.py", line 1
    >>> n = 4
    ^^
SyntaxError: invalid syntax

This isn’t a valid Python program:

>>> n = 4
>>> print(n**2)

But this is a valid Python program:

You’ll need to be careful about empty lines when copy-pasting from a .py file into a Python REPL and you’ll need to be careful about >>> and ... prefixes and command output when copy-pasting from a REPL into a .py file.

The line number is just a «best guess»

It used to be that the line number for an error would usually represent the place that Python got confused about your syntax.
That line number was often one or more lines after the actual error.

In recent versions of Python, the core developers have updated these line numbers in an attempt to make them more accurate.

For example here’s an error on Python 3.9 due to a missing comma:

$ python3.9 greet.py
  File "/home/trey/greet.py", line 4
    name
    ^
SyntaxError: invalid syntax

And here’s the same error in Python 3.10:

$ python3.10 greet.py
  File "/home/greet.py", line 3
    "Hello there"
    ^^^^^^^^^^^^^
SyntaxError: invalid syntax. Perhaps you forgot a comma?

Python’s given us a helpful hint on Python 3.10.
But it’s also made a different guess about what line the error is on.

As you can see from the greet.py file, line 3 ("Hello there") is the better guess in this case, as that’s where the comma is needed.

def greet(name):
    print(
        "Hello there"
        name
    )

While deciphering tracebacks, keep in mind that the line number is just Python’s best guess as to where the error occurred.

SyntaxError exceptions happen all the time

If your code frequently results in SyntaxError exceptions, don’t fret.
These kinds of exceptions happen all the time.
When you’re newer to Python, you’ll find that it’s often a challenge to remember the exact syntax for the statements you’re writing.

But more experienced Python programmers also experience syntax errors.
I make typos in my code quite often.
I have a linter installed in my text editor to help me catch those typos though.
I recommend searching for a «Python» or «Python linter» extension for your favorite code editor so you can spot these issues quickly every time you save your .py files.

Once you get past syntax errors, you’ll likely hit other types of exceptions. Watch the exception screencast series for more on reading tracebacks and exception handling in Python.

0 / 0 / 0

Регистрация: 18.10.2021

Сообщений: 17

05.11.2021, 02:24

4

Командой «python3 helloworld.py» вы запускаете интерпретатор Python, передавая ему ваш файл с кодом. Всё верно (кроме того, что если вы используете Windows, нужно писать не python3, а просто python). Но дело в том, что данную команду нужно прописывать в консоли ОС, как и сказал Welemir1. В случае Windows это cmd. А вы уже, по всей видимости, заранее запустили интерпретатор и теперь пытаетесь передать ему на исполнение непонятную для него команду.
В изучаемом вами учебнике «Укус Питона» в параграфе 6.1 написано: «Как только вы запустили python3, вы должны увидеть >>> в начале строки, где вы можете что-то набирать. Это и называется командной строкой интерпретатора Python.»
То есть, если вы видите >>>, то это значит, что уже запущен интерпретатор в интерактивном режиме. В этом режиме вы по очереди вводите команды и тут же получаете результат. Например:

Python
1
2
>>> print('Hello, world!')
Hello, world!

А что если нам нужно написать большую программу и в дальнейшем её использовать? Не вводить же её построчно из памяти каждый раз. Поэтому, нам нужно создать программный файл, где будет хранится код программы — набор команд, которые понятны интерпретатору Python. В случае Python данный файл представляет из себя текстовый файл в кодировке UTF-8 и с расширением .py. Этот файл можно редактировать с помощью любого текстового редактора, даже блокнота! (Но для этих целей лучше использовать специально предназначенные для кода текстовые редакторы с подсветкой синтаксиса, например, Atom, Sublime Text, Vim и так далее). Когда мы написали код в таком файле и сохранили его, мы можем передать этот файл интерпретатору Python, чтобы тот исполнил команды, написанные нами в этом файле. В данном случае вы создали такой файл и назвали его «helloworld.py». Теперь нужно передать этот файл интерпретатору. Для этого запускаем cmd (если используете Windows), например, нажав комбинацию Win+R, введя cmd и нажав Enter. Откроется командная строка Windows. В ней и нужно прописать «python helloworld.py». Если используете дистрибутив GNU/Linux, то запускаем терминал (обычно это комбинация Ctrl+Alt+T) и прописываем «python3 helloworld.py». Если сделали всё правильно, увидите ту самую строку «Hello, world!».

P.S. Для лучшего понимания советую почитать, чем отличаются компилируемые и интерпретируемые языки программирования.
P.P.S. Главное — пытайтесь не просто повторить, а выяснить и понять, что именно, почему и как написано в читаемых вами примерах программ. Удачи и сил вам в изучении программирования!



0



Python известен своим простым синтаксисом. Однако, когда вы изучаете Python в первый раз или когда вы попали на Python с большим опытом работы на другом языке программирования, вы можете столкнуться с некоторыми вещами, которые Python не позволяет. Если вы когда-либо получали + SyntaxError + при попытке запустить код Python, то это руководство может вам помочь. В этом руководстве вы увидите общие примеры неправильного синтаксиса в Python и узнаете, как решить эту проблему.

Неверный синтаксис в Python

Когда вы запускаете ваш код Python, интерпретатор сначала анализирует его, чтобы преобразовать в байтовый код Python, который он затем выполнит. Интерпретатор найдет любой недопустимый синтаксис в Python на этом первом этапе выполнения программы, также известном как этап синтаксического анализа . Если интерпретатор не может успешно проанализировать ваш код Python, это означает, что вы использовали неверный синтаксис где-то в вашем коде. Переводчик попытается показать вам, где произошла эта ошибка.

Когда вы изучаете Python в первый раз, может быть неприятно получить + SyntaxError +. Python попытается помочь вам определить, где в вашем коде указан неверный синтаксис, но предоставляемый им traceback может немного сбить с толку. Иногда код, на который он указывает, вполне подходит.

*Примечание:* Если ваш код *синтаксически* правильный, то вы можете получить другие исключения, которые не являются `+ SyntaxError +`. Чтобы узнать больше о других исключениях Python и о том, как их обрабатывать, ознакомьтесь с https://realpython.com/python-exceptions/[Python Exceptions: Введение].

Вы не можете обрабатывать неправильный синтаксис в Python, как и другие исключения. Даже если вы попытаетесь обернуть блок + try + и + кроме + вокруг кода с неверным синтаксисом, вы все равно увидите, что интерпретатор вызовет + SyntaxError +.

+ SyntaxError + Исключение и трассировка

Когда интерпретатор обнаруживает неверный синтаксис в коде Python, он вызовет исключение + SyntaxError + и предоставит трассировку с некоторой полезной информацией, которая поможет вам отладить ошибку. Вот некоторый код, который содержит недопустимый синтаксис в Python:

 1 # theofficefacts.py
 2 ages = {
 3     'pam': 24,
 4     'jim': 24
 5     'michael': 43
 6 }
 7 print(f'Michael is {ages["michael"]} years old.')

Вы можете увидеть недопустимый синтаксис в литерале словаря в строке 4. Во второй записи + 'jim' + пропущена запятая. Если вы попытаетесь запустить этот код как есть, вы получите следующую трассировку:

$ python theofficefacts.py
File "theofficefacts.py", line 5
    'michael': 43
            ^
SyntaxError: invalid syntax

Обратите внимание, что сообщение трассировки обнаруживает ошибку в строке 5, а не в строке 4. Интерпретатор Python пытается указать, где находится неправильный синтаксис. Тем не менее, он может только указать, где он впервые заметил проблему. Когда вы получите трассировку + SyntaxError + и код, на который указывает трассировка, выглядит нормально, тогда вы захотите начать движение назад по коду, пока не сможете определить, что не так.

В приведенном выше примере нет проблемы с запятой, в зависимости от того, что следует после нее. Например, нет проблемы с отсутствующей запятой после + 'michael' + в строке 5. Но как только переводчик сталкивается с чем-то, что не имеет смысла, он может лишь указать вам на первое, что он обнаружил, что он не может понять.

*Примечание:* В этом руководстве предполагается, что вы знакомы с основами *tracebacks* в Python. Чтобы узнать больше о трассировке Python и о том, как их читать, ознакомьтесь с https://realpython.com/python-traceback/[Understanding Python Traceback].

Существует несколько элементов трассировки + SyntaxError +, которые могут помочь вам определить, где в вашем коде содержится неверный синтаксис:

  • Имя файла , где встречается неверный синтаксис

  • Номер строки и воспроизводимая строка кода, где возникла проблема

  • Знак (+ ^ +) в строке ниже воспроизводимого кода, который показывает точку в коде, которая имеет проблему

  • Сообщение об ошибке , которое следует за типом исключения + SyntaxError +, которое может предоставить информацию, которая поможет вам определить проблему

В приведенном выше примере имя файла было + theofficefacts.py +, номер строки был 5, а каретка указывала на закрывающую кавычку из словарного ключа + michael +. Трассировка + SyntaxError + может не указывать на реальную проблему, но она будет указывать на первое место, где интерпретатор не может понять синтаксис.

Есть два других исключения, которые вы можете увидеть в Python. Они эквивалентны + SyntaxError +, но имеют разные имена:

  1. + + IndentationError

  2. + + TabError

Оба эти исключения наследуются от класса + SyntaxError +, но это особые случаи, когда речь идет об отступе. + IndentationError + возникает, когда уровни отступа вашего кода не совпадают. + TabError + возникает, когда ваш код использует и табуляцию, и пробелы в одном файле. Вы познакомитесь с этими исключениями более подробно в следующем разделе.

Общие проблемы с синтаксисом

Когда вы впервые сталкиваетесь с + SyntaxError +, полезно знать, почему возникла проблема и что вы можете сделать, чтобы исправить неверный синтаксис в вашем коде Python. В следующих разделах вы увидите некоторые из наиболее распространенных причин, по которым может быть вызвано «+ SyntaxError +», и способы их устранения.

Неправильное использование оператора присваивания (+ = +)

В Python есть несколько случаев, когда вы не можете назначать объекты. Некоторые примеры присваивают литералам и вызовам функций. В приведенном ниже блоке кода вы можете увидеть несколько примеров, которые пытаются это сделать, и получающиеся в результате трассировки + SyntaxError +:

>>>

>>> len('hello') = 5
  File "<stdin>", line 1
SyntaxError: can't assign to function call

>>> 'foo' = 1
  File "<stdin>", line 1
SyntaxError: can't assign to literal

>>> 1 = 'foo'
  File "<stdin>", line 1
SyntaxError: can't assign to literal

Первый пример пытается присвоить значение + 5 + вызову + len () +. Сообщение + SyntaxError + очень полезно в этом случае. Он говорит вам, что вы не можете присвоить значение вызову функции.

Второй и третий примеры пытаются присвоить литералам строку и целое число. То же правило верно и для других литеральных значений. И снова сообщения трассировки указывают, что проблема возникает, когда вы пытаетесь присвоить значение литералу.

*Примечание:* В приведенных выше примерах отсутствует повторяющаяся строка кода и каретка (`+ ^ +`), указывающая на проблему в трассировке. Исключение и обратная трассировка, которые вы видите, будут другими, когда вы находитесь в REPL и пытаетесь выполнить этот код из файла. Если бы этот код был в файле, то вы бы получили повторяющуюся строку кода и указали на проблему, как вы видели в других случаях в этом руководстве.

Вероятно, ваше намерение не состоит в том, чтобы присвоить значение литералу или вызову функции. Например, это может произойти, если вы случайно пропустите дополнительный знак равенства (+ = +), что превратит назначение в сравнение. Сравнение, как вы можете видеть ниже, будет правильным:

>>>

>>> len('hello') == 5
True

В большинстве случаев, когда Python сообщает вам, что вы делаете присвоение чему-то, что не может быть назначено, вы сначала можете проверить, чтобы убедиться, что оператор не должен быть логическим выражением. Вы также можете столкнуться с этой проблемой, когда пытаетесь присвоить значение ключевому слову Python, о котором вы расскажете в следующем разделе.

Неправильное написание, отсутствие или неправильное использование ключевых слов Python

Ключевые слова Python — это набор защищенных слов , которые имеют особое значение в Python. Это слова, которые вы не можете использовать в качестве идентификаторов, переменных или имен функций в своем коде. Они являются частью языка и могут использоваться только в контексте, который допускает Python.

Существует три распространенных способа ошибочного использования ключевых слов:

  1. Неправильное написание ключевое слово

  2. Отсутствует ключевое слово

  3. Неправильное использование ключевого слова

Если вы неправильно написали ключевое слово в своем коде Python, вы получите + SyntaxError +. Например, вот что происходит, если вы пишете ключевое слово + for + неправильно:

>>>

>>> fro i in range(10):
  File "<stdin>", line 1
    fro i in range(10):
        ^
SyntaxError: invalid syntax

Сообщение читается как + SyntaxError: неверный синтаксис +, но это не очень полезно. Трассировка указывает на первое место, где Python может обнаружить, что что-то не так. Чтобы исправить эту ошибку, убедитесь, что все ваши ключевые слова Python написаны правильно.

Другая распространенная проблема с ключевыми словами — это когда вы вообще их пропускаете:

>>>

>>> for i range(10):
  File "<stdin>", line 1
    for i range(10):
              ^
SyntaxError: invalid syntax

Еще раз, сообщение об исключении не очень полезно, но трассировка действительно пытается указать вам правильное направление. Если вы отойдете от каретки, то увидите, что ключевое слово + in + отсутствует в синтаксисе цикла + for +.

Вы также можете неправильно использовать защищенное ключевое слово Python. Помните, что ключевые слова разрешено использовать только в определенных ситуациях. Если вы используете их неправильно, у вас будет неправильный синтаксис в коде Python. Типичным примером этого является использование https://realpython.com/python-for-loop/#the-break-and-continue-statements [+ continue + или + break +] вне цикла. Это может легко произойти во время разработки, когда вы реализуете вещи и когда-то перемещаете логику за пределы цикла:

>>>

>>> names = ['pam', 'jim', 'michael']
>>> if 'jim' in names:
...     print('jim found')
...     break
...
  File "<stdin>", line 3
SyntaxError: 'break' outside loop

>>> if 'jim' in names:
...     print('jim found')
...     continue
...
  File "<stdin>", line 3
SyntaxError: 'continue' not properly in loop

Здесь Python отлично говорит, что именно не так. Сообщения " 'break' вне цикла " и " 'continue' не в цикле должным образом " помогут вам точно определить, что делать. Если бы этот код был в файле, то Python также имел бы курсор, указывающий прямо на неправильно использованное ключевое слово.

Другой пример — если вы пытаетесь назначить ключевое слово Python переменной или использовать ключевое слово для определения функции:

>>>

>>> pass = True
  File "<stdin>", line 1
    pass = True
         ^
SyntaxError: invalid syntax

>>> def pass():
  File "<stdin>", line 1
    def pass():
           ^
SyntaxError: invalid syntax

Когда вы пытаетесь присвоить значение + pass +, или когда вы пытаетесь определить новую функцию с именем + pass +, вы получите ` + SyntaxError + и снова увидеть сообщение + «неверный синтаксис» + `.

Может быть немного сложнее решить этот тип недопустимого синтаксиса в коде Python, потому что код выглядит хорошо снаружи. Если ваш код выглядит хорошо, но вы все еще получаете + SyntaxError +, то вы можете рассмотреть возможность проверки имени переменной или имени функции, которое вы хотите использовать, по списку ключевых слов для версии Python, которую вы используете.

Список защищенных ключевых слов менялся с каждой новой версией Python. Например, в Python 3.6 вы можете использовать + await + в качестве имени переменной или имени функции, но в Python 3.7 это слово было добавлено в список ключевых слов. Теперь, если вы попытаетесь использовать + await + в качестве имени переменной или функции, это вызовет + SyntaxError +, если ваш код для Python 3.7 или более поздней версии.

Другим примером этого является + print +, который отличается в Python 2 от Python 3:

Version print Type Takes A Value

Python 2

keyword

no

Python 3

built-in function

yes

+ print + — это ключевое слово в Python 2, поэтому вы не можете присвоить ему значение. Однако в Python 3 это встроенная функция, которой можно присваивать значения.

Вы можете запустить следующий код, чтобы увидеть список ключевых слов в любой версии Python, которую вы используете:

import keyword
print(keyword.kwlist)

+ keyword + также предоставляет полезную + keyword.iskeyword () +. Если вам просто нужен быстрый способ проверить переменную + pass +, то вы можете использовать следующую однострочную строку:

>>>

>>> import keyword; keyword.iskeyword('pass')
True

Этот код быстро сообщит вам, является ли идентификатор, который вы пытаетесь использовать, ключевым словом или нет.

Отсутствующие скобки, скобки и цитаты

Часто причиной неправильного синтаксиса в коде Python являются пропущенные или несовпадающие закрывающие скобки, скобки или кавычки. Их может быть трудно обнаружить в очень длинных строках вложенных скобок или длинных многострочных блоках. Вы можете найти несоответствующие или пропущенные кавычки с помощью обратных трассировок Python:

>>>

>>> message = 'don't'
  File "<stdin>", line 1
    message = 'don't'
                   ^
SyntaxError: invalid syntax

Здесь трассировка указывает на неверный код, где после закрывающей одинарной кавычки стоит + t '+. Чтобы это исправить, вы можете сделать одно из двух изменений:

  1. Escape одиночная кавычка с обратной косой чертой (+ 'don ' t '+)

  2. Окружить всю строку в двойных кавычках (" не ")

Другая распространенная ошибка — забыть закрыть строку. Как для строк с двойными, так и с одинарными кавычками ситуация и обратная трассировка одинаковы:

>>>

>>> message = "This is an unclosed string
  File "<stdin>", line 1
    message = "This is an unclosed string
                                        ^
SyntaxError: EOL while scanning string literal

На этот раз каретка в трассировке указывает прямо на код проблемы. Сообщение + SyntaxError +, " EOL при сканировании строкового литерала ", немного более конкретно и полезно при определении проблемы. Это означает, что интерпретатор Python дошел до конца строки (EOL) до закрытия открытой строки. Чтобы это исправить, закройте строку с кавычкой, которая совпадает с той, которую вы использовали для ее запуска. В этом случае это будет двойная кавычка (`+» + `).

Кавычки, отсутствующие в инструкциях внутри f-string, также могут привести к неверному синтаксису в Python:

 1 # theofficefacts.py
 2 ages = {
 3     'pam': 24,
 4     'jim': 24,
 5     'michael': 43
 6 }
 7 print(f'Michael is {ages["michael]} years old.')

Здесь, ссылка на словарь + ages + внутри напечатанной f-строки пропускает закрывающую двойную кавычку из ссылки на ключ. Итоговая трассировка выглядит следующим образом:

$ python theofficefacts.py
  File "theofficefacts.py", line 7
    print(f'Michael is {ages["michael]} years old.')
         ^
SyntaxError: f-string: unterminated string

Python идентифицирует проблему и сообщает, что она существует внутри f-строки. Сообщение " неопределенная строка " также указывает на проблему. Каретка в этом случае указывает только на начало струны.

Это может быть не так полезно, как когда каретка указывает на проблемную область струны, но она сужает область поиска. Где-то внутри этой f-строки есть неопределенная строка. Вы просто должны узнать где. Чтобы решить эту проблему, убедитесь, что присутствуют все внутренние кавычки и скобки f-строки.

Ситуация в основном отсутствует в скобках и скобках. Например, если вы исключите закрывающую квадратную скобку из списка, Python обнаружит это и укажет на это. Однако есть несколько вариантов этого. Первый — оставить закрывающую скобку вне списка:

# missing.py
def foo():
    return [1, 2, 3

print(foo())

Когда вы запустите этот код, вам скажут, что есть проблема с вызовом + print () +:

$ python missing.py
  File "missing.py", line 5
    print(foo())
        ^
SyntaxError: invalid syntax

Здесь происходит то, что Python думает, что список содержит три элемента: + 1 +, + 2 + и +3 print (foo ()) +. Python использует whitespace для логической группировки вещей, и потому что нет запятой или скобки, отделяющей + 3 + от `+ print (foo ()) + `, Python объединяет их вместе как третий элемент списка.

Еще один вариант — добавить запятую после последнего элемента в списке, оставляя при этом закрывающую квадратную скобку:

# missing.py
def foo():
    return [1, 2, 3,

print(foo())

Теперь вы получаете другую трассировку:

$ python missing.py
  File "missing.py", line 6

                ^
SyntaxError: unexpected EOF while parsing

В предыдущем примере + 3 + и + print (foo ()) + были объединены в один элемент, но здесь вы видите запятую, разделяющую два. Теперь вызов + print (foo ()) + добавляется в качестве четвертого элемента списка, и Python достигает конца файла без закрывающей скобки. В трассировке говорится, что Python дошел до конца файла (EOF), но ожидал чего-то другого.

В этом примере Python ожидал закрывающую скобку (+] +), но повторяющаяся строка и каретка не очень помогают. Отсутствующие круглые скобки и скобки сложно определить Python. Иногда единственное, что вы можете сделать, это начать с каретки и двигаться назад, пока вы не сможете определить, чего не хватает или что нет.

Ошибочный синтаксис словаря

Вы видели ссылку: # syntaxerror-exception-and-traceback [ранее], чтобы вы могли получить + SyntaxError +, если не указывать запятую в словарном элементе. Другая форма недопустимого синтаксиса в словарях Python — это использование знака равенства (+ = +) для разделения ключей и значений вместо двоеточия:

>>>

>>> ages = {'pam'=24}
  File "<stdin>", line 1
    ages = {'pam'=24}
                 ^
SyntaxError: invalid syntax

Еще раз, это сообщение об ошибке не очень полезно. Повторная линия и каретка, однако, очень полезны! Они указывают прямо на характер проблемы.

Этот тип проблемы распространен, если вы путаете синтаксис Python с синтаксисом других языков программирования. Вы также увидите это, если перепутаете определение словаря с вызовом + dict () +. Чтобы это исправить, вы можете заменить знак равенства двоеточием. Вы также можете переключиться на использование + dict () +:

>>>

>>> ages = dict(pam=24)
>>> ages
{'pam': 24}

Вы можете использовать + dict () + для определения словаря, если этот синтаксис более полезен.

Использование неправильного отступа

Существует два подкласса + SyntaxError +, которые конкретно занимаются проблемами отступов:

  1. + + IndentationError

  2. + + TabError

В то время как другие языки программирования используют фигурные скобки для обозначения блоков кода, Python использует whitespace. Это означает, что Python ожидает, что пробелы в вашем коде будут вести себя предсказуемо. Он вызовет + IndentationError + , если в блоке кода есть строка с неправильным количеством пробелов:

 1 # indentation.py
 2 def foo():
 3     for i in range(10):
 4         print(i)
 5   print('done')
 6
 7 foo()

Это может быть сложно увидеть, но в строке 5 есть только два пробела с отступом. Он должен соответствовать выражению цикла + for +, которое на 4 пробела больше. К счастью, Python может легко определить это и быстро расскажет вам, в чем проблема.

Здесь также есть некоторая двусмысленность. Является ли строка + print ('done') + after циклом + for + или inside блоком цикла + for +? Когда вы запустите приведенный выше код, вы увидите следующую ошибку:

$ python indentation.py
  File "indentation.py", line 5
    print('done')
                ^
IndentationError: unindent does not match any outer indentation level

Хотя трассировка выглядит во многом как трассировка + SyntaxError +, на самом деле это + IndentationError +. Сообщение об ошибке также очень полезно. Он говорит вам, что уровень отступа строки не соответствует ни одному другому уровню отступа. Другими словами, + print ('done') + это отступ с двумя пробелами, но Python не может найти любую другую строку кода, соответствующую этому уровню отступа. Вы можете быстро это исправить, убедившись, что код соответствует ожидаемому уровню отступа.

Другой тип + SyntaxError + — это + TabError + , который вы будете видеть всякий раз, когда есть строка, содержащая либо табуляцию, либо пробелы для отступа, в то время как остальная часть файла содержит другую. Это может скрыться, пока Python не покажет это вам!

Если размер вкладки равен ширине пробелов на каждом уровне отступа, то может показаться, что все строки находятся на одном уровне. Однако, если одна строка имеет отступ с использованием пробелов, а другая — с помощью табуляции, Python укажет на это как на проблему:

 1 # indentation.py
 2 def foo():
 3     for i in range(10):
 4         print(i)
 5     print('done')
 6
 7 foo()

Здесь строка 5 имеет отступ вместо 4 пробелов. Этот блок кода может выглядеть идеально для вас, или он может выглядеть совершенно неправильно, в зависимости от настроек вашей системы.

Python, однако, сразу заметит проблему. Но прежде чем запускать код, чтобы увидеть, что Python скажет вам, что это неправильно, вам может быть полезно посмотреть пример того, как код выглядит при различных настройках ширины вкладки:

$ tabs 4 # Sets the shell tab width to 4 spaces
$ cat -n indentation.py
     1   # indentation.py
     2   def foo():
     3       for i in range(10)
     4           print(i)
     5       print('done')
     6
     7   foo()

$ tabs 8 # Sets the shell tab width to 8 spaces (standard)
$ cat -n indentation.py
     1   # indentation.py
     2   def foo():
     3       for i in range(10)
     4           print(i)
     5           print('done')
     6
     7   foo()

$ tabs 3 # Sets the shell tab width to 3 spaces
$ cat -n indentation.py
     1   # indentation.py
     2   def foo():
     3       for i in range(10)
     4           print(i)
     5      print('done')
     6
     7   foo()

Обратите внимание на разницу в отображении между тремя примерами выше. Большая часть кода использует 4 пробела для каждого уровня отступа, но строка 5 использует одну вкладку во всех трех примерах. Ширина вкладки изменяется в зависимости от настройки tab width :

  • Если ширина вкладки равна 4 , то оператор + print + будет выглядеть так, как будто он находится вне цикла + for +. Консоль выведет + 'done' + в конце цикла.

  • Если ширина табуляции равна 8 , что является стандартным для многих систем, то оператор + print + будет выглядеть так, как будто он находится внутри цикла + for +. Консоль будет печатать + 'done' + после каждого числа.

  • Если ширина табуляции равна 3 , то оператор + print + выглядит неуместно. В этом случае строка 5 не соответствует ни одному уровню отступа.

Когда вы запустите код, вы получите следующую ошибку и трассировку:

$ python indentation.py
  File "indentation.py", line 5
    print('done')
                ^
TabError: inconsistent use of tabs and spaces in indentation

Обратите внимание на + TabError + вместо обычного + SyntaxError +. Python указывает на проблемную строку и дает вам полезное сообщение об ошибке. Это ясно говорит о том, что в одном и том же файле для отступа используется смесь вкладок и пробелов.

Решение этой проблемы состоит в том, чтобы все строки в одном и том же файле кода Python использовали либо табуляции, либо пробелы, но не обе. Для приведенных выше блоков кода исправление будет состоять в том, чтобы удалить вкладку и заменить ее на 4 пробела, которые будут печатать + 'done' + после завершения цикла + for +.

Определение и вызов функций

Вы можете столкнуться с неверным синтаксисом в Python, когда вы определяете или вызываете функции. Например, вы увидите + SyntaxError +, если будете использовать точку с запятой вместо двоеточия в конце определения функции:

>>>

>>> def fun();
  File "<stdin>", line 1
    def fun();
             ^
SyntaxError: invalid syntax

Трассировка здесь очень полезна, с помощью каретки, указывающей прямо на символ проблемы. Вы можете очистить этот неверный синтаксис в Python, отключив точку с запятой для двоеточия.

Кроме того, ключевые аргументы как в определениях функций, так и в вызовах функций должны быть в правильном порядке. Аргументы ключевых слов always идут после позиционных аргументов. Отказ от использования этого порядка приведет к + SyntaxError +:

>>>

>>> def fun(a, b):
...     print(a, b)
...
>>> fun(a=1, 2)
  File "<stdin>", line 1
SyntaxError: positional argument follows keyword argument

Здесь, еще раз, сообщение об ошибке очень полезно, чтобы рассказать вам точно, что не так со строкой.

Изменение версий Python

Иногда код, который прекрасно работает в одной версии Python, ломается в более новой версии. Это связано с официальными изменениями в синтаксисе языка. Наиболее известным примером этого является оператор + print +, который перешел от ключевого слова в Python 2 к встроенной функции в Python 3:

>>>

>>> # Valid Python 2 syntax that fails in Python 3
>>> print 'hello'
  File "<stdin>", line 1
    print 'hello'
                ^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print('hello')?

Это один из примеров, где появляется сообщение об ошибке, сопровождающее + SyntaxError +! Он не только сообщает вам, что в вызове + print + отсутствует скобка, но также предоставляет правильный код, который поможет вам исправить оператор.

Другая проблема, с которой вы можете столкнуться, — это когда вы читаете или изучаете синтаксис, который является допустимым синтаксисом в более новой версии Python, но недопустим в той версии, в которую вы пишете. Примером этого является синтаксис f-string, которого нет в версиях Python до 3.6:

>>>

>>> # Any version of python before 3.6 including 2.7
>>> w ='world'
>>> print(f'hello, {w}')
  File "<stdin>", line 1
    print(f'hello, {w}')
                      ^
SyntaxError: invalid syntax

В версиях Python до 3.6 интерпретатор ничего не знает о синтаксисе f-строки и просто предоставляет общее сообщение «» неверный синтаксис «`. Проблема, в данном случае, в том, что код looks прекрасно работает, но он был запущен с более старой версией Python. В случае сомнений перепроверьте, какая версия Python у вас установлена!

Синтаксис Python продолжает развиваться, и в Python 3.8 появилось несколько интересных новых функций:

  • Walrus оператор (выражения присваивания)

  • F-string синтаксис для отладки
    *https://docs.python.org/3.8/whatsnew/3.8.html#positional-only-parameters[Positional-only arguments]

Если вы хотите опробовать некоторые из этих новых функций, то вам нужно убедиться, что вы работаете в среде Python 3.8. В противном случае вы получите + SyntaxError +.

Python 3.8 также предоставляет новый* + SyntaxWarning + *. Вы увидите это предупреждение в ситуациях, когда синтаксис допустим, но все еще выглядит подозрительно. Примером этого может быть отсутствие запятой между двумя кортежами в списке. Это будет действительный синтаксис в версиях Python до 3.8, но код вызовет + TypeError +, потому что кортеж не может быть вызван:

>>>

>>> [(1,2)(2,3)]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object is not callable

Этот + TypeError + означает, что вы не можете вызывать кортеж, подобный функции, что, как думает интерпретатор Python, вы делаете.

В Python 3.8 этот код все еще вызывает + TypeError +, но теперь вы также увидите + SyntaxWarning +, который указывает, как вы можете решить проблему:

>>>

>>> [(1,2)(2,3)]
<stdin>:1: SyntaxWarning: 'tuple' object is not callable; perhaps you missed a comma?
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object is not callable

Полезное сообщение, сопровождающее новый + SyntaxWarning +, даже дает подсказку (" возможно, вы пропустили запятую? "), Чтобы указать вам правильное направление!

Заключение

В этом руководстве вы увидели, какую информацию предоставляет обратная связь + SyntaxError +. Вы также видели много распространенных примеров неправильного синтаксиса в Python и каковы решения этих проблем. Это не только ускорит ваш рабочий процесс, но и сделает вас более полезным рецензентом кода!

Когда вы пишете код, попробуйте использовать IDE, который понимает синтаксис Python и предоставляет обратную связь. Если вы поместите многие из недопустимых примеров кода Python из этого руководства в хорошую IDE, то они должны выделить проблемные строки, прежде чем вы даже сможете выполнить свой код.

Получение + SyntaxError + во время изучения Python может быть неприятным, но теперь вы знаете, как понимать сообщения трассировки и с какими формами недопустимого синтаксиса в Python вы можете столкнуться. В следующий раз, когда вы получите + SyntaxError +, у вас будет больше возможностей быстро решить проблему!

Python – универсальный и гибкий язык. Часто в нем есть несколько способов добиться какой-либо цели. В этом руководстве мы разберем несколько способов вывести строку и переменную одновременно.

Как использовать функцию print() в Python

Чтобы вывести что-либо на экран, мы используем функцию print(). Пишем ключевое слово print, за которым следует пара круглых скобок (). Внутри этих скобок мы помещаем то, что хотим распечатать. Это выглядит следующим образом:

# вывод строки
print("Hello world")

# вывод целого числа
print(7)

# вывод значения переменной 
# чтобы просто вывести переменную, помещаем в скобки ее имя
fave_language = "Python"
print(fave_language)

# Результат

# Hello world
# 7
# Python

Если вы вдруг забудете или решите опустить круглые скобки, вы получите такое сообщение об ошибке:

print "hello world"

# Результат после запуска кода:
# File "/Users/dionysialemonaki/python_articles/demo.py", line 1
#     print "hello world"
#     ^^^^^^^^^^^^^^^^^^^
# SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?

Если вы пишете код в специальном редакторе или IDE, например, в Visual Studio Code с расширением Python, ошибка типа пропущенных скобок сразу будет подчеркнута. Вы также получите подсказку о том, что именно не так в вашем коде:

Как упоминалось выше, print() используется для вывода данных самых разных типов. Вы можете вывести строки, числа, переменные и другие типы данных.

Вы также можете выводить в одной инструкции print() и текст (или строки), и переменные .

В следующих разделах мы разберем несколько способов справится с этой задачей.

[python_ad_block]

Если мы обратимся к словарю, то узнаем, что слово конкатенация означает объединение, связывание чего-либо в одну цепочку или ряд.

В Python мы объединяем данные друг с другом при помощи оператора сложения (+).

Имейте в виду, что конкатенация используется только для строк. Поэтому, если переменная, которую вы хотите объединить с остальными строками, имеет, к примеру, целочисленный тип данных, вам придется преобразовать ее в строку с помощью функции str().

В следующем примере давайте выведем значение переменной вместе с каким-нибудь другим текстом.

Поместим строки в двойные кавычки, имя переменной используем без каких-либо добавлений, а для объединения строк и значения переменной применим оператор сложения. Вот так это будет выглядеть:

fave_language = "Python"

print("I like coding in " + fave_language + " the most")

# Результат
# I like coding in Python the most

При конкатенации строк вам нужно добавлять пробелы самостоятельно. Поэтому, если бы в предыдущем примере мы не включили пробелы в кавычки, результат выглядел бы следующим образом:

fave_language = "Python"

print("I like coding in" + fave_language + "the most")

# Результат
# I like coding inPythonthe most

Вы даже можете добавить пробелы отдельно:

fave_language = "Python"

print("I like coding in" + " " + fave_language + " "  + "the most")

# Результат
# I like coding in Python the most

Это не самый предпочтительный способ вывода строк и переменных. Всё потому, что он может быть подвержен ошибкам и требует много времени.

Как вывести переменную и строку в Python, разделив их запятыми

Вы можете указать строку и переменную в качестве аргументов функции print(), просто перечислив их через запятую. К примеру, можно сделать следующим образом:

first_name = "John"

print("Hello",first_name)

# Результат
# Hello John

В приведенном выше примере в скобках функции print() мы сначала добавили текст, который хотели вывести на экран. Текст — в данном случае это была строка «Hello» — взят в двойные кавычки.

После закрывающей кавычки мы добавили запятую, которая отделяет этот фрагмент текста от значения, содержащегося в имени переменной (first_name). После этого мы добавили саму переменную.

Мы могли бы добавить ещё какой-нибудь текст после переменной, например так:

first_name = "John"

print("Hello",first_name,"good to see you")

# Результат
# Hello John good to see you

Этот метод также работает с более чем одной переменной:

first_name = "John"
last_name = "Doe"

print("Hello",first_name,last_name,"good to see you")

# Результат
# Hello John Doe good to see you

Обязательно разделяйте все аргументы функции print() запятыми!

Если бы между first_name и last_name не была добавлена ​​запятая, код выдал бы следующую ошибку:

first_name = "John"
last_name = "Doe"

print("Hello",first_name last_name,"good to see you")

# Результат
# File "/Users/dionysialemonaki/python_articles/demo.py", line 4
#     print("Hello",first_name last_name,"good to see you")
#                  ^^^^^^^^^^^^^^^^^^^^
# SyntaxError: invalid syntax. Perhaps you forgot a comma?

Как видите, сообщения об ошибках Python чрезвычайно полезны и немного упрощают процесс отладки.

Выводим переменную и строку с использованием форматирования строк

Чтобы использовать форматирование строк, нужно добавить пару фигурных скобок {} в то место, где вы хотите добавить значение переменной. Это выглядит следующим образом:

first_name = "John"

print("Hello {}, hope you're well!")

В данном примере есть одна переменная – first_name.

Внутри print() в качестве аргумента передана строка, котрую мы хотим вывести. Строка берется в двойные кавычки. А внутри строки мы добавили пару фигурных скобок в том месте, где хотим добавить значение переменной first_name.

Если мы попытаемся запустить данный код, он будет иметь следующий результат:

# Результат
# Hello {}, hope you're well!

Как мы видим, значение переменной first_name не вывелось!

Чтобы это исправить, нам нужно добавить строковый метод .format() в конец строки – то есть сразу после закрывающей кавычки. В качестве аргумента .format() указываем имя нашей переменной. Выглядеть это будет следующим образом:

first_name = "John"

print("Hello {}, hope you're well!".format(first_name))

# Результат
# Hello John, hope you're well!

Если у вас больше одной переменной, вы используете столько пар фигурных скобок, сколько у вас переменных:

first_name = "John"
last_name = "Doe"

print("Hello {} {}, hope you're well!")

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

Что касается метода .format(), важно понимать, что здесь имеет значение порядок, в котором вы помещаете имена переменных внутрь метода.

На место первой пары фигурных скобок будет вставлено значение той переменной, имя которой вы указали в методе format() первым. На место второй пары фигурных скобок встанет значение второй указанной переменной.

Внутри метода обязательно разделяйте имена переменных запятыми:

first_name = "John"
last_name = "Doe"

print("Hello {} {}, hope you're well!".format(first_name,last_name))

# Результат
# Hello John Doe, hope you're well!

Если бы мы изменили порядок переменных внутри метода, результат выглядел бы несколько иначе:

first_name = "John"
last_name = "Doe"

print("Hello {} {}, hope you're well!".format(last_name,first_name))

# Результат
# Hello Doe John, hope you're well!

Как вывести переменную и строку с помощью f-строк

f-строки – лучший, более читаемый и лаконичный способ форматирования строк по сравнению с методом, который мы видели в предыдущем разделе.

Его синтаксис проще и требует меньше ручной работы.

Общий синтаксис для создания f-строки выглядит следующим образом:

print(f"I want this text printed to the console!")

# Результат
# I want this text printed to the console!

Перед открывающими кавычками внутри функции print() добавляется буква f/

Чтобы напечатать переменную со строкой в ​​одном операторе print(), вы снова включаете символ f в то же место – прямо перед кавычками.

Затем вы добавляете нужный текст, а в том месте, где нужно вставить значение переменной, вы добавляете пару фигурных скобок {}  с именем переменной внутри них. После этого можно добавить еще текст и закрыть кавычки (или просто закрыть кавычки). Вот так это должно выглядеть:

first_name = "John"

print(f"Hello, {first_name}!")

#output
#Hello, John!

Чтобы напечатать больше одной переменной, вы добавляете еще один набор фигурных скобок со вторым именем переменной:

first_name = "John"
last_name = "Doe"

print(f"Hello, {first_name} {last_name}!")

# Результат
# Hello, John Doe!

Порядок размещения имен переменных опять же имеет значение. Поэтому убедитесь, что вы добавляете их в соответствии с желаемым результатом.

Если бы мы изменили порядок имен, мы бы получили следующий результат:

first_name = "John"
last_name = "Doe"

print(f"Hello, {last_name} {first_name}!")

# Результат
# Hello, Doe John!

Заключение

Спасибо, что дочитали до конца! Теперь вы знаете, как вывести одновременно строку и переменную в одной строке.

Надеемся, что данная статья была вам полезна. Успехов в написании кода!

Перевод статьи «Python Print Variable – How to Print a String and Variable».

Понравилась статья? Поделить с друзьями:
  • Syntax error unexpected t logical or
  • Syntax error insert variabledeclarators to complete localvariabledeclaration
  • Syntax error unexpected t boolean or
  • Syntax error unexpected symbol expecting register
  • Syntax error unexpected string at end of statement