Skip to main content

Sintassi di base di Python (con esempi)

Python è simile ai linguaggi della "famiglia C", ma ci sono alcune differenze significative e proprietà uniche.

La differenza sintattica più ovvia tra Python e linguaggi come C e ST è che il parser Python riconosce le strutture a blocchi dalla loro indentazione. Non c'è BEGIN/END o parentesi graffe {} per identificare i blocchi di IF/ELSE condizioni, FOR e WHILE loop o funzioni.

I commenti iniziano con # ed estendersi fino alla fine della linea. Nella prima e nella seconda riga del codice sorgente è possibile impostare un marcatore speciale per dichiarare la codifica del file. Si consiglia di utilizzare UTF-8 come codifica se non sono richiesti caratteri ASCII.

Per scopi di debug, usi print per un facile output. Con il % operatore, si ottengono funzionalità simili alla funzione C printf(). L'output viene visualizzato nella visualizzazione dei messaggi di CODESYS.

Esempio 4. Esempio: print
# encoding:utf-8

# defining a function with the parameter i
def do_something(i):
    # if branch
    if i>0:
        print("The value is: %i" % i)
                                                                sum += i
        print("The new sum is: %i" % sum)

    # else if (optional, there can be none or several elif branches)
    elif i=0:
        print("The sum did not change: %i" % sum)

    # and the final else branch (also optional).
    else:
        handle_error()

# an endless while loop
while True:
    print("I got stuck forever!")


Tutto ciò che appartiene allo stesso blocco deve essere rientrato della stessa distanza. La dimensione del rientro è irrilevante. Elementi come parentesi e parentesi graffe hanno una priorità maggiore rispetto ai rientri. Pertanto, il seguente segmento di codice è completamente corretto, anche se è scritto in uno "stile di programmazione scadente":

Esempio 5. Esempio: rientro
# warning: bad style below. Kids, don't try this at home!
if foo >= bar:
               print("foobar")
else:
    print(
          "barfoo"
)


Per evitare ambiguità, non dovresti mischiare tabulazioni e spazi in un file.

Suggerimento

In questo momento, la combinazione di tabulazioni e spazi gilt in Python 3 si qualifica come un errore di sintassi.

La Python Style Guide ufficiale raccomanda l'indentazione di quattro spazi e include alcuni esempi di stile buono e povero. Il tutorial Python fornisce un riepilogo dello stile di codifica.

Python è "case-sensitive", simile a C e in contrasto con ST. Parole chiave, come def, if, else, e while, devono essere minuscole (contrariamente alla regola ST: le parole chiave sono maiuscole). Due identificatori, come "i" e "I", identificano anche due diverse variabili.

Le seguenti parole chiave sono riservate in Python e non possono essere utilizzate come identificatori per variabili, funzioni, ecc.: and | as | assert | break | class | continue | def | del | elif | else | except | exec | finally | for | from | global | if | import | in | is | lambda | not | or | pass | print | raise | return | try | while | with | yield.

Python 3 ha definito altre quattro parole chiave: False | None | True | nonlocal. Mentre i primi tre sono davvero nuovi, i primi tre erano già costanti predefinite in Python 2 e non dovrebbero essere usati per altri scopi.

Per ulteriori informazioni, vedere: Guida allo stile di Python e Esercitazione Python

Variabili e tipi di dati

Python è un potente linguaggio tipizzato dinamicamente: tutte le informazioni sui tipi vengono valutate in fase di esecuzione. Le variabili contengono riferimenti agli oggetti e l'oggetto conosce il suo tipo, non la variabile. Quando un programmatore tenta di eseguire un'operazione che non è possibile (ad esempio, aggiungendo un numero intero e una stringa), Python genera un'eccezione in fase di esecuzione.

Di conseguenza, non ci sono dichiarazioni di variabili e dei loro tipi. In Python, le variabili vengono create solo per assegnare loro valori. Questo è completamente diverso in C e ST, dove i tipi sono forti e statici. Ogni variabile viene dichiarata con un tipo e in fase di compilazione il compilatore verifica che il tipo e gli operatori siano consentiti.

Vedere i seguenti esempi per la gestione delle variabili:

Esempio 6. Esempio: variabili
# assign the integer 1 to the variable i (also "creates" the variable")
i = 1

# assign the string "foobar" to the variable s
s = "foobar"

# Add 5 to the integer i - this is equivalent to i = i + 5
i += 5
# i now holds the integer 6.

# Try to add i and s - this will throw an exception when executed
# TypeError: unsupported operand type(s) for +: 'int' and 'str'
result = i + s

# variables can also be "undeclared" by deleting them.
# Further access to the variable i will throw a NameError exception,
# as the variable does not exist any more.
del i

i += 5 # now throws an exception: NameError: name 'i' is not defined


Tutte le variabili esistenti fanno riferimento a un solo valore. Non ci sono variabili non assegnate o non inizializzate in Python. Per esprimere l'assenza di un valore, Python fornisce un oggetto speciale: None. In C o ST, useresti un puntatore nullo. Il suo unico scopo è quello di esprimere "nessun valore qui", sebbene None è in realtà un'istanza esistente della classe NoneType.

Tipi numerici e virgola mobile

In contrasto con le dozzine di tipi interi in IEC o C, in Python esiste un solo tipo intero. I tipi interi in Python non hanno una dimensione fissa. Al contrario, crescono secondo necessità e sono limitati solo dalla memoria disponibile.

Esempio 7. Esempio: Integers.py
from __future__ import print_function

i = 1
print(i)

j = 0x1234   # hex number, is 16#1234 in IEC and 4660 in decimal
k = 0o123    # octal number, is 8#123 in IEC and 83 decimal
l = 0b101010 # binary number, is 2#101010 in IEC and 42 in decimal
print(j, k, l)

m = (2 + 3)*10 # k is 50 now
print(m)

n = 10 ** 100 # 10 to the power of 100
print(n)

Uscita risultante:

_cds_script_messages_integers.png


Esiste anche un solo tipo a virgola mobile in Python che è simile al tipo di dati IEC LREAL. Fornisce l'aritmetica in virgola mobile IEEE a 64 bit.

La sintassi è per la maggior parte come i linguaggi basati su C:

Esempio 8. Esempio: tipi a virgola mobile
# A simple float...
a = 123.456

# A float containing the integral value 2
b = 2.

# Leading zeroes can be left off
c = .3 # same as 0.3

# Exponential / scientific representation
d = -123e-5


Due casi speciali sono True e False, due costanti che definiscono i valori di verità booleani. Si comportano in modo simile ai valori interi 0 e 1, tranne quando vengono convertiti in stringhe e restituiscono i loro nomi.

Esempio 9. Esempio: Booleans.py
# booleans behave like integers, except when converted to strings.
# The built-in function "type" can be used to query the type of a value.
print("True:  ", True, type(True))
print("False: ", False, type(False))
print("1:     ", 1, type(1))
print("False + 0: ", False + 0, type(False + 0))
print("True * 5: ", True * 5, type(True * 5))

Uscita risultante:

_cds_script_messages_booleans.png


stringhe

In IronPython, le stringhe sono sempre in Unicode e di qualsiasi lunghezza. Non fa alcuna differenza se sono racchiusi ' o ". Le stringhe possono anche avere virgolette triple """ o ''', che consente stringhe letterali su più righe.

Analogamente a C, i caratteri speciali possono essere esclusi mediante caratteri backslash. A titolo di confronto, il simbolo del dollaro ($) è utilizzato in IEC per questo scopo.

Ci sono anche stringhe grezze che hanno altre regole per la barra rovesciata. Questo è pratico quando la stringa dovrebbe avere barre rovesciate letterali. Esempio: percorsi di file di Windows o espressioni regolari.

Esempio 10. Esempio: Strings.py
# encoding:utf-8
from __future__ import print_function

a = "a simple string"
b = 'another string'
c = "strings may contain 'quotes' of the other type."
d = "multiple string literals" ' are concatenated ' '''by the parser'''
e = "Escaping: quotes: \" \' backslash: \\ newline: \r\n ascii code: \x40"
f = """triple-quoted strings may contain newlines, "single"
'quotes' and '''multiquotes''' of the other type"""
g = "Üňíçǿđȩ is also possible: 北京, Москва, Αθήνα, القاهرة"
h = r"c:\raw\strings\retain\backslashes.txt"

# we iterate over a sequence of all the variables defined above:
for i in (a,b,c,d,e,f,g,h):
    print(i) # prints the contents of the variable

Uscita risultante:

_cds_script_messages_strings.png


Python non ha tipi di caratteri. I caratteri sono espressi mediante l'uso di stringhe di lunghezza 1. In questo modo, l'iterazione tramite una stringa, o l'indicizzazione in una stringa, restituisce una singola stringa.

Elenchi e tuple (set di dati)

Gli elenchi e le tuple corrispondono sostanzialmente agli array in C e IEC, ma ci sono alcune differenze evidenti:

  • L'accesso all'indice è sempre verificato. L'accesso a un elenco oa una tupla con un indice non valido genera un'eccezione.

  • Sia le liste che le tuple possono contenere elementi di diverso tipo (anche altre liste e tuple). Al contrario in C e IEC, gli array possono contenere solo elementi di un unico tipo.

  • Gli elenchi sono dinamici e gli elementi possono essere aggiunti, rimossi o sostituiti in qualsiasi momento.

  • Le tuple non sono modificabili: una volta creata una tupla, non può più essere modificata.

Le liste vengono create con il list() costruttore. In alternativa, puoi utilizzare le parentesi []. Le tuple vengono create con il tuple() costruttore o parentesi ().

Esempio 11. Esempio: list_tuples.py
from __future__ import print_function
print("Testing tuples and lists")

# We define a tuple with the numbers from 1 to 10:
t = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
print("Tuple:", t)

# We can access the 6th element of the tuple.
# As in C, index counting starts with 0.
print("Element 5:", t[5])

# Subscription is more powerful using the range syntax:
print("Range[2:5]:", t[2:5]) # lower bound is inclusive, upper bound is exclusive.
print("Range[2::2]:", t[2::2]) # start with 3rd element, and print every 2nd element.
print("Range[-3:-1]:", t[-3:-1]) # Start with the 3rd last element, end just before the last element (upper bound is exclusive)
print("Range[::-1]:", t[::-1]) # negative step with - print backwards

# lists are similar to tuples...
l = [11, 12, 13, "8", t] # contains mixed types: 3 integers, a string, and the tuple defined above.
print("List:", l)

# ... but elements can be added or removed dynamically.
l.append(9) # Add a 9 to the list.
print("List with 9:", l)
print("List Range[3:6:2]:", l[3:6:2]) # print the 4th and 6th element.

del l[1] # remove the element at index 1, the 12.
print("Removed[1]:", l)
del l[1:3] # Remove the elements at index 1 and 2, the 13 and the '8'.
print("Removed[1:3]:", l)

Uscita risultante:

_cds_script_messages_list_tuples.png


Dizionario

Python ha anche un tipo di tabella hash (anche "hashmap"). A differenza dell'elenco, può essere indicizzato con qualsiasi elemento, ad esempio stringhe. Il suo costruttore è dict() e i suoi letterali sono dichiarati tra parentesi graffe {}.

Lo script di esempio dictionaries.py crea l'output visualizzato di seguito. Nell'ultima riga, lo script viene terminato con un'eccezione "KeyError":

Esempio 12. Esempio: dictionaries.py
from __future__ import print_function
print("Testing dictionaries")

# Declare a dictionary with three entries, the third being a list
d = {1: "a", 2: "b", "my list": [1, 2, 3]}
print(d)

# print the value of the key 1
print(d[1])

# remove the value with the key "my list"
del d["my list"]

# Add a value 4 with the key 3
d[3] = 4
print(d)

# The "get" method returns the second argument if the key cannot be found.
print(d.get(1, 42))
print(d.get(23, 42))

# print all keys in the dictionary
for key in d:
    print(key)

# index access for unknown keys will throw a "KeyError" exception!
print(d[23])

Uscita risultante:

_cds_script_messages_dictionaries.png

E poi nell'ultima riga, lo script termina:

_cds_script_dictionaries_keyerror.png

Clicca il Particolari pulsante per visualizzare la traccia dello stack. Qui si determina il numero di riga 27 e la chiave sconosciuta 23.

_cds_script_dictionaries_keyerror_details.png