Μάθημα 3 - Έλεγχος ροής και συναρτήσεις

...ασύγχρονα μαθήματα python

Μάθημα 3 - Έλεγχος ροής και συναρτήσεις

Δημοσίευσηαπό medigeek » 05 Ιούλ 2009, 08:48

Το αρχείο του μαθήματος:
http://files.ubuntu-gr.org/learning/python/03-controlflow.html

Ευχαριστώ όσους συμμετείχαν στις ασκήσεις!

Μπαίνουμε πλεον σε σοβαρά θέματα όμως. Συνήθως θέλετε να ελέγχετε την τιμή μιας μεταβλητής, π.χ. αν ο υπολογιστής είναι Windows είτε Linux και να εκτελείτε διαφορετικές εντολές για την κάθε περίπτωση. Με τον έλεγχο ροής μπορείτε εύκολα να ελέγχετε τί θα εκτελεστεί και προς τα πού θα κατευθυνθεί το πρόγραμμα. Επίσης, με τις συναρτήσεις μπορείτε να ομαδοποιήσετε τις εντολές που χρησιμοποιείτε συχνά σε μια σειρά από εντολές που δέχονται καμιά ή μερικές μεταβλητές.

Διαβάστε το στυλ κώδικα, ο (κάπως πιο) σωστός τρόπος συγγραφής προγραμμάτων: http://files.ubuntu-gr.org/learning/pyt ... w.html#id4



Ερωτήσεις;

Οποιεσδήποτε ερωτήσεις έχετε, εναποθέστε τις σε αυτό το θέμα - Μην δημιουργήσετε καινούργιο.

Στο ψητό γιατί πεινάσαμε!

Η ύλη για αυτή τη βδομάδα:

8. `Έλεγχος ροής: http://www.swaroopch.com/notes/Python_e ... E%AE%CF%82
9. `Συναρτήσεις: http://www.swaroopch.com/notes/Python_e ... E%B9%CF%82

Όρτσα! Μάινα τα πανιά! :mrgreen:
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

Re: Μάθημα 3 - Έλεγχος ροής και συναρτήσεις

Δημοσίευσηαπό medigeek » 12 Ιούλ 2009, 10:52

Ασκήσεις!! viewtopic.php?f=55&t=6057
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

Re: Μάθημα 3 - Έλεγχος ροής και συναρτήσεις

Δημοσίευσηαπό malos » 12 Ιούλ 2009, 14:39

Εγώ σήμερα που μπήκαν οι ασκήσεις .... διαβάζω για πρώτη φορά το κεφάλαιο :D ( μια βδομάδα μόνο καθυστέρηση. Εντάξει μωρέ !!! ).

Μόλις διάβασα για την while. Έχει παράδειγμα με ακαίραιους. Με γράμματα τι κάνουμε ;
Συγκεκριμένα ήθελα να κάνω αυτό ( Θα καταλάβετε τι πήγα να κάνω ... )

Κώδικας: Επιλογή όλων
#!/usr/bin/python3

you = 'μωράκι'
synexise = True
while synexise:

lege = input('Τι είσαι; ' )
    if lege == you:

        print ('/nΝΑΙ !!!!!! ΕΙΣΑΙ ΤΟ ΜΩΡΑΚΙ ΜΟΥ')
        synexise = False
    else:
        print ('´Οχι δεν είσαι', lege)
else:
    print ('Τέλος')


Μου βγάζει :
File "Επιφάνεια εργασίας/tisai.py", line 7
lege = input('Τι είσαι; ' )
^
IndentationError: expected an indented block


δοκίμασα και

lege = (input('Τι είσαι; ' ))

και

lege = str(input('Τι είσαι; ' ))

( το str το έβαλα στην τύχη. Δεν το έχω πολυκαταλάβει :? )
Επεξεργαστής: AMD Ryzen 9 5900x
Μνήμη Gskill 16gb (2X8gb), 3200 mh, CL 14
Μητρική: Asrock X570 phantom gaming X
Τροφοδοτικό: Corsair 850 platinum
Δίσκος: SSD Corsair MP600 (1 TB)
Άβαταρ μέλους
malos
saintTUX
saintTUX
 
Δημοσιεύσεις: 1220
Εγγραφή: 02 Νοέμ 2008, 12:00
Εκτύπωση

Re: Μάθημα 3 - Έλεγχος ροής και συναρτήσεις

Δημοσίευσηαπό malos » 12 Ιούλ 2009, 14:46

Ωπσσς !!!
Μόλις το βρήκα ! Μια χαρά είναι η input. Εσοχή ήθελε όμως !

Συγνώμμη για την αναστάτωση !
Επεξεργαστής: AMD Ryzen 9 5900x
Μνήμη Gskill 16gb (2X8gb), 3200 mh, CL 14
Μητρική: Asrock X570 phantom gaming X
Τροφοδοτικό: Corsair 850 platinum
Δίσκος: SSD Corsair MP600 (1 TB)
Άβαταρ μέλους
malos
saintTUX
saintTUX
 
Δημοσιεύσεις: 1220
Εγγραφή: 02 Νοέμ 2008, 12:00
Εκτύπωση

Re: Μάθημα 3 - Έλεγχος ροής και συναρτήσεις (μία βοήθεια please)

Δημοσίευσηαπό malos » 13 Ιούλ 2009, 00:01

Στο παράδειγμα του μαθήματος για την for....in είδαμε κλήση της συνάρτησης range

Κώδικας: Επιλογή όλων
for i in range(1, 5):
    print(i)
else:
    print('Ο βρόχος loop τερματίστηκε')


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

Θέλω, αντί για αύξοντες αριθμούς που έχει η range, η δική μου να έχει 6 αριθμούς. Τους : 5, 15, 25,
35, 45, 55

και δοκίμασα αυτό αλλά ............ :thumbdown:
Κώδικας: Επιλογή όλων
#!/usr/bin/python3

a = 5
b = 15
c = 25
d = 35
e = 45
f = 55
def sinartisi(a, b, c, d, e, f):
   
    for i in sinartisi(a, 5):
        print(i)
    else:
        print('Ο βρόχος loop τερματίστηκε')


περιμένοντας να μου τυπώσει τους αριθμούς : 5 (που είναι το a και με σειρά όλους του άλλους 15, 25, 35, μέχρι και το 45 που είναι ο πέμπτος αριθμός) (έτσι μπας και καταλάβω τον πρώτο κώδικα που παρέθεσα).

Έχετε καμιά ιδέα ;
Επεξεργαστής: AMD Ryzen 9 5900x
Μνήμη Gskill 16gb (2X8gb), 3200 mh, CL 14
Μητρική: Asrock X570 phantom gaming X
Τροφοδοτικό: Corsair 850 platinum
Δίσκος: SSD Corsair MP600 (1 TB)
Άβαταρ μέλους
malos
saintTUX
saintTUX
 
Δημοσιεύσεις: 1220
Εγγραφή: 02 Νοέμ 2008, 12:00
Εκτύπωση

Re: Μάθημα 3 - Έλεγχος ροής και συναρτήσεις

Δημοσίευσηαπό DarkLord » 13 Ιούλ 2009, 04:10

Κώδικας: Επιλογή όλων
#!/usr/bin/python3

a = 5
b = 15
c = 25
d = 35
e = 45
f = 55
lista = [a,b,c,d,e,f]

def sinartisi(obgect):
        for i in obgect:
                print (i)
        else:
                print('Ο βρόχος loop τερματίστηκε')
               
sinartisi(lista)


πιστεύω ότι έτσι είναι πιο σωστό
;)
DarkLord
babeTUX
babeTUX
 
Δημοσιεύσεις: 81
Εγγραφή: 24 Ιαν 2009, 15:26
Τοποθεσία: Karvasaras
Εκτύπωση

Re: Μάθημα 3 - Έλεγχος ροής και συναρτήσεις

Δημοσίευσηαπό medigeek » 13 Ιούλ 2009, 09:34

malos έγραψε:και δοκίμασα αυτό αλλά ............ :thumbdown:

Καλούσες μια συνάρτηση μέσα στον ίδιο τον εαυτό της, αυτό δεν επιτρέπεται :)

DarkLord έγραψε:πιστεύω ότι έτσι είναι πιο σωστό

:thumbup:
Όχι πως είναι λάθος, αλλά έχεις βάλει 8 αντί 4. Υπενθυμίζω το στυλ κώδικα:
http://files.ubuntu-gr.org/learning/pyt ... w.html#id3
2. Χρησιμοποιείτε 4 κενά (όχι tab) για κάθε στοίχιση (indentation).

Να και οι δικές μου προτάσεις:
Α
Κώδικας: Επιλογή όλων
#!/usr/bin/python3

def sinartisi():
    # 5, 15, 25, 35, 45, 55 (+10 κάθε φορά)
    for i in range(5,56,10):
        print i

sinartisi()


Κώδικας: Επιλογή όλων
>>> for i in range(5,56,10):
...     print i
...
5
15
25
35
45
55


Β
Κώδικας: Επιλογή όλων

def sinartisi2(my_lista):
    lista_string = map(str, my_lista)
    #Το map() θα μετατρέψει τους αριθμούς σε text string, αλλιώς το join() δε θα δουλέψει!
    lista_text = "\n".join(lista_string)
    print(lista_text)

lista = range(5,56,10)

sinartisi2(lista)


Κώδικας: Επιλογή όλων
>>> def sinartisi2(my_lista):
...     lista_string = map(str, my_lista)
...     #Το map() θα μετατρέψει τους αριθμούς σε text string, αλλιώς το join() δε θα δουλέψει!
...     lista_text = "\n".join(lista_string)
...     print(lista_text)
...
>>> lista = range(5,56,10)
>>>
>>> sinartisi2(lista)
5
15
25
35
45
55
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

Re: Μάθημα 3 - Έλεγχος ροής και συναρτήσεις

Δημοσίευσηαπό malos » 14 Ιούλ 2009, 00:54

Ευχαριστώ για τις απαντήσεις.
Έχω όμως ακόμα απορία. Αν δεν βαριέστε ( δε βαριέστε ε; :D ) σας παρακαλώ κάντε ακόμα ένα κόπο.

Κατ' αρχάς να πω ότι δεν μου δούλεψε ο κώδικάς σου DarkLord !

Κώδικας: Επιλογή όλων
pal@malos:~$ ~/fro
Traceback (most recent call last):
  File "/home/pal/fro", line 3, in <module>
    lista = [a, b, c, d, e, f]
NameError: name 'a' is not defined


Το έκανα και με 4 κενά όπως είπε ο δάσκαλός.

Κώδικας: Επιλογή όλων
#!/usr/bin/python3


lista = [a,b,c,d,e,f]

def sinartisi(obgect):
     for i in obgect:
           print (i)     
     else:
           print('Ο βρόχος loop τερματίστηκε')   
               
sinartisi(lista)


@Δάσκαλε ! Ήθελα να κάνω κάτι χωρίς να καλέσω την range ! Είναι έτοιμη ! Θα ήθελα να φτιάξω δική μου που να ορίζεται με αυτούς τους αριθμούς μόνο.

Σαν .....να ... κατάλαβα πριν 5 λεπτά τι εννοείς ότι καλώ τη συνάρτηση μέσα από τον εαυτό της (εσωστρεφής προγραμματισμός ! Νέα γενιά προγραμματισμού ! Δεν ξέρετε ρε ! :D )

Εννοείς πως δεν κολλάει κάτω από το def τάδε κάποιο μπλοκ που λογικά ανήκει στο τάδε, να επικαλείται το τάδε.

αυτό δηλαδή !
Κώδικας: Επιλογή όλων
def sinartisi(a, b, c, d, e, f):
   
    for i in sinartisi(a, 5):

Αυτό δεν εννούσες;


Ένα άλλο λάθος μου ήταν ότι δεν έγραψα κάτω κάτω και χωρίς εσοχή ( Αφού έχω φύγει από μπλοκ και θέλω άλλη δουλειά να κάνω --- να καλέσω τη συνάρτηση --- ) , τη λέξη sinartisi() !!! Έτσι ξερά ! Που σημαίνει ότι την καλώ !!!! Εκεί που έγραφα τα for και in και print ..... απλά την όριζα! Σωστά ;

Σκέφτηκα λοιπόν να την καλέσω με άλλη συνάρτηση ( την "για να δουμε τώρα" ) όπου δουλειά της θα είναι να καλεί την sinartisi και να δουλεύει πάνω της

Κώδικας: Επιλογή όλων
def gia_na_doume_tora():   
    for i in sinartisi():
        print(i)


Αλλά δεν ξέρω να την ορίσω!
Στο μάθημα λέει:

Παράμετροι συναρτήσεων

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


Τελικά δεν το έχω καταλάβει καλά όπως αποδυκνύεται :thumbdown:

Αυτό δηλαδή πως θα έστεκε δάσκαλε ;

Κώδικας: Επιλογή όλων
#!/usr/bin/python3

a = 5
b = 15
c = 25
d = 35
e = 45
f = 55
def sinartisi(a, b, c, d, e, f):
def gia_na_doume_tora():   
    for i in sinartisi():
        print(i)
    else:
        print('Ο βρόχος loop τερματίστηκε')

gia_na_doume_tora()
Επεξεργαστής: AMD Ryzen 9 5900x
Μνήμη Gskill 16gb (2X8gb), 3200 mh, CL 14
Μητρική: Asrock X570 phantom gaming X
Τροφοδοτικό: Corsair 850 platinum
Δίσκος: SSD Corsair MP600 (1 TB)
Άβαταρ μέλους
malos
saintTUX
saintTUX
 
Δημοσιεύσεις: 1220
Εγγραφή: 02 Νοέμ 2008, 12:00
Εκτύπωση

Re: Μάθημα 3 - Έλεγχος ροής και συναρτήσεις

Δημοσίευσηαπό malos » 14 Ιούλ 2009, 01:03

Εσείς δηλαδή γράψατε :


def sinartisi(obgect):

sinartisi(lista)

που δείχνει πως το 'χετε αυτό που λέει : Μια συνάρτηση μπορεί να δεχθεί παραμέτρους.

Ως παραμέτρους δηλαδή δεν μπορώ να βάλω μόνο τιμές; Ή συμβολοσειρές ; Θέλει λίστες με το όνομά τους ; Που κι αυτές έχουν οριστεί πιο πριν; Ή μετά ;

Έχω κολλήσει λίγο !
Επεξεργαστής: AMD Ryzen 9 5900x
Μνήμη Gskill 16gb (2X8gb), 3200 mh, CL 14
Μητρική: Asrock X570 phantom gaming X
Τροφοδοτικό: Corsair 850 platinum
Δίσκος: SSD Corsair MP600 (1 TB)
Άβαταρ μέλους
malos
saintTUX
saintTUX
 
Δημοσιεύσεις: 1220
Εγγραφή: 02 Νοέμ 2008, 12:00
Εκτύπωση

Re: Μάθημα 3 - Έλεγχος ροής και συναρτήσεις

Δημοσίευσηαπό cyberpython » 14 Ιούλ 2009, 01:39

@malos:
Μία συνάρτηση είναι ουσιαστικά ένα μικρό αυτόνομο κομμάτι κώδικα.
Οι παράμετροι είναι ο τρόπος που έχει για να επικοινωνήσει με το περιβάλλον - να δεχτεί είσοδο από αυτό.
Ουσιαστικά, όταν γράφεις τη συνάρτησή (π.χ. F) σου ορίζοντας τις παραμέτρους ορίζεις "θέσεις" για να μπορούν να περαστούν μετά δεδομένα προς τη συνάρτηση.
Όταν μετά κάποιος καλέσει τη συνάρτηση F τότε δεσμεύεται χώρος στη μνήμη για τις μεταβλητές και τις παραμέτρους της F (νέος χώρος για κάθε κλήση που απελευθερώνεται μετά το τέλος της εκτέλεσης της συνάρτησης)
π.χ. αν η F υπολογίζει το άθροισμα 2 αριθμών τότε θα πρέπει να μπορούμε να της δώσουμε ως είσοδο 2 αριθμούς:
Κώδικας: Επιλογή όλων
#!/usr/bin/env python3

def f(a,b):
   c = a + b
   print("Το άθροισμα είναι:", c)
   
f(12, 4)


Εκτός όμως από το να δίνουμε είσοδο σε μία συνάρτηση θέλουμε τις περισσότερες φορές να παίρνουμε και κάποιο αποτέλεσμα π.χ. στην προηγούμενη περίπτωση το άθροισμα. Για αυτό το λόγο χρησιμοποιούμε την εντολή return που επιστρέφει ένα αποτέλεσμα από τη συνάρτηση. Π.χ. :
Κώδικας: Επιλογή όλων
#!/usr/bin/env python3

def f(a,b):
   c = a + b
   #print("Το άθροισμα είναι:", c)
   return c
   
print (f(12, 4))


Άρα ως παραμέτρους στην Python μπορείς να ορίσεις οποιοδήποτε τύπο αντικειμένου θέλεις, αλλά την πραγματική παράμετρο (π.χ. αριθμητική τιμή) την καθορίζεις όταν καλείς τη συνάρτηση και όχι όταν την ορίζεις.
Κοινότητα ΕΛ/ΛΑΚ Οικονομικού Πανεπιστημίου Αθηνών / Ubuntu-gr / My Web Log
Επίπεδο Γνώσεων Linux: Μέτριο, Προγραμματισμός: Ναι, Aγγλικά: Καλά
Λειτουργικό : Ubuntu 10.04 - 32bits
Η/Υ : Intel Core2 4400@2 GHz / 2GB DDR2 RAM / GeForce 8400 GS 512MB / Creative SB Audigy SE
Άβαταρ μέλους
cyberpython
seniorTUX
seniorTUX
 
Δημοσιεύσεις: 733
Εγγραφή: 14 Μάιος 2008, 13:22
Εκτύπωση

Επόμενο

Επιστροφή στο Μαθήματα python