Τελευταία μηνύμα

#1
Python / Προγραμματισμός Προσανατολισμέ...
Τελευταίο μήνμα από Erdeh - Μαρ 14, 2026, 10:10
Ο Προγραμματισμός Προσανατολισμένος σε Αντικείμενα (Object-Oriented Programming – OOP) στην Python είναι ένας από τους πιο αποτελεσματικούς τρόπους για να κάνετε τον κώδικα σας πιο οργανωμένο, επαναχρησιμοποιήσιμο και πιο κοντά σε μοντέλα του πραγματικού κόσμου. Η Python, ως υβριδική γλώσσα που υποστηρίζει τόσο τον διαδικαστικό όσο και τον προσανατολισμένο σε αντικείμενα προγραμματισμό, καθιστά την εκμάθηση των εννοιών OOP απαραίτητη για έργα μέσου και προχωρημένου επιπέδου. Από το 2026, τα μεγάλα έργα (όπως Django, Flask, βιβλιοθήκες επιστήμης δεδομένων όπως Pandas, NumPy) και πλαίσια τεχνητής νοημοσύνης (TensorFlow, PyTorch) βασίζονται έντονα σε αρχές OOP.

Στο Google, αναζητήσεις όπως "Python OOP", "Python class", "Python inheritance", "Python polymorphism" έχουν πολύ υψηλό όγκο στην Τουρκία και παγκοσμίως. Ιδιαίτερα υποψήφιοι μηχανικοί λογισμικού, προγραμματιστές backend και επιστήμονες δεδομένων ερευνούν συχνά αυτό το θέμα. Η καλή κατανόηση του OOP σας επιτρέπει να γράφετε καθαρό κώδικα και παρέχει ευκολία συντήρησης σε μεγάλα έργα.

Γιατί Πρέπει να Μάθετε OOP στην Python; (Προοπτική 2026)
  • Μοντελοποίηση πραγματικού κόσμου: Μπορείτε να αναπαραστήσετε απευθείας αντικείμενα όπως αυτοκίνητα, άτομα, τραπεζικούς λογαριασμούς στον κώδικα.
  • Επαναχρησιμοποίηση κώδικα: Με την κληρονομικότητα (inheritance) μπορείτε να επεκτείνετε υπάρχοντα κώδικα.
  • Ευκολία συντήρησης: Αποτρέπει την πολυπλοκότητα κώδικα σε μεγάλα έργα.
  • Δημοφιλή πλαίσια: Τα μοντέλα Django, οι επεκτάσεις Flask, τα μοντέλα PyTorch βασίζονται πλήρως σε OOP.
  • Πλεονέκτημα καριέρας: Στις αγγελίες εργασίας, η γνώση "OOP principles" ζητείται συχνά.
Η υποστήριξη OOP της Python είναι πολύ ευέλικτη: Τα πάντα είναι αντικείμενα (ακόμα και int, str, list προέρχονται από κλάσεις).

Βασικές Έννοιες OOP
    1. Κλάση (Class) και Αντικείμενο (Object)
Η κλάση είναι ένα πρότυπο/blueprint. Το αντικείμενο είναι μια συγκεκριμένη περίπτωση που δημιουργείται από αυτό το πρότυπο.
class Araba:  # Ορισμός κλάσης

    def __init__(self, marka, model, yil):  # Κατασκευαστής
        self.marka = marka
        self.model = model
        self.yil = yil
        self.km = 0  # Προεπιλεγμένη ιδιότητα

    def bilgi_ver(self):  # Μέθοδος
        return f"{self.yil} {self.marka} {self.model}, KM: {self.km}"

    def sur(self, km):
        self.km += km

# Δημιουργία αντικειμένων

araba1 = Araba("Toyota", "Corolla", 2020)
araba2 = Araba("BMW", "3 Serisi", 2022)

print(araba1.bilgi_ver())  # 2020 Toyota Corolla, KM: 0
araba1.sur(150)
print(araba1.bilgi_ver())  # 2020 Toyota Corolla, KM: 150
    2. Περίκλειση (Encapsulation)
Η διατήρηση δεδομένων και μεθόδων μαζί, με περιορισμό της άμεσης πρόσβασης από έξω.
Στην Python, για ιδιωτικές ιδιότητες χρησιμοποιείται πρόθεμα _ ή __ (name mangling).
class BankaHesabi:
    def __init__(self, sahip, bakiye=0):
        self.sahip = sahip
        self.__bakiye = bakiye  # Ιδιωτική

    def para_yatir(self, miktar):
        self.__bakiye += miktar
        print(f" {miktar} € κατατέθηκαν.")  # Μεταφρασμένο σε ευρώ για παράδειγμα

    def para_cek(self, miktar):
        if self.__bakiye >= miktar:
            self.__bakiye -= miktar
            print(f" {miktar} € αναλήφθηκαν.")
        else:
            print("Ανεπαρκές υπόλοιπο!")

    def bakiye_sorgula(self):
        return self.__bakiye

hesap = BankaHesabi("Ahmet", 1000)
hesap.para_yatir(500)
hesap.para_cek(200)
print(hesap.bakiye_sorgula())  # 1300
# print(hesap.__bakiye)  # Σφάλμα (μη προσβάσιμο)

    3. Κληρονομικότητα (Inheritance)
Μια κλάση κληρονομεί ιδιότητες και μεθόδους από άλλη κλάση.
class Arac:  # Γονική/Βασική κλάση
    def __init__(self, marka):
        self.marka = marka

    def calistir(self):
        print(f"{self.marka} λειτουργεί.")

class Araba(Arac):  # Παιδική/Παράγωγη κλάση
    def __init__(self, marka, model):
        super().__init__(marka)  # Κλήση κατασκευαστή γονέα
        self.model = model

    def bilgi(self):
        print(f"{self.marka} {self.model}")

class Motosiklet(Arac):
    def __init__(self, marka):
        super().__init__(marka)

    def tekerlek_sayisi(self):
        return 2

araba = Araba("Honda", "Civic")
araba.calistir()  # Honda λειτουργεί.
araba.bilgi()  # Honda Civic


Υποστηρίζεται επίσης πολλαπλή κληρονομικότητα (multiple inheritance):

class UcanAraba(Araba, Ucabilir):  # Υποθέτουμε ότι υπάρχει κλάση Ucabilir
    pass

    4. Πολυμορφισμός (Polymorphism)
Η ίδια μέθοδος συμπεριφέρεται διαφορετικά σε διαφορετικές κλάσεις.
class Kopek:
    def ses_cikar(self):
        print("Γαβ γαβ!")

class Kedi:
    def ses_cikar(self):
        print("Νιάου!")

def hayvan_ses(hayvan):
    hayvan.ses_cikar()  # Πολυμορφισμός

hayvanlar = [Kopek(), Kedi()]
for h in hayvanlar:
    hayvan_ses(h)

# Έξοδος:
# Γαβ γαβ!
# Νιάου!

    5. Αφαίρεση (Abstraction)
Απόκρυψη περιττών λεπτομερειών. Στην Python, με το module abc δημιουργούνται αφηρημένες κλάσεις.
from abc import ABC, abstractmethod

class Sekil(ABC):  # Αφηρημένη βασική κλάση
    @abstractmethod
    def alan(self):
        pass

class Dikdortgen(Sekil):
    def __init__(self, en, boy):
        self.en = en
        self.boy = boy

    def alan(self):
        return self.en * self.boy

# sekil = Sekil()  # Σφάλμα: Η αφηρημένη κλάση δεν μπορεί να δημιουργηθεί απευθείας
d = Dikdortgen(5, 10)
print(d.alan())  # 50

Ειδικές Μέθοδοι (Magic/Dunder Methods)
Προσθέτουν ειδικές συμπεριφορές σε κλάσεις.
class Kitap:
    def __init__(self, baslik, yazar):
        self.baslik = baslik
        self.yazar = yazar

    def __str__(self):  # Για print()
        return f" {self.baslik} - {self.yazar}"

    def __len__(self):  # Για len()
        return len(self.baslik)

    def __add__(self, other):  # Για + τελεστή
        return f" {self.baslik} και {other.baslik}"

kitap1 = Kitap("1984", "George Orwell")
kitap2 = Kitap("Hayvan Çiftliği", "George Orwell")
print(kitap1)  # 1984 - George Orwell
print(len(kitap1))  # 4
print(kitap1 + kitap2)  # 1984 και Hayvan Çiftliği

Προχωρημένα Θέματα
• Property Decorator: Για getter/setter.
class Personel:
    def __init__(self, isim):
        self._isim = isim

    @property
    def isim(self):
        return self._isim

    @isim.setter
    def isim(self, yeni):
        if len(yeni) > 0:
            self._isim = yeni


• Classmethod και Staticmethod:
class Matematik:
    @classmethod
    def pi(cls):
        return 3.14159

    @staticmethod
    def topla(a, b):
        return a + b

Συμπέρασμα και Πρακτικές Συμβουλές
Το OOP είναι ένα από τα ισχυρότερα χαρακτηριστικά της Python. Αφού κατανοήσετε τα βασικά, εφαρμόστε τα σε πραγματικά έργα:

• Δημιουργήστε τη δική σας βιβλιοθήκη κλάσεων (π.χ. κλάση Χαρακτήρα για ένα παιχνίδι).
• Εξετάστε τα μοντέλα Django (πρακτική χρήση του OOP).
• Λύστε προβλήματα OOP στο LeetCode.
• Πόροι: Επίσημα έγγραφα Python (τμήμα classes), βιβλίο "Python Crash Course", tutorials OOP του Real Python.

Με αυτόν τον οδηγό, θα έχετε κατανοήσει πλήρως το OOP στην Python. Για εφαρμοσμένα παραδείγματα, αφήστε σχόλιο! Το 2026, το OOP θα σας παρέχει μεγάλο πλεονέκτημα στα μεγάλα έργα σας.
#2
Python / Ανάγνωση και Γραφή Αρχείων με ...
Τελευταίο μήνμα από Erdeh - Δεκ 20, 2025, 09:20 ΜΜ
Η Python προσφέρει μια εξαιρετικά ισχυρή και απλή δομή για τις λειτουργίες αρχείων. Οι λειτουργίες ανάγνωσης και γραφής αρχείων είναι απαραίτητες σε πολλά σενάρια, όπως η ανάλυση δεδομένων, η διαχείριση αρχείων διαμόρφωσης, η καταγραφή log ή η δημιουργία απλών εναλλακτικών βάσεων δεδομένων. Σε αυτό το άρθρο, θα εξετάσουμε λεπτομερώς τις βασικές μεθόδους λειτουργιών αρχείων στην Python, τις πιο κοινές χρησιμοποιούμενες συναρτήσεις και τις καλές πρακτικές.

Βασικό Άνοιγμα Αρχείου: Συνάρτηση open()
Στην Python, οι λειτουργίες αρχείων ξεκινούν με τη συνάρτηση open(). Αυτή η συνάρτηση δέχεται δύο βασικές παραμέτρους:
  • Διαδρομή αρχείου (file path)
  • Λειτουργία (mode): Ανάγνωση ("r"), γραφή ("w"), προσθήκη ("a"), δυαδική ("b")

Παράδειγμα:
# Ανάγνωση αρχείου κειμένου
with open("ornek.txt", "r", encoding="utf-8") as dosya:
    icerik = dosya.read()
print(icerik)


Η χρήση του μπλοκ with είναι πολύ σημαντική γιατί το αρχείο κλείνει αυτόματα και αποτρέπεται η διαρροή πόρων.
Κοινές Λειτουργίες
  • "r": Περιγραφή: Ανάγνωση (προεπιλογή). Αν το αρχείο δεν υπάρχει: Δίνει σφάλμα. Διαγράφει το υπάρχον περιεχόμενο: Όχι.
  • "w": Περιγραφή: Γραφή. Αν το αρχείο δεν υπάρχει: Δημιουργεί νέο αρχείο. Διαγράφει το υπάρχον περιεχόμενο: Ναι.
  • "a": Περιγραφή: Προσθήκη (append). Αν το αρχείο δεν υπάρχει: Δημιουργεί νέο αρχείο. Διαγράφει το υπάρχον περιεχόμενο: Όχι.
  • "r+": Περιγραφή: Και ανάγνωση και γραφή. Αν το αρχείο δεν υπάρχει: Δίνει σφάλμα. Διαγράφει το υπάρχον περιεχόμενο: Όχι.
  • "wb": Περιγραφή: Δυαδική γραφή (εικόνες, βίντεο κλπ.). Αν το αρχείο δεν υπάρχει: Δημιουργεί νέο αρχείο. Διαγράφει το υπάρχον περιεχόμενο: Ναι.

Ανάγνωση Αρχείου Γραμμή προς Γραμμή
Για μεγάλα αρχεία, είναι πιο αποδοτικό να διαβάζονται γραμμή προς γραμμή αντί να φορτώνονται ολόκληρα στη μνήμη:

with open("buyuk_dosya.txt", "r", encoding="utf-8") as dosya:
    for satir in dosya:
        print(satir.strip())  # strip() για να καθαρίσει τα κενά στην αρχή/τέλος


Ή για συγκεκριμένο αριθμό γραμμών:

with open("dosya.txt", "r", encoding="utf-8") as dosya:
    ilk_bes_satir = dosya.readlines()[:5]

Γραφή και Προσθήκη σε Αρχείο

# Δημιουργία νέου αρχείου και γραφή
with open("yeni_dosya.txt", "w", encoding="utf-8") as dosya:
    dosya.write("Αυτή είναι η πρώτη γραμμή.\n")
    dosya.write("Αυτή είναι η δεύτερη γραμμή.\n")

# Προσθήκη σε υπάρχον αρχείο
with open("yeni_dosya.txt", "a", encoding="utf-8") as dosya:
    dosya.write("Αυτή είναι η προστεθείσα γραμμή.\n")


Για γραφή πολλαπλών γραμμών με writelines():

satirlar = ["Γραμμή 1\n", "Γραμμή 2\n", "Γραμμή 3\n"]
with open("dosya.txt", "w", encoding="utf-8") as dosya:
    dosya.writelines(satirlar)

Εργασία με Αρχεία CSV
Τα αρχεία CSV (Comma Separated Values) είναι πολύ κοινά στην ανταλλαγή δεδομένων. Η ενσωματωμένη μονάδα csv της Python το κάνει εύκολο:

import csv

# Γραφή CSV
with open("veriler.csv", "w", newline="", encoding="utf-8") as dosya:
    yazar = csv.writer(dosya)
    yazar.writerow(["Όνομα", "Ηλικία", "Πόλη"])
    yazar.writerow(["Γιάννης", 30, "Αθήνα"])
    yazar.writerow(["Μαρία", 25, "Θεσσαλονίκη"])

# Ανάγνωση CSV
with open("veriler.csv", "r", encoding="utf-8") as dosya:
    okuyucu = csv.reader(dosya)
    for satir in okuyucu:
        print(satir)


Διαχείριση Σφαλμάτων
Είναι σημαντικό να συλλαμβάνονται τα σφάλματα που μπορεί να προκύψουν κατά τις λειτουργίες αρχείων:

try:
    with open('olmayan_dosya.txt', "r", encoding="utf-8") as dosya:
        print(dosya.read())
except FileNotFoundError:
    print("Το αρχείο δεν βρέθηκε!")
except PermissionError:
    print("Δεν υπάρχει άδεια πρόσβασης στο αρχείο!")
except Exception as e:
    print(f"Απροσδόκητο σφάλμα: {e}")


Καλές Πρακτικές και Συμβουλές
• Χρησιμοποιείτε πάντα encoding="utf-8" (για να αποφύγετε προβλήματα με ελληνικούς χαρακτήρες).
• Για μεγάλα αρχεία, προτιμήστε το readline() ή την προσέγγιση generator.
• Για δυαδικά αρχεία (εικόνες, PDF), χρησιμοποιήστε τις λειτουργίες "rb" ή "wb".
• Με τη μονάδα pathlib, μπορείτε να κάνετε σύγχρονη διαχείριση διαδρομών αρχείων (Python 3.4+).

Συμπέρασμα
Οι λειτουργίες ανάγνωσης και γραφής αρχείων στην Python είναι αρκετά απλές και χρησιμοποιούνται συχνά σε καθημερινές διαδικασίες ανάπτυξης. Με αυτές τις βασικές γνώσεις, μπορείτε εύκολα να πραγματοποιήσετε πολλές λειτουργίες, όπως αποθήκευση δεδομένων, καταγραφή log ή λήψη δεδομένων από εξωτερικές πηγές. Για εξάσκηση, δοκιμάστε να γράψετε μια απλή εφαρμογή σημειωματάριου!
#3
Html / Δημιουργία Πίνακα HTML: Ένας Π...
Τελευταίο μήνμα από Erdeh - Απρ 11, 2025, 12:13 ΜΜ

Οι πίνακες HTML αποτελούν έναν από τους πιο βασικούς τρόπους για την οργάνωση και παρουσίαση δεδομένων σε ιστοσελίδες. Παρά το γεγονός ότι η σύγχρονη σχεδίαση ιστοσελίδων βασίζεται συχνά σε CSS Grid ή Flexbox για τη διάταξη, οι πίνακες παραμένουν χρήσιμοι για την εμφάνιση δομημένων δεδομένων, όπως χρονοδιαγράμματα, τιμοκαταλόγους ή στατιστικά στοιχεία. Σε αυτό το άρθρο, θα εξετάσουμε πώς να δημιουργήσουμε πίνακες HTML, θα δώσουμε παραδείγματα κώδικα και θα απαντήσουμε σε συχνές ερωτήσεις μέσω μιας ενότητας FAQ.

Τι είναι ένας Πίνακας HTML;
Ένας πίνακας HTML είναι μια δομή που χρησιμοποιείται για την οργάνωση δεδομένων σε γραμμές και στήλες. Δημιουργείται με τη χρήση της ετικέτας <table> και περιλαμβάνει στοιχεία όπως <tr> (γραμμή), <th> (κεφαλίδα) και <td> (δεδομένα).

Οι πίνακες είναι ιδανικοί για την παρουσίαση δεδομένων που απαιτούν σαφή δομή, αλλά δεν συνιστώνται για τη διάταξη ολόκληρων ιστοσελίδων, καθώς αυτό μπορεί να επηρεάσει την προσβασιμότητα και την απόδοση.

Βασική Δομή ενός Πίνακα HTML
Ένας απλός πίνακας HTML περιλαμβάνει τα εξής στοιχεία:
  • <table>: Ορίζει τον πίνακα.
  • <tr>: Δημιουργεί μια γραμμή.
  • <th>: Καθορίζει μια κεφαλίδα (συνήθως με έντονη γραφή και κεντραρισμένη).
  • <td>: Περιέχει τα δεδομένα ενός κελιού.

Παράδειγμα 1: Απλός Πίνακας
<!DOCTYPE html>
<html lang="el">
<head>
    <meta charset="UTF-8">
    <title>Απλός Πίνακας HTML</title>
</head>
<body>
    <table border="1">
        <tr>
            <th>Όνομα</th>
            <th>Ηλικία</th>
            <th>Πόλη</th>
        </tr>
        <tr>
            <td>Νίκος</td>
            <td>25</td>
            <td>Αθήνα</td>
        </tr>
        <tr>
            <td>Μαρία</td>
            <td>30</td>
            <td>Θεσσαλονίκη</td>
        </tr>
    </table>
</body>
</html>

Εξήγηση:
  • Η ιδιότητα border="1" προσθέτει ένα περίγραμμα στον πίνακα για καλύτερη ορατότητα (σε σύγχρονες εφαρμογές, το στυλ καθορίζεται συνήθως με CSS).
  • Η πρώτη γραμμή (<tr>) περιέχει κεφαλίδες (<th>), ενώ οι επόμενες γραμμές περιέχουν δεδομένα (<td>).
  • Ο πίνακας εμφανίζει πληροφορίες για δύο άτομα σε τρεις στήλες.

Προηγμένες Τεχνικές: Συνδυασμός Κελιών και Στυλ
Οι πίνακες HTML μπορούν να γίνουν πιο σύνθετοι με τη χρήση ιδιοτήτων όπως colspan και rowspan για τη συγχώνευση κελιών, καθώς και με CSS για τη βελτίωση της εμφάνισης.

Παράδειγμα 2: Πίνακας με Συνδυασμό Κελιών και CSS
<!DOCTYPE html>
<html lang="el">
<head>
    <meta charset="UTF-8">
    <title>Προηγμένος Πίνακας HTML</title>
    <style>
        table {
            width: 80%;
            margin: 20px auto;
            border-collapse: collapse;
            font-family: Arial, sans-serif;
        }
        th, td {
            border: 1px solid #ccc;
            padding: 10px;
            text-align: center;
        }
        th {
            background-color: #4CAF50;
            color: white;
        }
        tr:nth-child(even) {
            background-color: #f2f2f2;
        }
    </style>
</head>
<body>
    <table>
        <tr>
            <th colspan="2">Πληροφορίες Προϊόντος</th>
            <th>Τιμή</th>
        </tr>
        <tr>
            <td>Μήλα</td>
            <td>Κόκκινα</td>
            <td>1,20€/κιλό</td>
        </tr>
        <tr>
            <td rowspan="2">Πορτοκάλια</td>
            <td>Ναβαλ</td>
            <td>1,50€/κιλό</td>
        </tr>
        <tr>
            <td>Μανταρίνια</td>
            <td>0,90€/κιλό</td>
        </tr>
    </table>
</body>
</html>

Εξήγηση:
  • Η ιδιότητα colspan="2" συγχωνεύει δύο στήλες για την κεφαλίδα "Πληροφορίες Προϊόντος".
  • Η ιδιότητα rowspan="2" επιτρέπει στο κελί "Πορτοκάλια" να καλύπτει δύο γραμμές.
  • Το CSS προσθέτει στυλ, όπως περιγράμματα, χρώματα φόντου και στοίχιση κειμένου, για να κάνει τον πίνακα πιο ελκυστικό.

Χρήσιμες Συμβουλές για Πίνακες HTML
  • Προσβασιμότητα: Χρησιμοποιήστε την ετικέτα <caption> για να δώσετε μια περιγραφή του πίνακα, π.χ., <caption>Χρονοδιάγραμμα Μαθημάτων</caption>. Αυτό βοηθά χρήστες με αναγνώστες οθόνης.
  • Στυλ με CSS: Αποφύγετε τις ενσωματωμένες ιδιότητες όπως border ή width και χρησιμοποιήστε CSS για καλύτερο έλεγχο.
  • Αποφύγετε τη χρήση για διάταξη: Οι πίνακες πρέπει να χρησιμοποιούνται μόνο για δεδομένα, όχι για τη δομή μιας ιστοσελίδας.
  • Δοκιμές σε κινητά: Βεβαιωθείτε ότι οι πίνακες σας είναι ευανάγνωστοι σε μικρές οθόνες, π.χ., με τη χρήση responsive design.


FAQ: Συχνές Ερωτήσεις
1. Πώς μπορώ να προσθέσω περίγραμμα σε έναν πίνακα χωρίς CSS;
Μπορείτε να χρησιμοποιήσετε την ιδιότητα border="1" στην ετικέτα <table>, αλλά συνιστάται η χρήση CSS για καλύτερο έλεγχο, π.χ., border: 1px solid black;.

2. Τι είναι η ιδιότητα border-collapse στο CSS;
Η ιδιότητα border-collapse: collapse; συγχωνεύει τα περιγράμματα των κελιών, ώστε να μην εμφανίζονται διπλά περιγράμματα μεταξύ τους.

3. Μπορώ να δημιουργήσω πίνακα χωρίς κεφαλίδες (<th>);
Ναι, μπορείτε να χρησιμοποιήσετε μόνο <td> για τα δεδομένα, αλλά οι κεφαλίδες βοηθούν στην καλύτερη κατανόηση του περιεχομένου.

4. Πώς κάνω έναν πίνακα responsive;
Μπορείτε να χρησιμοποιήσετε CSS τεχνικές, όπως overflow-x: auto; για οριζόντια κύλιση σε μικρές οθόνες, ή να μετατρέψετε τον πίνακα σε κατακόρυφη διάταξη με media queries.

5. Πώς προσθέτω χρώματα σε συγκεκριμένες γραμμές ή κελιά;
Χρησιμοποιήστε CSS επιλογείς, όπως tr:nth-child(even) για εναλλασσόμενα χρώματα ή td:first-child για συγκεκριμένα κελιά.

Συμπέρασμα
Οι πίνακες HTML είναι ένα ισχυρό εργαλείο για την οργάνωση δεδομένων σε ιστοσελίδες. Με τη σωστή χρήση ετικετών όπως <table>, <tr>, <th> και <td>, καθώς και με τη βοήθεια CSS για στυλ, μπορείτε να δημιουργήσετε πίνακες που είναι τόσο λειτουργικοί όσο και ελκυστικοί. Επιπλέον, η προσθήκη χαρακτηριστικών όπως colspan, rowspan και <caption> προσφέρει μεγαλύτερη ευελιξία και προσβασιμότητα.
#4
Php / PHP Συναρτήσεις Ελέγχου και Στ...
Τελευταίο μήνμα από Erdeh - Απρ 11, 2025, 12:09 ΜΜ
Οι συναρτήσεις ελέγχου και οι στατικές μεταβλητές είναι δύο σημαντικά χαρακτηριστικά της PHP που βοηθούν τους προγραμματιστές να δημιουργούν πιο οργανωμένο και αποδοτικό κώδικα. Σε αυτό το άρθρο, θα εξετάσουμε τι είναι οι συναρτήσεις ελέγχου, πώς λειτουργούν οι στατικές μεταβλητές και πώς μπορούν να χρησιμοποιηθούν μαζί. Θα συμπεριλάβουμε παραδείγματα κώδικα και μια ενότητα FAQ για να καλύψουμε τις πιο συνηθισμένες απορίες.

Τι είναι οι Συναρτήσεις Ελέγχου στην PHP;
Οι συναρτήσεις ελέγχου στην PHP αναφέρονται σε λειτουργίες που χρησιμοποιούνται για να ελέγχουν τη ροή του προγράμματος, όπως η εκτέλεση συνθηκών, η επανάληψη ενεργειών ή η διαχείριση δεδομένων. Παραδείγματα περιλαμβάνουν τις if, foreach, while, καθώς και συναρτήσεις που ελέγχουν την ύπαρξη ή την εγκυρότητα δεδομένων, όπως η isset() ή η empty().

Οι συναρτήσεις ελέγχου είναι απαραίτητες για τη δημιουργία δυναμικών εφαρμογών, καθώς επιτρέπουν στον κώδικα να λαμβάνει αποφάσεις με βάση τις εισόδους ή τις συνθήκες.

Τι είναι οι Στατικές Μεταβλητές στην PHP;
Οι στατικές μεταβλητές είναι ειδικές μεταβλητές που διατηρούν την τιμή τους μεταξύ διαφορετικών κλήσεων μιας συνάρτησης. Όταν δηλώνεται μια μεταβλητή ως static μέσα σε μια συνάρτηση, η τιμή της δεν επαναφέρεται μετά το τέλος της εκτέλεσης της συνάρτησης, όπως συμβαίνει με τις κανονικές τοπικές μεταβλητές.

Αυτό τις καθιστά ιδανικές για περιπτώσεις όπου θέλουμε να παρακολουθούμε δεδομένα κατά τη διάρκεια πολλαπλών κλήσεων, όπως μετρητές ή καταστάσεις.

Παράδειγμα Κώδικα: Συνδυασμός Συναρτήσεων Ελέγχου και Στατικών Μεταβλητών
Ας δούμε πώς μπορούμε να συνδυάσουμε αυτά τα δύο χαρακτηριστικά σε ένα πρακτικό παράδειγμα.

Παράδειγμα 1: Μετρητής Επισκέψεων με Στατική Μεταβλητή
<?php
function countVisitors() {
   static
$visitorCount = 0; // Στατική μεταβλητή
   
$visitorCount++; // Αυξάνουμε τον μετρητή

   // Έλεγχος συνθήκης
   
if ($visitorCount == 1) {
       echo
"Καλώς ήρθες! Είσαι ο πρώτος επισκέπτης!";
   } else {
       echo
"Αριθμός επισκέψεων: $visitorCount";
   }
}

// Κλήση της συνάρτησης πολλές φορές
countVisitors(); // Εμφανίζει: Καλώς ήρθες! Είσαι ο πρώτος επισκέπτης!
echo "<br>";
countVisitors(); // Εμφανίζει: Αριθμός επισκέψεων: 2
echo "<br>";
countVisitors(); // Εμφανίζει: Αριθμός επισκέψεων: 3
?>

Εξήγηση:
  • Η μεταβλητή $visitorCount δηλώνεται ως static, οπότε διατηρεί την τιμή της μεταξύ των κλήσεων.
  • Χρησιμοποιούμε μια συνθήκη if για να ελέγξουμε αν είναι η πρώτη επίσκεψη.
  • Σε κάθε κλήση της συνάρτησης, ο μετρητής αυξάνεται και εμφανίζεται το κατάλληλο μήνυμα.

Παράδειγμα 2: Έλεγχος Δεδομένων Χρήστη
<?php
function validateUser($username) {
   static
$attempts = 0; // Καταγράφουμε τις προσπάθειες
   
$attempts++;

   
// Έλεγχος εισόδου
   
if (empty($username)) {
       return
"Παρακαλώ εισάγετε όνομα χρήστη. Προσπάθειες: $attempts";
   } elseif (
strlen($username) < 3) {
       return
"Το όνομα χρήστη πρέπει να έχει τουλάχιστον 3 χαρακτήρες. Προσπάθειες: $attempts";
   } else {
       return
"Καλώς ήρθες, $username! Προσπάθειες: $attempts";
   }
}

// Δοκιμές
echo validateUser(""); // Εμφανίζει: Παρακαλώ εισάγετε όνομα χρήστη. Προσπάθειες: 1
echo "<br>";
echo
validateUser("ab"); // Εμφανίζει: Το όνομα χρήστη πρέπει να έχει τουλάχιστον 3 χαρακτήρες. Προσπάθειες: 2
echo "<br>";
echo
validateUser("Nikos"); // Εμφανίζει: Καλώς ήρθες, Nikos! Προσπάθειες: 3
?>

Εξήγηση:
  • Η συνάρτηση validateUser χρησιμοποιεί μια στατική μεταβλητή $attempts για να παρακολουθεί τις προσπάθειες.
  • Οι συναρτήσεις ελέγχου empty() και strlen() βοηθούν στον έλεγχο της εγκυρότητας του ονόματος χρήστη.
  • Η συνθήκη if-elseif-else καθορίζει το μήνυμα που επιστρέφεται.

Πότε να Χρησιμοποιούμε Στατικές Μεταβλητές;
Οι στατικές μεταβλητές είναι χρήσιμες σε περιπτώσεις όπως:
  • Μετρητές: Όταν θέλουμε να παρακολουθούμε τον αριθμό των κλήσεων μιας συνάρτησης.
  • Κατάσταση: Όταν χρειάζεται να διατηρήσουμε μια κατάσταση μεταξύ κλήσεων.
  • Προσωρινή αποθήκευση: Όταν θέλουμε να αποθηκεύσουμε δεδομένα για επαναχρησιμοποίηση χωρίς να τα επαναϋπολογίσουμε.

Προσοχή: Η υπερβολική χρήση στατικών μεταβλητών μπορεί να κάνει τον κώδικα πιο δύσκολο στη συντήρηση, καθώς οι τιμές τους παραμένουν στη μνήμη.

FAQ: Συχνές Ερωτήσεις
1. Ποια είναι η διαφορά μεταξύ στατικής και κανονικής μεταβλητής;
Μια κανονική τοπική μεταβλητή καταστρέφεται μετά την εκτέλεση της συνάρτησης, ενώ μια στατική μεταβλητή διατηρεί την τιμή της μεταξύ κλήσεων.

2. Μπορώ να χρησιμοποιήσω στατικές μεταβλητές εκτός συναρτήσεων;
Όχι, οι στατικές μεταβλητές έχουν νόημα μόνο μέσα σε συναρτήσεις ή μεθόδους κλάσεων. Εκτός συναρτήσεων, μπορείτε να χρησιμοποιήσετε παγκόσμιες μεταβλητές ή σταθερές.

3. Είναι οι στατικές μεταβλητές ασφαλείς σε πολυνηματικές εφαρμογές;
Η PHP δεν υποστηρίζει εγγενώς πολυνηματικότητα (multithreading), αλλά σε περιβάλλοντα με πολλαπλές αιτήσεις (π.χ., web server), κάθε αίτηση εκτελείται ανεξάρτητα, οπότε οι στατικές μεταβλητές είναι γενικά ασφαλείς.

4. Πώς μπορώ να επαναφέρω μια στατική μεταβλητή;
Μπορείτε να την επαναφέρετε ρητά μέσα στη συνάρτηση, π.χ., static $count = 0; $count = 0;.

5. Ποιες συναρτήσεις ελέγχου είναι πιο συνηθισμένες στην PHP;
Μερικές από τις πιο δημοφιλείς είναι οι isset(), empty(), is_array(), is_string(), in_array() και array_key_exists().

Συμπέρασμα
Οι συναρτήσεις ελέγχου και οι στατικές μεταβλητές είναι ισχυρά εργαλεία στην PHP που επιτρέπουν τη δημιουργία πιο έξυπνου και δυναμικού κώδικα. Οι συναρτήσεις ελέγχου βοηθούν στη λήψη αποφάσεων, ενώ οι στατικές μεταβλητές προσφέρουν έναν τρόπο να διατηρούμε δεδομένα μεταξύ κλήσεων συναρτήσεων. Με σωστή χρήση, μπορούν να βελτιώσουν την απόδοση και τη λειτουργικότητα των εφαρμογών σας.
#5
Python / Πρακτικές Συναρτήσεις στην Pyt...
Τελευταίο μήνμα από Erdeh - Απρ 02, 2025, 10:05 ΜΜ

Η Python είναι μια από τις πιο δημοφιλείς γλώσσες προγραμματισμού, χάρη στην απλότητα και την ευελιξία της. Ένα από τα βασικά στοιχεία που κάνουν την Python τόσο ισχυρή είναι οι πρακτικές συναρτήσεις (functions), οι οποίες επιτρέπουν στους προγραμματιστές να οργανώνουν τον κώδικα, να επαναχρησιμοποιούν λογική και να βελτιώνουν την αναγνωσιμότητα. Σε αυτό το άρθρο, θα εξερευνήσουμε πώς να δημιουργήσετε και να χρησιμοποιήσετε πρακτικές συναρτήσεις στην Python, με παραδείγματα κώδικα και βέλτιστες πρακτικές, ενώ παράλληλα το περιεχόμενο είναι 
βελτιστοποιημένο για SEO.

Τι Είναι οι Πρακτικές Συναρτήσεις στην Python;
Οι συναρτήσεις στην Python είναι μπλοκ κώδικα που εκτελούν μια συγκεκριμένη εργασία και μπορούν να καλεστούν όποτε χρειάζεται. Με τη χρήση της λέξης-κλειδιού def, μπορείτε να ορίσετε τη δική σας συνάρτηση. Οι πρακτικές συναρτήσεις είναι ιδιαίτερα χρήσιμες για:
  • Μείωση της επανάληψης κώδικα (DRY - Don't Repeat Yourself).
  • Απλοποίηση σύνθετων προβλημάτων.
  • Δοκιμή και συντήρηση κώδικα.

Πώς να Δημιουργήσετε μια Βασική Συνάρτηση
Ας ξεκινήσουμε με ένα απλό παράδειγμα:

def xairetismos(όνομα):
    return f"Γειά σου, {όνομα}!"

# Κλήση της συνάρτησης
print(xairetismos("Μαρία"))  # Έξοδος: Γειά σου, Μαρία!


Σε αυτό το παράδειγμα:
  • Η xairetismos είναι το όνομα της συνάρτησης.
  • Το όνομα είναι μια παράμετρος.
  • Η λέξη return επιστρέφει το αποτέλεσμα.

Πρακτικές Συναρτήσεις με Προεπιλεγμένες Τιμές
Μπορείτε να ορίσετε προεπιλεγμένες τιμές για τις παραμέτρους, ώστε η συνάρτηση να λειτουργεί ακόμα κι αν δεν δοθεί κάποια είσοδος.

def ypologismos_posou(τιμή, φόρος=0.24):
    τελικό_ποσό = τιμή * (1 + φόρος)
    return f"Το τελικό ποσό είναι: {τελικό_ποσό:.2f}€"

print(ypologismos_posou(100))        # Έξοδος: Το τελικό ποσό είναι: 124.00€
print(ypologismos_posou(100, 0.10))  # Έξοδος: Το τελικό ποσό είναι: 110.00€


Εδώ, ο φόρος έχει προεπιλεγμένη τιμή 0.24 (24%), αλλά μπορεί να αλλάξει κατά την κλήση.

Χρήση Πολλαπλών Παραμέτρων και *args, **kwargs
Για πιο ευέλικτες συναρτήσεις, η Python προσφέρει τα *args και **kwargs:
  • *args: Για μεταβλητό αριθμό μη ονομασμένων ορισμάτων.
  • **kwargs: Για μεταβλητό αριθμό ονομασμένων ορισμάτων.

Παράδειγμα:

def synoliko_arithmo(*args):
    return sum(args)

def plirofories_pelati(**kwargs):
    for klidi, timi in kwargs.items():
        print(f"{klidi}: {timi}")

# Κλήση συναρτήσεων
print(synoliko_arithmo(1, 2, 3, 4))  # Έξοδος: 10
plirofories_pelati(όνομα="Γιάννης", ηλικία=30, πόλη="Αθήνα")
# Έξοδος:
# όνομα: Γιάννης
# ηλικία: 30
# πόλη: Αθήνα



Λειτουργίες Lambda: Σύντομες και Πρακτικές
Οι συναρτήσεις lambda είναι ανώνυμες συναρτήσεις που χρησιμοποιούνται για απλές εργασίες.

# Παράδειγμα: Υπολογισμός τετραγώνου
tetragono = lambda x: x ** 2
print(tetragono(5))  # Έξοδος: 25

# Χρήση με filter
arithmoi = [1, 2, 3, 4, 5, 6]
monoi = list(filter(lambda x: x % 2 != 0, arithmoi))
print(monoi)  # Έξοδος: [1, 3, 5]



Βέλτιστες Πρακτικές για Συναρτήσεις στην Python
  • Ονόματα με νόημα: Χρησιμοποιήστε περιγραφικά ονόματα, π.χ. ypologismos_posou αντί για func1.
  • Μικρό μέγεθος: Κρατήστε τις συναρτήσεις σύντομες και εστιασμένες σε μία εργασία.
  • Σχόλια: Προσθέστε σχόλια ή docstrings για να εξηγήσετε τη λειτουργία.

    def prosthesi(a, b):
        """Προσθέτει δύο αριθμούς και επιστρέφει το άθροισμα."""
        return a + b
  • Αποφυγή παρενεργειών: Μην τροποποιείτε εξωτερικές μεταβλητές, αν δεν είναι απαραίτητο.

Γιατί να Μάθετε Πρακτικές Συναρτήσεις στην Python;
Η κατανόηση των συναρτήσεων είναι απαραίτητη για:
  • Ανάπτυξη εφαρμογών και αυτοματοποιήσεων.
  • Εργασία με βιβλιοθήκες όπως Pandas, NumPy και Django.
  • Βελτίωση της αποδοτικότητας του κώδικα.

Είτε είστε αρχάριος είτε έμπειρος προγραμματιστής, οι πρακτικές συναρτήσεις θα σας βοηθήσουν να γράψετε καθαρότερο και πιο αποδοτικό κώδικα.

Συμπέρασμα
Οι πρακτικές συναρτήσεις στην Python είναι ένα ισχυρό εργαλείο που κάθε προγραμματιστής πρέπει να κατανοήσει. Από απλές εργασίες όπως ο χαιρετισμός μέχρι πολύπλοκους υπολογισμούς, οι συναρτήσεις σας δίνουν τη δυνατότητα να χτίσετε κώδικα που είναι ταυτόχρονα λειτουργικός και επαναχρησιμοποιήσιμος. Δοκιμάστε τα παραδείγματα που δόθηκαν και πειραματιστείτε με τις δικές σας ιδέες!
#6
Kotlin / Δέσμευση δεδομένων με Kotlin: ...
Τελευταίο μήνμα από Erdeh - Απρ 02, 2025, 10:02 ΜΜ
Τι είναι το Data Binding στο Kotlin;
Το Data Binding είναι μια ισχυρή βιβλιοθήκη της Android Jetpack που επιτρέπει στους προγραμματιστές να συνδέουν απευθείας τα δεδομένα της εφαρμογής με τη διεπαφή χρήστη (UI) με τρόπο απλό και αποδοτικό. Όταν χρησιμοποιείται με το Kotlin, το Data Binding μειώνει τον κώδικα boilerplate, βελτιώνει την αναγνωσιμότητα και διευκολύνει τη συντήρηση της εφαρμογής. Σε αυτό το άρθρο, θα εξηγήσουμε πώς να χρησιμοποιήσετε το Data Binding με το Kotlin, με παραδείγματα κώδικα και βέλτιστες πρακτικές, σε μια SEO-φιλική μορφή στα Ελληνικά.

Γιατί να χρησιμοποιήσετε το Data Binding;
  • Απλοποίηση κώδικα: Αντί να χρησιμοποιείτε findViewById, μπορείτε να συνδέσετε τα views απευθείας με τις μεταβλητές σας.
  • Αυτόματη ενημέρωση UI: Όταν τα δεδομένα αλλάζουν, η διεπαφή χρήστη ενημερώνεται αυτόματα.
  • Καλύτερη απόδοση: Μειώνει την ανάγκη για χειροκίνητες ενημερώσεις UI.
  • Συμβατότητα με MVVM: Ενσωματώνεται τέλεια με την αρχιτεκτονική Model-View-ViewModel.

Πώς να ρυθμίσετε το Data Binding στο Kotlin
1. Ενεργοποίηση του Data Binding
Προσθέστε την παρακάτω ρύθμιση στο αρχείο build.gradle (Module: app):

android {
    ...
    buildFeatures {
        dataBinding true
    }
}


Συγχρονίστε το έργο σας μετά την προσθήκη αυτής της γραμμής.

2. Δημιουργία Layout με Data Binding
Τα αρχεία XML πρέπει να περικλείονται σε ένα <layout> tag για να ενεργοποιηθεί το Data Binding. Παράδειγμα:

<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable
            name="user"
            type="com.example.User" />
    </data>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:gravity="center">
        <TextView
            android:id="@+id/nameTextView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.name}" />
    </LinearLayout>
</layout>


Εδώ, η μεταβλητή user συνδέεται με το TextView μέσω της ιδιότητας android:text="@{user.name}".

3. Δημιουργία Μοντέλου Δεδομένων
Δημιουργήστε μια κλάση δεδομένων (data class) στο Kotlin:

package com.example

data class User(val name: String)


4. Σύνδεση Data Binding στην Activity
Στην Activity σας, χρησιμοποιήστε το Data Binding για να συνδέσετε τα δεδομένα με το layout:

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.example.databinding.ActivityMainBinding // Αυτόματη δημιουργία από το Data Binding

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        // Ορισμός δεδομένων
        val user = User("Πέτρος")
        binding.user = user
    }
}


Σε αυτό το παράδειγμα, το ActivityMainBinding δημιουργείται αυτόματα από το όνομα του layout (π.χ. activity_main.xml). Η μεταβλητή user συνδέεται με το layout και το TextView εμφανίζει το όνομα "Πέτρος".

Παράδειγμα με Δυναμική Ενημέρωση
Αν θέλετε τα δεδομένα να ενημερώνονται δυναμικά, μπορείτε να χρησιμοποιήσετε το Observable ή το LiveData. Ακολουθεί ένα παράδειγμα με ObservableField:

1. Ενημέρωση του Μοντέλου

import androidx.databinding.ObservableField

class User {
    val name = ObservableField<String>()

    constructor(name: String) {
        this.name.set(name)
    }
}


2. Ενημέρωση της Activity

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        val user = User("Μαρία")
        binding.user = user

        // Ενημέρωση δεδομένων μετά από 2 δευτερόλεπτα
        Handler(Looper.getMainLooper()).postDelayed({
            user.name.set("Αννα")
        }, 2000)
    }
}


Σε αυτό το παράδειγμα, το TextView εμφανίζει αρχικά "Μαρία" ve μετά από 2 δευτερόλεπτα ενημερώνεται αυτόματα σε "Αννα".

Πλεονεκτήματα του Data Binding
  • Λιγότερος κώδικας: Δεν χρειάζεται να γράφετε επαναλαμβανόμενο κώδικα για ενημερώσεις UI.
  • Ασφάλεια τύπων: Το Kotlin και το Data Binding μαζί εξασφαλίζουν λιγότερα runtime σφάλματα.
  • Εύκολη ενσωμάτωση: Λειτουργεί άψογα με ViewModel και LiveData.

Συμπέρασμα
Το Kotlin Data Binding είναι ένα απαραίτητο εργαλείο για κάθε Android προγραμματιστή που θέλει να δημιουργήσει αποδοτικές και εύχρηστες εφαρμογές. Με τη σύνδεση δεδομένων απευθείας στο UI, μπορείτε να εξοικονομήσετε χρόνο και να βελτιώσετε την ποιότητα του κώδικα σας. Ελπίζουμε ότι αυτός ο οδηγός σας βοήθησε να κατανοήσετε τη χρήση του Data Binding με το Kotlin. Αν έχετε απορίες ή χρειάζεστε περισσότερα παραδείγματα, αφήστε ένα σχόλιο!
#7
C# / C # αναζήτηση ενός πίνακα (Μάθ...
Τελευταίο μήνμα από Erdeh - Νε 21, 2024, 11:15
#8
C# / C# Κατασκευαστής (Πρακτικό Μάθ...
Τελευταίο μήνμα από Erdeh - Νε 21, 2024, 11:15
#9
SQL / truncate () MySQL αριθμητική σ...
Τελευταίο μήνμα από Erdeh - Νε 21, 2024, 11:14
#10
SQL / abs () MySQL αριθμητική λειτου...
Τελευταίο μήνμα από Erdeh - Νε 21, 2024, 11:14