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.
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":
# 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:
# 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.
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:

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:
# 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.
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:

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.
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:

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 ()
.
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:

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":
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:

E poi nell'ultima riga, lo script termina:

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