Ένας από τους κύριους τύπους δεδομένων στην Python είναι τα strings (κείμενα, λέξεις). Όταν γράφουμε ένα κείμενο σε απλά ή διπλά εισαγωγικά τότε αυτό είναι ένα string (προσοχή όμως μη βάζετε εισαγωγικά μέσα σε εισαγωγικά γιατί μπορεί να έχετε πρόβλημα).
Στο επόμενο έχουμε δύο μεταβλητές s
και t
τύπου string στις οποίες δίνουμε τιμή και τυπώνουμε με την print
.
s = "Μιχάλης"
t = 'Mihalis'
print(s, t)
Εδώ δείχνουμε ότι δύο strings μπορούν να συγκολληθούν σε ένα string με την πράξη +
.
s = "Μιχάλης"
t = 'Mihalis'
newstring = s+t
print(newstring)
Ή όπως εδώ.
print("Mihalis"+"Manolis")
Η πράξη (φυσικός αριθμός Ν)*string συγκολλεί το string με τον εαυτό του Ν φορές.
x="abc"
y=3*x
print(y)
Και οι κενοί χαρακτήρες (γράμματα) μπορούν να είναι μέρος ενός string.
print(10*"abc ")
Η συνάρτηση len
μας επιστρέφει το μήκος (δηλ. πόσα γράμματα έχει) του string που της περνάμε ως όρισμα.
Η συνάρτηση print
τυπώνει όλα τα ορίσματά της διαχωρισμένα με ένα κενό χαρακτήρα.
x=5*"1 23" # Ο κενός χαρακτήρας μετράει στο μήκος του string
n = len(x)
print("Το string x έχει μήκος", n)
print("Το string ", x, "έχει μήκος", n)
Για να τυπώσουμε πολλά πράγματα με το print
χωρίς υποχρεωτικά να τυπώνονται οι ενδιάμεσοι κενοί χαρακτήρες μπορούμε να τα συγκολλήσουμε πρώτα σε ένα string και να τυπώσουμε αυτό.
Δε μπορούμε όμως να συγκολλήσουμε ένα string με ένα ακέραιο, γι' αυτό γράφουμε +str(n)
και όχι n
. Η συνάρτηση str(n)
παίρνει τον αριθμό n
(ή και άλλους τύπους δεδομένων) και τους διαμορφώνει ως string το οποίο και επιστρέφει.
x=5*"123"
n = len(x)
print("Το string"+x+"έχει μήκος"+str(n))
Δείτε εδώ πώς δουλεύει η `str`.
str(5)
str(-5.2)
str(1+2.1)
str(1 == 2)
Εδώ βλέπουμε μια μεταβλητή x
"λογικού" (boolean) τύπου. Η τιμή που παίρνει η x
στην εκχώρηση (assignment)
x = a < b
είναι το αν είναι True
ή False
η παράσταση μετά το =
.
a=3
b=5
x = a < b
print(x)
Η συνάρτηση type(x)
μας επιστρέφει τον τύπο μιας ποσότητας x
. Bool είναι ο τύπος των λογικών μεταβλητών στην Python.
type(x)
Ενώ float
και int
είναι ο τύπος πραγματικών (floating poing numbers, στους υπολογιστές) και ακεραίων (integers) αντίστοιχα.
y=3.2
type(y)
type(-2)
Ο πραγματικοί αριθμοί δεν αναπαρίστανται ποτέ ακριβώς στον υπολογιστή. Αυτό μπορεί να δημιουργήσει καταστάσεις που δε δεν τις περιμένουμε. Σημειωτέον ότι ούτε και οι πράξεις ανάμεσα σε πραγματικούς αριθμούς γίνονται ακριβώς. Αντίθετα η αναπαράσταση των ακεραίων είναι ακριβής (όσο τουλάχιστον "χωράνε" στον υπολογιστή μας) όπως και οι πράξεις ανάμεσά τους.
Στο επόμενο βλέπουμε ότι αν πάρουμε την τετραγωνική ρίζα του 2 και την υψώσουμε στο τετράγωνο παίρνουμε κάτι που δεν είναι ακριβώς 2.
import math
(math.sqrt(2))**2
Δε συγκρίνουμε για ισότητα ποτέ λοιπόν δύο πραγματικούς αριθμούς με το συνηθισμένο σύμβολο ισότητας πραγμάτων στην Python το ==
. Αυτό που κάνουμε είναι ότι αν θέλουμε να συγκρίνουμε δύο αριθμούς για ισότητα τους αφαιρούμε και ελέγχουμε αν η απόλυτη τιμή της διαφοράς τους (που την υπολογίζουμε με τη συνάρτηση abs
) είναι αρκετά μικρή για τους σκοπούς μας, π.χ., μικρότερη του $10^{-6}$ εδώ, αριθμός ο οποίος μπορεί για συντομία να γραφεί στην Python ως 1e-6.
import math
x = math.sqrt(2)
y = x*x
t = ( 2 == y ) # Εδώ συγκρίνουμε για ισότητα με το "χαζό" τρόπο
tt = ( abs(2-y) < 1e-6) # Κι εδώ συγκρίνουμε αν το y και το 2 είναι προσεγγιστικά ίσοι
print(t, tt)
Η επιστημονική γραφή ενός αριθμού είναι XXXXEYYYY
όπου XXXX
είναι ένας δεκαδικός αριθμός και YYYY
είναι ένας ακέραιος.
1e6
Μπορούμε να μετατρέψουμε όλα τα γράμματα σε ένα string σε κεφαλαία με τη μέθοδο .upper()
η οποία καλείται όπως φαινεται παρακάτω. Κάθε τύπος δεδομένων έχει κάποιες προκαθορισμένες μεθόδους (συναρτήσεις ουσιαστικά) που καλούνται με τον τρόπο που βλέπετε και κάνουν διάφορες δουλειές. Θα δούμε πολλές τέτοιες στο μάθημα.
s = "abcdef"
s.upper()
"abcdef".upper()
Τα γράμματα ενός string x
με μήκος N είναι τα x[0]
(το πρώτο γράμμα), x[1]
, ... x[N-1]
(τελευταίο γράμμα). Αν ο δείκτης είναι αρνητικός η σύμβαση είναι ότι μετράμε από το τέλος. Π.χ. το x[-1]
είναι το ίδιο με το x[N-1]
και το x[-2]
το ίδιο με το x[N-2]
.
Αν θέλουμε να πάρουμε μια υπολέξη ενός string τότε χρησιμοποιούμε ένα slice που είναι της μορφής a:b
, όπου τα a
, b
είναι ακέραιοι και το νόημα του slice είναι να πάρουμε όλους τους ακεραίους από το a
και πάνω όσο είναι μικρότεροι (αυστηρά) του b
.
x="abcdef"
print(x[0], x[1])
N = len(x)
print(x[N-1])
print(x[-1]) # Αυτό είναι το τελευταίο γράμμα του x
print(x[1:N-1]) # Εδώ παίρνουμε όλα τα γράμματα από το δεύτερο (x[1]) έως και το προτελευταίο (x[N-2])
Αν το δεύτερο μέρος του slice είναι κενό, έχουμε δηλ. ένα slice της μορφής a:
τότε θεωρούμε ότι το δεύτερο μέλος είναι το μέγιστο δυνατό, πάμε, με άλλα λόγια, από το a
μέχρι το τέλος του string. Έτσι το s[1:]
παρακάτω είναι το κομμάτι του string s
από το δεύτερο γράμμα και πέρα. Με τον παρακάτω κώδικα πετυχαίνουμε να κάνουμε κεφαλαίο μόνο το πρώτο γράμμα του string.
s = "Αβγδε"
a = s[0] # πρώτο γράμμα του s
rest = s[1:] # υπόλοιπο κομμάτι του s
S = a.upper()+rest
print(S)
Υπάρχει επίσης και η μέθοδος .lower()
στα strings που κάνει τα γράμμματα μικρά.
"δσφγδσδκφξσηδΗΞΞΞΚΗΞΛ".lower()
Εδώ βλέπουμε πώς μπορούμε να αντιστρέψουμε τα γράμματα ενός string με ένα γενικευμένο slice. Ένα γενικευμένο slice είναι της μορφής a:b:s
και σημαίνει "ξεκίνα από το a
, προχώρα με βήμα s
για όσο είσαι αυστηρά μικρότερος από b
. Ειδικά η μορφή ::-1
που εμφανίζεται εδώ, ξεκινά από το τέλος αφού το βήμα είναι αρνητικό και κατεβαίνει μέχρι την αρχή, πετυχαίνοντας έτσι να πάρει τα γράμματα του string με την ανάποδη σειρά.
'hello world'[::-1]
Εδώ θέλουμε να "κρυπτογραφήσουμε" μια λέξη με τον εξής απλοϊκό τρόπο. Παίρνουμε πρώτα όλα τα γράμματα με άρτιο δείκτη, δηλ. τα s[0], s[2], ...
(πρώτο γράμμα, τρίτο γράμμα, κλπ) και φτιάχνουμε μια λέξη που τη λέμε even
, μετά παίρνουμε τα γράμματα με περιττό δείκτη s[1], s[3], ...
και φτιάχνουμε μια λέξη odd
και στο τέλος το κρυπτογράφημα της λέξης μας είναι η συγκόλληση των δύο αυτών λέξεων.
s = "Προγραματισμός" # Για να δουλέψουν τα παρακάτω χρειάζεται η λέξη να έχει άρτιο μήκος, εξ ου και το ένα 'μ' μόνο.
even = s[::2] # Τα γράμματα με άρτιους δείκτες σε μια λέξη
odd = s[1::2] # Τα γράμματα με περιττούς δείκτες σε μια λέξη
cryptoword = even+odd # Συγκόλληση
print(cryptoword)
Εδώ αποκρυπτογραφούμε τη λέξη cryptoword
που έχει προκύψει με τον αμέσως προηγούμενο κώδικα.
Υπολογίζουμε πρώτα το μήκος N
της λέξης και μετά το μισό μήκος half = N // 2
. Αυτό είναι το πηλίκο της διαίρεσης N δια 2 και άρα είναι ακέραια ποσότητα (αν γράφαμε όμως half = N/2
τότε το half
θα ήταν float και όχι int.
Έπειτα ξεχωρίζουμε στις επόμενες δύο γραμμές το πρώτο μισό της λέξης και το ονομάζουμε even
και το δεύτερο μισό της λέξης και το ονομάζουμε odd
(και εδώ είναι που χρειαζόμαστε το μήκος της κρυπτογραφημένης λέξης να είναι άρτιο).
Στο τελευταίο κομμάτι του προγράμματος, από το reconstructed
και μετά χρησιμοποιούμε τα δύο μισά για να πάρουμε τα γράμματά τους εναλλάξ και να ανακατασκευάσουμε τη λέξη. Επειδή δεν έχουμε μάθει ακόμη αρκετά πράγματα για να καταλάβουμε αυτά που γράφονται εκεί δε θα το αναλύσουμε αυτό το κομμάτι ακόμη.
N = len(cryptoword)
half = N//2
even = cryptoword[:half]
odd = cryptoword[half:]
reconstructed=""
for i in range(half):
reconstructed = reconstructed + even[i]+odd[i]
print (reconstructed)
Ανάμεσα σε ποσότητες λογικού τύπου μπορεί κανείς να κάνει και λογικές πράξεις:
x = True
y = False
print(x and y)
print(x or y)
print(not(x or y))
Τα strings έχουν μια μέθοδο .format()
που είναι πολύ χρήσιμη στο να μορφοποιεί κανείς λέξεις από διάφορα συστατικά.
Παρακάτω αφήνουμε στο string μια "τρύπα" {}
την οποία γεμίζει μετά η μέθοδος .format()
με τα ορίσματά της.
"Μιχ{}ς".format("άλη")
Οι "τρύπες" μπορεί να είναι και παραπάνω από μία.
"Προ{}α{}σμός".format("γραμμ", "τι")
Αυτό μπορεί να είναι εξαιρετικά βοηθητικό στο να τυπώνει κανείς μηνύματα στο χρήστη.
x = 15
y = 3.4
print("Ο αριθμός", x, "συν τον αριθμό", y, "κάνει", x+y) # Με τον παλιό δύσχρηστο τρόπο
print("Ο αριθμός {} συν τον αριθμό {} κάνει {}".format(x, y, x+y)) # Με το format
print("Σήμερα είναι {}".format("Τετάρτη")) # Με το format