Συζήτηση
Γεια χαρά, Επισκέπτης
Όνομα χρήστη: Κωδικός: Να με θυμάσαι

ΘΕΜΑ: Δημιουργία απλού Τηλεφωνικού Καταλόγου

Δημιουργία απλού Τηλεφωνικού Καταλόγου 14 Χρόνια 4 Μήνες πριν #520

  • malos
  • Το Άβαταρ του/της malos
  • Αποσυνδεμένος
  • py____
  • Δημοσιεύσεις: 23
Παιδιά Καλησπέρα!
Πολύ καλό το site και μπράβο για το εγχείρημα!

Θα επιθυμούσα μία διευκρίνηση αν είναι δυνατό.
Επειδή είμαι αρχάριος στην python (και η βασική επαφή μου είναι από τα μαθήματα που γίναν από το forum του ubuntu-gr ) .....
...Μήπως μπορώ να ρωτάω εδώ κάποιες γενικές απορίες ( ή και ειδικές ) ;
Το λέω γιατί δεν έχω καταλάβει αν συζητάτε μόνο θέματα ανάπτυξης των ήδη προχωρημένων θεμάτων - προγραμμάτων κλπ.

Στην περίπτωση που μου επιτρέπεται να ρωτάω
προχωρώ στο εξής :

Σχετικά με τις κλάσεις και τα αντικείμενα :
Είναι δυνατό μία μεταβλητή ( δυναμική ! να κυμαίνεται ας πούμε στο εύρος μιας λίστας ),
να αντιστοιχείται σε αντικείμενα που αυτή η ίδια μεταβλητή τα ορίζει ; ( τα δημιουργεί ας πούμε ! ).

Πειραματίστηκα με κάτι δικό μου ( για άσκηση )
και προσπάθησα να φτιάξω μία αντζέτα.
Φαντάζομαι ότι θα είναι πανεύκολο με τα τα λεξικά ως δομές δεδομένων. Δεν έχω παίξει όμως καθόλου με λεξικά. Θα ασχοληθώ τώρα βέβαια και νιώθω πως θα το καταφέρω αυτό που θέλω.

Μέχρι τότε όμως .. έχω την απορία ... μπορώ να κάνω κάτι με τον παρακάτω κώδικα ;
#!/usr/bin/python3
class egrafes:
 
		def __init__(self, onoma, tel, mail, odos):
			self.onoma = onoma
			self.tel = tel
			self.mail = mail
			self.odos = odos
 
		def exodos(self):
			print('{0} : {1} -- {2} -- {3}'.format(self.onoma, self.tel, self.mail, self.odos))
 
 
synolo = [0]		
onomata = []
tilefona = []
taxydromeia = []
dromoi = []
i = 0
def run():
	while True:
 
		global i
		global onomata
		global tilefona
		global taxydromeia
		global dromoi
		global synolo
 
		name = input('Ονοματεπώνυμο : ')
		onomata.append(name)
		print(onomata)
 
		tilefono = input('Τηλέφωνο : ')
		tilefona.append(tilefono)		
 
		email = input('mail : ')
		taxydromeia.append(email)
 
		dromos = input('Διεύθυνση : ')
		dromoi.append(dromos)
 
		i = i + 1
		print(i)
		synolo.append(i)
		print('το σύνολο είναι : ', synolo)
		zz = input('Συνέχεια ; "ν" ή "ο" ')
		if zz == 'ο' or zz == 'o':
			break
 
run()
 
aaa = egrafes(onomata[0], tilefona[0], taxydromeia[0], dromoi[0])
aaa.exodos()
aab = egrafes(onomata[1], tilefona[1], taxydromeia[1], dromoi[1])
aab.exodos	()	
 
######### Προσπάθησα και κάτι τέτοια !!! #############
for seira in synolo:
	aaa = egrafes(onomata[seira], tilefona[seira], taxydromeia[seira], dromoi[seira])
 
########## Ή ακόμα κι αυτό .... προσπαθώντας η μεταβλητή aaa να αντιστοιχείται σε πολλά αντικείμενα #####
for ccc in synolo:
	aaa = ('antikeimeno{0}'.format(ccc))
 
	### και μετά κάτι σαν ###
aaa = egrafes(onomata[seira], tilefona[seira], taxydromeia[seira], dromoi[seira])

Δηλαδή μπορώ χωρίς λεξικά αλλά μόνο με λίστες ;
Το aaa = egrafes(onomata[seira], tilefona[seira], taxydromeia[seira], dromoi[seira]) ως αντικείμενο της κλάσης ... το δημιουργεί αποκλειστικά ο χρήστης ; Υπάρχει δημιουργία αυτόματη των αντικειμένων ; Έτσι ώστε με κάποιον μετρητή εγγραφών να υπάρχουν αυτόματα και τόσα αντικείμενα. Είχα σκοπό να τα γράφω σε εξωτερικό αρχείο και να το ενημερώνω κάοε φορά.

Σας ευχαριστώ πολύ και πάλι συγχαρητήρια !
Τελευταία διόρθωση: 14 Χρόνια 4 Μήνες πριν από myle.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Απ:Ερώτηση αρχαρίου 14 Χρόνια 4 Μήνες πριν #522

  • myle
  • Το Άβαταρ του/της myle
  • Αποσυνδεμένος
  • Admin
  • Δημοσιεύσεις: 467
  • Ληφθείσες Ευχαριστίες 15
Καλώς ήρθες! Είναι πολύ ευχάριστο το ότι εκφράζεις την απορία σου!

Δεν είμαι σίγουρος αν κατάλαβα τι εννοείς, αλλά μήπως σου κάνει κάτι τέτοιο;
for name, telephone, mail, street in zip(onomata, tilefona, taxydromeia, dromoi):
  aaa = egrafes(name, telephone, mail, street)
  aaa.exodos()

Πρόσθεσε το στο τέλος του κώδικα σου για να δεις τι κάνει.

Η συνάρτηση zip δημιουργεί μια tuple με:
το 1ο στοιχείο από το onomata,
το 1ο στοιχείο από το tilefona,
το 1ο στοχείο από το taxydromeia,
το 1ο στοιχείο από το dromoi
και την επιστρέφει.
Στην συνέχεια το ίδιο για το 2ο στοιχείο κοκ μέχρι να εξαντληθούν τα στοιχεία στις λίστες onomata, tilefona, taxydromeia, dromoi.
Στην συνέχεια αυτά ανατίθενται στις μεταβλητές:
name, telephone, mail, street
Πρώτα αυτά που αφορούν το 1ο στοιχείο από κάθε λίστα, στην συνέχεια το 2ο κοκ.
Καλείται ο δημιουργός της κλάσης εγγραφές (συνάρτηση __init__()) με αυτά τα ορίσματα. Δημιουργείται ένα καινούργιο αντικείμενο. Αυτό ανατίθεται πάντα στην μεταβλητή aaa, και στην συνέχεια τυπώνεται.
Αν θέλεις να τα κρατήσεις στην μνήμη όλα τα αντικείμενα, πρέπει να κάνεις το aaa λίστα.

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

Καλώς ήρθες και πάλι!
«Αν υποθέσουμε ότι αυτό είναι δυνατό, (να μεταδώσουμε τη σοφία παντού) τότε ειλικρινά ο τρόπος ζωής των θεών θα περάσει στους ανθρώπους. Τα πάντα θα είναι γεμάτα...
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Απ:Ερώτηση αρχαρίου 14 Χρόνια 4 Μήνες πριν #524

  • malos
  • Το Άβαταρ του/της malos
  • Αποσυνδεμένος
  • py____
  • Δημοσιεύσεις: 23
@myle Σ' ευχαριστώ πολύ !
Χαίρομαι που μορώ να ρωτάω ! Υπόσχομαι όμως να μην το παρακάνω (τουλάχιστον να ψάχνω αρκετά πρώτα ).
Κάποια στιγμή το forum αυτό θα ανέβει πολύ.
Θα υπάρχουν φαντάζομαι αρκετοί έμπειροι γνώστες
και developers διαφόρων πραγμάτων! Δεν θα μπορώ δυστυχώς να συμμετέχω σε ανάπτυξη :blush: Αλλά μαθαίνω γρήγορα πιστεύω ... και που ξέρεις :cheer:

Ναι ! Με ενδιαφέρει ένα refactor. Μου κάνει καλό και η συζήτηση (Τα εξήγησες άψογα και με κινητοποιείς να ανατρέχω στο documentation για "άγνωστες λέξεις" :laugh: ) (zip)
Αν έχεις διάθεση να ασχοληθείς θα σου είμαι υπόχρεος !
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Απ:Ερώτηση αρχαρίου 14 Χρόνια 4 Μήνες πριν #525

  • myle
  • Το Άβαταρ του/της myle
  • Αποσυνδεμένος
  • Admin
  • Δημοσιεύσεις: 467
  • Ληφθείσες Ευχαριστίες 15
Ένα πρώτο στάδιο είναι:
class egrafes:
  def __init__(self, onoma, tel, mail, odos):
    self.onoma = onoma
    self.tel = tel
    self.mail = mail
    self.odos = odos
 
  def exodos(self):
    print('{0} : {1} -- {2} -- {3}'.format(self.onoma, self.tel, self.mail, self.odos))
 
onomata = []
tilefona = []
taxydromeia = []
dromoi = []
 
def run():
  while True:
 
    global onomata
    global tilefona
    global taxydromeia
    global dromoi
 
    name = input('Ονοματεπώνυμο : ')
    onomata.append(name)
    print(onomata)
 
    tilefono = input('Τηλέφωνο : ')
    tilefona.append(tilefono)               
 
    email = input('mail : ')
    taxydromeia.append(email)
 
    dromos = input('Διεύθυνση : ')
    dromoi.append(dromos)
 
    # the exit condition of the loop
    zz = input('Συνέχεια ; "ν" ή "ο" ')
    if zz == 'ο' or zz == 'o':
      break
 
run()
 
for name, telephone, mail, street in zip(onomata, tilefona, taxydromeia, dromoi):
  aaa = egrafes(name, telephone, mail, street)
  aaa.exodos()

όπου έχουμε αφαιρέσει τον κώδικα που δεν χρειάζεται πια.

Στην συνέχεια, τροποποιούμε την run() έτσι ώστε να δέχεται την είσοδο από τον χρήστη και να δημιουργεί αυτόματα τα αντικείμενα εγγραφές στον τηλεφωνικό κατάλογο.
class egrafes:
  def __init__(self, onoma, tel, mail, odos):
    self.onoma = onoma
    self.tel = tel
    self.mail = mail
    self.odos = odos
 
  def exodos(self):
    print('{0} : {1} -- {2} -- {3}'.format(self.onoma, self.tel, self.mail, self.odos))
 
def run():
  # a list with all the entries in the phonebook
  aaa = []
 
  while True:
    # user input
    # TODO: some validation of the input
    name = input('Ονοματεπώνυμο : ')
    tilefono = input('Τηλέφωνο : ')        
    email = input('mail : ')
    dromos = input('Διεύθυνση : ')
 
    # create the next entry of the phonebook according to the user's input
    x = egrafes(name, tilefono, email, dromos)
    aaa.append(x)
 
    # the exit condition of the loop
    zz = input('Συνέχεια ; "ν" ή "ο" ')
    if zz == 'ο' or zz == 'o':
      break
 
  return aaa
 
 
 
for entry in run():
  entry.exodos()

Στην συνέχεια εξομοιώνουμε την ίδια λειτουργία χρησιμοποιώντας generators ώστε να μην χρειάζεται να παράγουμε όλη την λίστα πριν την επεξεργαστούμε. Έτσι, έχουμε αποδοτικότερη διαχείρηση μνήμης
class egrafes:
  def __init__(self, onoma, tel, mail, odos):
    self.onoma = onoma
    self.tel = tel
    self.mail = mail
    self.odos = odos
 
  def exodos(self):
    print('{0} : {1} -- {2} -- {3}'.format(self.onoma, self.tel, self.mail, self.odos))
 
def run():
  while True:
    # user input
    # TODO: some validation of the input
    name = input('Ονοματεπώνυμο : ')
    tilefono = input('Τηλέφωνο : ')        
    email = input('mail : ')
    dromos = input('Διεύθυνση : ')
 
    # the exit condition of the loop
    zz = input('Συνέχεια ; "ν" ή "ο" ')
 
    # create the next entry of the phonebook according to the user's input
    x = egrafes(name, tilefono, email, dromos)
    yield x
    if zz == 'ο' or zz == 'o':
      break
 
 
a = []
for entry in run():
  a.append(entry)
 
for entry in a:
  entry.exodos()

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

Επίσης, φτιάχνουμε την συνάρτηση main() η οποία καλείται μόλις εκτελούμε το πρόγραμμα μας.
class egrafes:
  def __init__(self, onoma, tel, mail, odos):
    self.onoma = onoma
    self.tel = tel
    self.mail = mail
    self.odos = odos
 
  def exodos(self):
    print('{0} : {1} -- {2} -- {3}'.format(self.onoma, self.tel, self.mail, self.odos))
 
def run():
  while True:
    # user input
    # TODO: some validation of the input
    name = input('Ονοματεπώνυμο : ')
    tilefono = input('Τηλέφωνο : ')        
    email = input('mail : ')
    dromos = input('Διεύθυνση : ')
 
    # the exit condition of the loop
    zz = input('Συνέχεια ; "ν" ή "ο" ')
 
    # create the next entry of the phonebook according to the user's input
    x = egrafes(name, tilefono, email, dromos)
    yield x
    if zz == 'ο' or zz == 'o':
      break
 
 
def main():
  for entry in run():
    entry.exodos()
 
if __name__ == "__main__":
    main()

Αυτό που μένει πλέον, είναι η εξακρίβωση ότι τα στοιχεία που μας δίνει ο χρήστης είναι κατάλληλα για το πρόγραμμα μας (πχ έγκυρη διεύθυνση email, το τηλέφωνο να περιέχει μόνο αριθμούς κοκ).
«Αν υποθέσουμε ότι αυτό είναι δυνατό, (να μεταδώσουμε τη σοφία παντού) τότε ειλικρινά ο τρόπος ζωής των θεών θα περάσει στους ανθρώπους. Τα πάντα θα είναι γεμάτα...
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Απ:Ερώτηση αρχαρίου 14 Χρόνια 4 Μήνες πριν #527

  • malos
  • Το Άβαταρ του/της malos
  • Αποσυνδεμένος
  • py____
  • Δημοσιεύσεις: 23
Στην συνέχεια εξομοιώνουμε την ίδια λειτουργία χρησιμοποιώντας generators ώστε να μην χρειάζεται να παράγουμε όλη την λίστα πριν την επεξεργαστούμε. Έτσι, έχουμε αποδοτικότερη διαχείρηση μνήμης

Πολύ ενδιαφέρον και σημαντικό αυτό που λες !
Με τη χρήση της yield το καταφέρνουμε αυτό;
Από ότι είδα αντικατέστησες πολλές σειρές δικές μου με
x = egrafes(name, tilefono, email, dromos) 
    yield x
Ενώ εγώ έκανα append και για τις 4 μεταβλητές (name, tilefono, email, dromos)

Στην help(yield) Μου βγάζει "inalid syntax" (όπως και για τις def, class, if ! Τις αναφέρω γιατί ο κειμενογράφος μου ο gedit τις βγάζει με ίδιο χρώμα όπως και την yield, αλλά και την print[που αυτή όμως έχει help] )
Τελικά τι κάνει η yield ;
(Μου έμαοες μάνι μάνι 2 καινούργιες "άγνωστες λέξεις" :laugh: zip και yield)

A... ! και κάτι άλλο !
if __name__ == "__main__":
Αυτό με τις διπλές κάτω παύλες το έχω δει στην __init__ βέβαια αλλά και αλλού ! Για την ινιτ εντάξει (ας πούμε ότι το ξέρω). Εδώ όμως τι σημαίνει; Το __name__ είναι κάποια συνάρτηση ενσωματωμένη ;
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Απ:Ερώτηση αρχαρίου 14 Χρόνια 4 Μήνες πριν #528

  • myle
  • Το Άβαταρ του/της myle
  • Αποσυνδεμένος
  • Admin
  • Δημοσιεύσεις: 467
  • Ληφθείσες Ευχαριστίες 15
Την yield μπορούμε να την σκεφτόμαστε και σαν την return με μια ιδιαιτερότητα. Η "συνάρτηση", όταν φθάνει σε yield επιστρέφει, όπως θα επέστρεφε και με την return. Στην συνέχεια, μόλις ξανακληθεί αυτή η συγκεκριμένη συνάρτηση, συνεχίζει από την αμέσως επόμενη γραμμή στον κώδικα της. Λόγω αυτής της ιδιαιτερότητας της καλείται γεννήτορας (generator). Αυτό, γιατί συνήθως τον χρησιμοποιούμε για να παράγει (generate) τιμές μέσω της yield.

Επομένως, αν σε μια συνάρτηση αντικαταστήσεις την δήλωση return με yield πήρες έναν γεννήτορα. Την πρώτη φορά που θα τον καλέσεις, θα τρέξει κανονικά μέχρι το πρώτο yield. Την επόμενη φορά που θα καλεστεί, θα συνεχίσει την εκτέλεση του, από το σημείο που είχε μείνει.

Η εξοικονόμηση μνήμης γίνεται γιατί δεν παράγονται όλες οι τιμές της συνάρτησης, μόνο μια κάθε φορά. Έτσι δεν χρειάζεται να επιστρέφουμε μια ίσως μεγάλη λίστα.


Με το
if __name__ == "__main__":

εκτελείται ότι περιέχεται στο σώμα το if μόνο εφόσον έχει καλεστεί απευθείας το πρόγραμμα μας από το συγκεκριμένο αρχείο.
Δηλαδή, αν αυτό το if υπάρχει σε ένα αρχείο asdf.py, τότε θα κληθεί μόνο εφόσον τρέξουμε απευθείας το asdf.py και όχι αν το κάνουμε import κάπου αλλού.

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


Τέλος, η συνάρτηση help της python, βγάζει βοήθεια μόνο για συναρτήσεις και όχι για keywords (λέξεις κλειδιά) που χρησιμοποιεί η γλώσσα όπως το if, yield, def, class). Η print στην python 3 είναι συνάρτηση.

Πιθανότατα ο gedit βγάζει τα ίδια χρώματα σε όλες αυτές, επειδή στην python 2.x ήταν statements (λέξεις κλειδιά).
«Αν υποθέσουμε ότι αυτό είναι δυνατό, (να μεταδώσουμε τη σοφία παντού) τότε ειλικρινά ο τρόπος ζωής των θεών θα περάσει στους ανθρώπους. Τα πάντα θα είναι γεμάτα...
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Απ:Ερώτηση αρχαρίου 14 Χρόνια 4 Μήνες πριν #531

  • malos
  • Το Άβαταρ του/της malos
  • Αποσυνδεμένος
  • py____
  • Δημοσιεύσεις: 23
Κατατοπίστηκα πλήρως ;) Σ' ευχαριστώ.

Τώρα προσπαθώ να σώσω τη λίστα μου.
Προσπαθώ με αυτά που ξέρω. Η απάντηση που παίρνω είναι ότι δεν μπορούν να σωθούν οι λίστες. ψάχνω τρόπο να τα μετατρέψω σε συμβολοσειρές. Το μόνο που κατάφερα είναι να σώσω σε εξωτερικό αρχείο αυτό το κείμενο :laugh:
[<__main__.egrafes object at 0xb7bae90c>, <__main__.egrafes object at 0xb7baea2c>]

Η προσθήκη μου είναι αυτή :
ss = ('{0}'.format(a))
save = open('katal.txt', 'w')
save.write(ss)
save.close

Έχω κρατήσει τον προτελευταίο κώδικά σου γιατί στην έξοδο μου βγάζει όλες τις εγγραφές.
#!/usr/bin/python3
 
import os
os.system('clear')
 
class egrafes: 
  def __init__(self, onoma, tel, mail, odos): 
    self.onoma = onoma 
    self.tel = tel 
    self.mail = mail 
    self.odos = odos 
 
  def exodos(self): 
    print('όνομ:  {0}\nτηλ :  {1}\nmail:  {2}\nοδός:  {3}\n-------------------------\n'.format(self.onoma, self.tel, self.mail, self.odos)) 
 
def run(): 
  while True: 
    # user input 
    # TODO: some validation of the input 
    name = input('Ονοματεπώνυμο : ') 
    tilefono = input('Τηλέφωνο : ')         
    email = input('mail : ') 
    dromos = input('Διεύθυνση : ') 
 
    # the exit condition of the loop 
    zz = input('Συνέχεια ; "ν" ή "ο" ') 
 
    # create the next entry of the phonebook according to the user's input 
    global x
    x = egrafes(name, tilefono, email, dromos)
    yield x 
    if zz == 'ο' or zz == 'o': 
      break 
 
 
a = [] 
for entry in run(): 
  a.append(entry) 
 
for entry in a: 
  entry.exodos() 
ss = ('{0}'.format(a))
save = open('katal.txt', 'w')
save.write(ss)
save.close
 
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Απ:Ερώτηση αρχαρίου 14 Χρόνια 4 Μήνες πριν #532

  • sbosx
  • Το Άβαταρ του/της sbosx
  • Αποσυνδεμένος
  • Admin
  • to be or not to be?
  • Δημοσιεύσεις: 228
  • Ληφθείσες Ευχαριστίες 6
Πειράζοντας το κώδικα που παρέθεσες και αλλάζοντας τον όσον το δυνατό λιγότερο έκανα το εξής:
#!/usr/bin/python3
 
import os
os.system('clear')
 
class egrafes:
  def __init__(self, onoma, tel, mail, odos):
    self.onoma = onoma
    self.tel = tel
    self.mail = mail
    self.odos = odos
 
  def exodos(self):
    return 'όνομ:  {0}\nτηλ :  {1}\nmail:  {2}\nοδός:   {3}\n-------------------------\n'.format(self.onoma, self.tel, self.mail, self.odos)
 
def run():
  while True:
    # user input
    # TODO: some validation of the input
    name = input('Ονοματεπώνυμο : ')
    tilefono = input('Τηλέφωνο : ')
    email = input('mail : ')
    dromos = input('Διεύθυνση : ')
 
    # the exit condition of the loop
    zz = input('Συνέχεια ; "ν" ή "ο" ')
 
    # create the next entry of the phonebook according to the user's input
    global x
    x = egrafes(name, tilefono, email, dromos)
    yield x
    if zz == 'ο' or zz == 'o':
      break
 
 
a = []
for entry in run():
  a.append(entry)
 
save = open('katal.txt', 'w')
 
for entry in a:
  str = entry.exodos()
  print(str)
  save.write(str)
 
save.close
Με άλλα λόγια πλέον η exodos() επιστρέφει string και χωρις πολλά πολλά μπορέις να αποθηκεύσεις αυτό κατευθείαν...!!!

To λάθος σου ήταν στη format()...
Όπως θα δεις και από το κώδικα, αυτό που κάνει είναι να τοποθετεί στις θέσεις {0}, {1}, ..., {n} του string σου τα string ορίσματα arg_0, arg_1, ..., arg_n με τα οποία την έχεις καλέσει και όχι με κάποια λίστα.
π.χ.
arg_0 = 'tralala'
arg_1 = 'tralalo'
print('arg_0 = {0}, arg_1 = {1}'.format(arg_0, arg_1))
που δίνει έξοδο:
arg_0 = tralala, arg_1 = tralalo
Τελευταία διόρθωση: 14 Χρόνια 4 Μήνες πριν από sbosx.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Απ:Ερώτηση αρχαρίου 14 Χρόνια 4 Μήνες πριν #533

  • myle
  • Το Άβαταρ του/της myle
  • Αποσυνδεμένος
  • Admin
  • Δημοσιεύσεις: 467
  • Ληφθείσες Ευχαριστίες 15
Η λύση του Κώστα είναι πολύ καλή γιατί είναι απλή.
Μια εναλλακτική λύση είναι να τροποποιήσουμε την συνάρτηση της κλάσης egrafes ώστε να μπορεί να κάνει την "εκτύπωση" και σε αρχείο.
import sys
 
class egrafes: 
  def __init__(self, onoma, tel, mail, odos): 
    self.onoma = onoma 
    self.tel = tel 
    self.mail = mail 
    self.odos = odos 
 
  def exodos(self, out=sys.stdout): 
    print('όνομ:  {0}\nτηλ :  {1}\nmail:  {2}\nοδός:  {3}\n-------------------------\n'.format(self.onoma, self.tel, self.mail, self.odos), file = out) 
 
def run(): 
  while True: 
    # user input 
    # TODO: some validation of the input 
    name = input('Ονοματεπώνυμο : ') 
    tilefono = input('Τηλέφωνο : ')         
    email = input('mail : ') 
    dromos = input('Διεύθυνση : ') 
 
    # the exit condition of the loop 
    zz = input('Συνέχεια ; "ν" ή "ο" ') 
 
    # create the next entry of the phonebook according to the user's input 
    global x
    x = egrafes(name, tilefono, email, dromos)
    yield x 
    if zz == 'ο' or zz == 'o': 
      break 
 
 
a = [] 
for entry in run(): 
  a.append(entry) 
 
for entry in a:
  outfile = open("file123.txt", "a")
  entry.exodos(out=outfile) 
«Αν υποθέσουμε ότι αυτό είναι δυνατό, (να μεταδώσουμε τη σοφία παντού) τότε ειλικρινά ο τρόπος ζωής των θεών θα περάσει στους ανθρώπους. Τα πάντα θα είναι γεμάτα...
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Απ:Ερώτηση αρχαρίου 14 Χρόνια 4 Μήνες πριν #535

  • malos
  • Το Άβαταρ του/της malos
  • Αποσυνδεμένος
  • py____
  • Δημοσιεύσεις: 23
Καταπληκτικές απαντήσεις και οι δύο ( πέραν από το κλασικό γλείψιμο :laugh: ). Ειλικρινά όμως είμαι πολύ ικανοποιημένος. Ξεθολώνει λίγο το τοπίο!
@Κώστα την format την ήξερα λίγο. Απλά πριν μέρες μου είχε ψιλοδουλέψει στη συγκεκριμένη επιθυμία μου να γράψω έξω ("γράφω έξω", μου θυμίζει την "openout" που έπαιζα με την basic
το 1985 σε έναν Amstrad :cheer: ! )
Το πρόβλημα ήταν ότι έγραφε μόνο την τελευταία εγγραφή. Απλός ο τρόπος σου όπως λέει κι ο Δημήτρης, αλλά παιδαγωγικός στην περίπτωσή μου.

@Δημήτρη με έβαλες σε αγχωτικά πεδία !
Αυτά τα stdout και stdin με φοβίζαν που τα έβλεπα ! Δεν είμαι και δυνατός στα αγγλικά και έλεγα ... άντε να κατανοήσω τώρα το documentation :(

Μου μάθατε και το "for i in (κάποια συνάρτηση).
Δεν θα πήγαινε το μυαλό μου !!! Μόνο σε λίστα το καταλάβαινα!

Θα μελετήσω λίγο αυτά που μου δώσατε.
Ενώ έτοιμα φαίνονται τόσο εύκολα ... ξέρετε ... δεν πάει το μυαλό του αρχάριου!

Τώρα θα κοιτάξω πως να καλώ το εξωτερικό txt και να το αποθηκεύω όλο μαζί! ( Αν και κάτι μου λέει ότι κάτι τέτοιο μπορεί να είναι "μνημοβόρο" :laugh: και να χαμογελάτε κρυφά, έχοντας πιο έξυπνη λύση. Δεν ξέρω αλήθεια τις λογικές του overwrite !!! Θα παλέψω όμως λίγο.
Τέλος θα κοιτάξω τι να κάνω με το pyqt που είναι ωκεανός ακόμα για μένα. (Γιατί αλλιώς είναι να είναι γραφικούλι το πρόγραμμα).
Ήδη έπαιξα με το zenity (gnomάδικο πράγμα) και σκόνταψα λίγο ! Τις εγγραφές πάντως τις δέχονταν
name = os.system('zenity --title="Αντζέτα" --text="Ονοματεπώνυμο : " --entry')
    #tilefono = input('Τηλέφωνο : ') 
    tilefono = os.system('zenity --title="Αντζέτα" --text="Τηλέφωνο : " --entry')
    #email = input('mail : ') 
    email = os.system('zenity --title="Αντζέτα" --text="email : " --entry')
    #dromos = input('Διεύθυνση : ')
    dromos = os.system('zenity --title="Αντζέτα" --text="Διεύθυνση : " --entry')
    # the exit condition of the loop 
    #zz = input('Συνέχεια ; "ν" ή "ο" ')
    zz = os.system('zenity --title="Αντζέτα" --text="Συνέχεια ; (ν ή ο)" --entry') 
    # create the next entry of the phonebook according to the user's input 
    global x 
    x = egrafes(name, tilefono, email, dromos) 
    yield x 
    if zz == os.system('zenity title="Αντζέτα" --text="Διεύθυνση : " --entry="ο"'): 
      break

Αλλά δεν ....!

Αλήθεια παιδιά ... τι λειτουργικά τρέχετε ;

Τέλος προτείνω να αλλάξετε τον τίτλο του νήματος σε "τηλεφωνικός κατάλογος" ή κάτι τέτοιο καθώς θα είναι (νομίζω ) πιο σωστό για τους χρήστες ή επισκέπτες του forum και την αναζήτηση ;)
Ευχαριστώ πολύ !
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Απ:Δημιουργία απλού Τηλεφωνικού Καταλόγου 14 Χρόνια 4 Μήνες πριν #536

  • myle
  • Το Άβαταρ του/της myle
  • Αποσυνδεμένος
  • Admin
  • Δημοσιεύσεις: 467
  • Ληφθείσες Ευχαριστίες 15
malos έγραψε:
Καταπληκτικές απαντήσεις και οι δύο ( πέραν από το κλασικό γλείψιμο :laugh: ). Ειλικρινά όμως είμαι πολύ ικανοποιημένος. Ξεθολώνει λίγο το τοπίο!

Πολύ χαιρόμαστε για αυτό!

malos έγραψε:
@Δημήτρη με έβαλες σε αγχωτικά πεδία !
Αυτά τα stdout και stdin με φοβίζαν που τα έβλεπα ! Δεν είμαι και δυνατός στα αγγλικά και έλεγα ... άντε να κατανοήσω τώρα το documentation :(

stdin --> είσοδος του προγράμματος από την κονσόλα (γραμμή εντολών)
stdout --> έξοδος στην κονσόλα.

Με απλά λόγια το stdout χρησιμοποιείται όπου θα μπορούσες να χρησιμοποιήσεις αρχείο. Μόνο που αντί να το γράψει σε αρχείο, το εκτυπώνει στην οθόνη.



malos έγραψε:
Μου μάθατε και το "for i in (κάποια συνάρτηση).
Δεν θα πήγαινε το μυαλό μου !!! Μόνο σε λίστα το καταλάβαινα!

Ούτε σε εμένα πήγαινε, ούτε μάλλον και σε αυτούς που είχαν κάνει την Python 2.x αρχικά. Τώρα όμως σιγά σιγά τα γυρνάνε όλα σε generators και iterable objects (αντικείμενα που μπορείς να προσπελάσεις ένα ένα).

malos έγραψε:
Τώρα θα κοιτάξω πως να καλώ το εξωτερικό txt και να το αποθηκεύω όλο μαζί! ( Αν και κάτι μου λέει ότι κάτι τέτοιο μπορεί να είναι "μνημοβόρο" :laugh: και να χαμογελάτε κρυφά, έχοντας πιο έξυπνη λύση. Δεν ξέρω αλήθεια τις λογικές του overwrite !!! Θα παλέψω όμως λίγο.

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

malos έγραψε:
Τέλος θα κοιτάξω τι να κάνω με το pyqt που είναι ωκεανός ακόμα για μένα. (Γιατί αλλιώς είναι να είναι γραφικούλι το πρόγραμμα).
Ήδη έπαιξα με το zenity (gnomάδικο πράγμα) και σκόνταψα λίγο ! Τις εγγραφές πάντως τις δέχονταν

Κοίταξε και το tkinter που έρχεται απευθείας με την Python 3. Κάποιες λειτουργίες του υπάρχουν ήδη στον οδηγό, ενώ μέσα στο σαββατοκύριακο θα υπάρξει και αναβάθμιση του οδηγού πως μπορεί να φτιαχτεί μια απλή αριθμομηχανή με γραφικό περιβάλλον.
name = os.system('zenity --title="Αντζέτα" --text="Ονοματεπώνυμο : " --entry')
    #tilefono = input('Τηλέφωνο : ') 
    tilefono = os.system('zenity --title="Αντζέτα" --text="Τηλέφωνο : " --entry')
    #email = input('mail : ') 
    email = os.system('zenity --title="Αντζέτα" --text="email : " --entry')
    #dromos = input('Διεύθυνση : ')
    dromos = os.system('zenity --title="Αντζέτα" --text="Διεύθυνση : " --entry')
    # the exit condition of the loop 
    #zz = input('Συνέχεια ; "ν" ή "ο" ')
    zz = os.system('zenity --title="Αντζέτα" --text="Συνέχεια ; (ν ή ο)" --entry') 
    # create the next entry of the phonebook according to the user's input 
    global x 
    x = egrafes(name, tilefono, email, dromos) 
    yield x 
    if zz == os.system('zenity title="Αντζέτα" --text="Διεύθυνση : " --entry="ο"'): 
      break

Ο κωδικάς είναι μια χαρά, αλλά χρειάζεται κάποιος να έχει εγκαταστήσει το zenity ως ξεχωριστό πρόγραμμα για να δουλέψει.

malos έγραψε:
Αλήθεια παιδιά ... τι λειτουργικά τρέχετε ;

Debian testing έχουμε και οι 2 μας.

malos έγραψε:
Τέλος προτείνω να αλλάξετε τον τίτλο του νήματος σε "τηλεφωνικός κατάλογος" ή κάτι τέτοιο καθώς θα είναι (νομίζω ) πιο σωστό για τους χρήστες ή επισκέπτες του forum και την αναζήτηση ;)
Ευχαριστώ πολύ !

Έγινε όπως προτάθηκε!
«Αν υποθέσουμε ότι αυτό είναι δυνατό, (να μεταδώσουμε τη σοφία παντού) τότε ειλικρινά ο τρόπος ζωής των θεών θα περάσει στους ανθρώπους. Τα πάντα θα είναι γεμάτα...
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Απ:Δημιουργία απλού Τηλεφωνικού Καταλόγου 14 Χρόνια 4 Μήνες πριν #542

  • sbosx
  • Το Άβαταρ του/της sbosx
  • Αποσυνδεμένος
  • Admin
  • to be or not to be?
  • Δημοσιεύσεις: 228
  • Ληφθείσες Ευχαριστίες 6
myle έγραψε:
Κοίταξε και το tkinter που έρχεται απευθείας με την Python 3.
Και εγώ αυτό θα σου πρότεινα!!! Το zenity είναι εργαλείο που θα σε βοηθούσε αν έγραφες κάποιο κώδικα σε bash, εδώ πιστεύω δε σε βοηθάει απλά προβλήματα δημιουργεί!

Στο κώδικα τώρα που έδωσες υπάρχει πρόβλημα όπως θα δεις και σε αυτό το link:
ubuntuforums.org/showthread.php?t=263035
Παρόλα αυτά η λύση που δίνεται σε αυτό το forum πιστεύω δε δουλεύει...!!! :laugh:
Γενικά το πρόβλημα είναι ότι η zenity "επιστρέφει":
  1. ποιο κουμπί πάτησες ΟΚ, cancel, x και
  2. το κείμενο που έγραψες στο field.

π.χ.
#!/bin/bash
 
zenity --title="title" --text="Put a text here : " --entry
echo "button" $?

Αν το εκτελέσεις θα δεις ότι αυτό που γίνεται είναι να printαρεται αυτόματα ότι γράφεις στο field και να επιστρέφει 0 αν πάτησες ΟΚ και 1 αν πάτησε cancel ή x.

Με άλλα λόγια ο κώδικας σου δε δουλεύει γιατί η εντολή που έγραψες επιστρέφει αυτό το 0 ή το 1 (αν και σε μένα στη python αντί για 1 μου έβγαζε 256 (?!))!
Τελευταία διόρθωση: 14 Χρόνια 4 Μήνες πριν από sbosx.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Απ:Δημιουργία απλού Τηλεφωνικού Καταλόγου 14 Χρόνια 4 Μήνες πριν #550

  • malos
  • Το Άβαταρ του/της malos
  • Αποσυνδεμένος
  • py____
  • Δημοσιεύσεις: 23
myle έγραψε:
Debian testing έχουμε και οι 2 μας.



... και νόμιζα ότι είστε windoζάδες !

Το tkinter φαίνεται καταπληκτικό όπως το είδα πρόχειρα στη σελίδα του! Και νόμιζα ότι είμαι καταδικασμένος να μάθω pyqt (που θέλω να το μάθω κι αυτό, αλλά το tkinter δείχνει να καλύπτει αρκετά).
Κάτι δεν πήγε καλά όμως και λέω να το ανοίξω ως ξεχωριστό θέμα (Πιστεύω έχει ολοκληρωθεί αυτό το νήμα ... και να μη κουράσω άλλο ;) ).
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Απ:Δημιουργία απλού Τηλεφωνικού Καταλόγου 14 Χρόνια 4 Μήνες πριν #551

  • sbosx
  • Το Άβαταρ του/της sbosx
  • Αποσυνδεμένος
  • Admin
  • to be or not to be?
  • Δημοσιεύσεις: 228
  • Ληφθείσες Ευχαριστίες 6
malos έγραψε:
... και νόμιζα ότι είστε windoζάδες !
μας προσβάλεις... χαχαχα :laugh: :laugh: :laugh:
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Συντονιστές: pmav99
Χρόνος δημιουργίας σελίδας: 0.487 δευτερόλεπτα

Μοιράσου το!

Powered by CoalaWeb

Λίστα Ταχυδρομείου