Συζητήσεις για το μάθημα και ανακοινώσεις

46-code

 
Picture of CHRISTOS KATRINAKIS
46-code
by CHRISTOS KATRINAKIS - Saturday, 2 December 2017, 5:06 PM
 

Στην άσκηση 46 το άνοιγμα του αρχείου και η μετατροπή του σε λίστα πρέπει να γίνουν μέσα στη συνάρτηση ή απ' έξω; Επίσης, το να φτιάξει κανείς μία λίστα με τις γραμμές ως strings είναι εύκολο, αλλά πως μπορούμε να φτιάξουμε μία λίστα με τις πεντάδες σε κάθε γραμμή; Κάποια υπόδειξη;

Picture of CHRISTOS KATRINAKIS
Re: 46-code
by CHRISTOS KATRINAKIS - Saturday, 2 December 2017, 5:44 PM
 

Αν l είναι η συμβολοσειρά που αντιστοιχεί σε κάθε γραμμή, και αυτές είναι στην λίστα L, νομίζω πως η λύση είναι: 

LL=[]

for i in range(0,len(l)-5,6):

     LL.append(l[i:i+5])

ΘΑ μπορούσαμε όμως να πούμε LL=[l[i:i+5] for i in range(0,len(l)-5,6)] ?

 

Picture of Μιχάλης Κολουντζάκης
Re: 46-code
by Μιχάλης Κολουντζάκης - Saturday, 2 December 2017, 6:46 PM
 

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

2. Όλη η δουλειά που πρέπει να κάνετε είναι μια συνάρτηση. Δεν επιτρέπεται η συνάρτηση αυτή να στηρίζεται σε κάποιο κώδικα που τρέχει στο πρόγραμμά σας αλλά εκτός της συνάρτησης. Αλλιώς πώς θα μπορούσε ένας τρίτος να καλέσει τη συνάρτησή σας; Μια συνάρτηση πρέπει να είναι κάτι αυτούσιο. Ο κατασκευαστής της συνάρτησης ξέρει πώς έχει λύσει το πρόβλημα αλλά ο χρήστης της συνάρτησης οφείλει μόνο να γνωρίζει πώς η συνάρτηση αυτή καλείται (ποια είναι τα ορίσματά της, τι σημασία έχουν, κλπ), όχι το πώς λειτουργεί. Όταν εσείς, ως προγραμματιστές python, καλείτε τη συνάρτηση print, π.χ., δεν έχετε ιδέα του πώς αυτή είναι γραμμένη. Το μόνο που ξέρετε είναι το ποια είναι τα ορίσματά της και το πώς πρέπει να τα δίνετε, τι αποτέλεσμα έχουν κλπ. Έτσι και με μια οποιαδήποτε συνάρτηση που εσείς γράφετε.

3. Για να διαχωρίσετε τις 5άδες μέσα στο string της μιας γραμμής δε μπορείτε να στηριχθείτε στο ότι οι 5άδες διαχωρίζονται από ένα και μόνο κενό. Ακόμη κι αν αυτό συμβαίνει στα παραδείγματα που σας έχουν δοθεί (δε συμβαίνει πλέον) δεν καθορίζεται πουθενά από την άσκηση και άρα μπορεί να έχετε ένα αρχείο όπου κάποιες 5άδες διαχωρίζονται από περισσότερα από ένα κενά. Ο τρόπος να ανακτήσετε τις 5άδες μέσα από το string της γραμμής είναι να χρησιμοποιήσετε τη μέθοδο split με διαχωριστικό χαρακτήρα το κενό ' '. Δείτε π.χ. παρακάτω (υπάρχουν πολλαπλά κενά πριν από το 2ο abcde):

>>> s="abcde 12345 abcde"
>>> s.split(' ')
['abcde', '12345', '', '', '', 'abcde']

Θα πρέπει όμως να πετάξετε από τη λίστα αποτέλεσμα της split όσες λέξεις δεν έχουν μήκος 5 (αυτές οφείλονται στα πολλαπλά κενά -- όποτε βλέπει δύο κενά θεωρεί ότι διαχωρίζουν το κενό string).

Picture of CHRISTOS KATRINAKIS
Re: 46-code
by CHRISTOS KATRINAKIS - Sunday, 3 December 2017, 12:57 PM
 

Τι πρόβλημα υπάρχει με το filename? Νομίζω πρέπει να μας μάθετε να διαβάζουμε τα error.


Picture of Μιχάλης Κολουντζάκης
Re: 46-code
by Μιχάλης Κολουντζάκης - Sunday, 3 December 2017, 1:18 PM
 

Χμ, μάλλον τις οδηγίες πρέπει να σας μάθω να διαβάζετε ...

Το όνομα του αρχείου στη συνάρτηση είναι s, όχι filename.

Πάντως αν θέλετε να μάθετε να διαβάζετε τα errors, να βελτιώσετε τα Αγγλικά σας:

Picture of CHRISTOS KATRINAKIS
Re: 46-code
by CHRISTOS KATRINAKIS - Sunday, 3 December 2017, 3:29 PM
 

Διόρθωσα την απροσεξία και το πρόγραμμα μου τρέχει κανονικά. Όμως οι λίστες που βγάζει το πρόγραμμα μου είναι "αναγραμματισμοί" των λιστών που βγάζει ο tester. Την υποψία μου αυτή έλεγξα με το πρόγραμμα checklist που επισυνάπτω.


Picture of Μιχάλης Κολουντζάκης
Re: 46-code
by Μιχάλης Κολουντζάκης - Sunday, 3 December 2017, 5:23 PM
 

Δες 3 στο σχόλιό μου παραπάνω.