Python tutorial för att lära sig grunderna?

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
mippen
Inlägg: 740
Blev medlem: 15 april 2009, 15:34:31
Ort: Lindome

Python tutorial för att lära sig grunderna?

Inlägg av mippen »

Börjat leka lite med Raspberry och märker snabbt att jag saknar grunderna i python.
Finns det ngn bra enkel tutorial att gå för att lära sig just bas kunskaperna?

Med baskunskaper menar jag hur koden är uppbyggd. Vad är main loopen. Hur fungerar tilldelning. Anrop.. mm..
Switch / Case / For etc har man från andra språk.. men fastnar i just hur koden skall partioneras.

Tex:

Jag vill ta emot UDP samtidigt som jag vill lyssna på en GPIO ingång.
Var för sig fungerar men inte tillsammans...
Hur skapar man kod som kan monitorera olika saker?

while True:
# dataFromClient, address = server_socket.recvfrom(256)
# options[dataFromClient]()

if(GPIO.input(17) == 0):
print "Detection"
X-IL
EF Sponsor
Inlägg: 8274
Blev medlem: 3 december 2008, 07:47:20
Ort: Hallstahammar

Re: Python tutorial för att lära sig grunderna?

Inlägg av X-IL »

Ja du får väl kanske kolla upp lite grann med trådning alternativt inte ligga och blockera i väntan på din input (bör ju finnas en koll som kan som du har mottagit data, och om det är så, kan du beta av din buffer).
XorXaX
Inlägg: 409
Blev medlem: 27 maj 2004, 09:44:16

Re: Python tutorial för att lära sig grunderna?

Inlägg av XorXaX »

https://www.codecademy.com/learn/python
Interaktivt verktyg för att lära sig Python. Mycket bra!
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Python tutorial för att lära sig grunderna?

Inlägg av lillahuset »

Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43180
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Python tutorial för att lära sig grunderna?

Inlägg av sodjan »

Från: https://docs.python.org/2/library/socket.html:

"socket.recvfrom(bufsize[, flags])
Receive data from the socket. The return value is a pair (string, address) where string is a
string representing the data received and address is the address of the socket sending the data.
See the Unix manual page recv(2) for the meaning of the optional argument flags; it defaults to zero.
(The format of address depends on the address family — see above.)"

Från: http://linux.die.net/man/2/recv:

"The flags argument to a recv() call is formed by ORing one or more of the following values:
...
MSG_DONTWAIT (since Linux 2.2)
Enables nonblocking operation; if the operation would block, the call fails with the error EAGAIN or
EWOULDBLOCK (this can also be enabled using the O_NONBLOCK flag with the F_SETFL fcntl(2)).
...
"

Se även "socket.setblocking(flag)" och "socket.settimeout(value)" på Python sidan ovan...
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43180
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Python tutorial för att lära sig grunderna?

Inlägg av sodjan »

> # dataFromClient, address = server_socket.recvfrom(256)

Om jag ser rätt så är flag=256:

198: #define MSG_EOR MSG_EOR
199: MSG_WAITALL = 0x100, /* Wait for a full request. */

Från : http://repo-genesis3.cbi.utsa.edu/cross ... ket.h.html:

Kod: Markera allt

 175: /* Bits in the FLAGS argument to `send', `recv', et al.  */
 176: enum
 177:   {
 178:     MSG_OOB             = 0x01, /* Process out-of-band data.  */
 179: #define MSG_OOB         MSG_OOB
 180:     MSG_PEEK            = 0x02, /* Peek at incoming messages.  */
 181: #define MSG_PEEK        MSG_PEEK
 182:     MSG_DONTROUTE       = 0x04, /* Don't use local routing.  */
 183: #define MSG_DONTROUTE   MSG_DONTROUTE
 184: #ifdef __USE_GNU
 185:     /* DECnet uses a different name.  */
 186:     MSG_TRYHARD         = MSG_DONTROUTE,
 187: # define MSG_TRYHARD    MSG_DONTROUTE
 188: #endif
 189:     MSG_CTRUNC          = 0x08, /* Control data lost before delivery.  */
 190: #define MSG_CTRUNC      MSG_CTRUNC
 191:     MSG_PROXY           = 0x10, /* Supply or ask second address.  */
 192: #define MSG_PROXY       MSG_PROXY
 193:     MSG_TRUNC           = 0x20,
 194: #define MSG_TRUNC       MSG_TRUNC
 195:     MSG_DONTWAIT        = 0x40, /* Nonblocking IO.  */
 196: #define MSG_DONTWAIT    MSG_DONTWAIT
 197:     MSG_EOR             = 0x80, /* End of record.  */
 198: #define MSG_EOR         MSG_EOR
 199:     MSG_WAITALL         = 0x100, /* Wait for a full request.  */
 200: #define MSG_WAITALL     MSG_WAITALL
 201:     MSG_FIN             = 0x200,
 202: #define MSG_FIN         MSG_FIN
 203:     MSG_SYN             = 0x400,
 204: #define MSG_SYN         MSG_SYN
 205:     MSG_CONFIRM         = 0x800, /* Confirm path validity.  */
 206: #define MSG_CONFIRM     MSG_CONFIRM
 207:     MSG_RST             = 0x1000,
 208: #define MSG_RST         MSG_RST
 209:     MSG_ERRQUEUE        = 0x2000, /* Fetch message from error queue.  */
 210: #define MSG_ERRQUEUE    MSG_ERRQUEUE
 211:     MSG_NOSIGNAL        = 0x4000, /* Do not generate SIGPIPE.  */
 212: #define MSG_NOSIGNAL    MSG_NOSIGNAL
 213:     MSG_MORE            = 0x8000,  /* Sender will send more.  */
 214: #define MSG_MORE        MSG_MORE
Prova med server_socket.recvfrom(64) istället (alltså MSG_DONTWAIT = 0x40, /* Nonblocking IO. */).
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43180
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Python tutorial för att lära sig grunderna?

Inlägg av sodjan »

Jo, detta har ju inte ett smack med Python som sådant att göra... :-)
mippen
Inlägg: 740
Blev medlem: 15 april 2009, 15:34:31
Ort: Lindome

Re: Python tutorial för att lära sig grunderna?

Inlägg av mippen »

Många snabba bra svar. Tackar!

Grundproblem när jag kör båda samtidigt:

Kod: Markera allt

while True:
    dataFromClient, address = server_socket.recvfrom(64)
    options[dataFromClient]()

	if(GPIO.input(17) == 0):
		print "Detection"
Ger fel:
if(GPIO.input(17) == 0):
^
IndentationError: unexpected indent
mippen
Inlägg: 740
Blev medlem: 15 april 2009, 15:34:31
Ort: Lindome

Re: Python tutorial för att lära sig grunderna?

Inlägg av mippen »

sodjan skrev:> # dataFromClient, address = server_socket.recvfrom(256)

Om jag ser rätt så är flag=256:

198: #define MSG_EOR MSG_EOR
199: MSG_WAITALL = 0x100, /* Wait for a full request. */


Prova med server_socket.recvfrom(64) istället (alltså MSG_DONTWAIT = 0x40, /* Nonblocking IO. */).

Utgick från att det var mottagningsbuffer inom parantesen.. Hmm..
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43180
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Python tutorial för att lära sig grunderna?

Inlägg av sodjan »

Utgå inte från någonting alls, RTFM...

> IndentationError: unexpected indent

Ja men fixa det då. Det syns ju direkt i rutan ovan.
XorXaX
Inlägg: 409
Blev medlem: 27 maj 2004, 09:44:16

Re: Python tutorial för att lära sig grunderna?

Inlägg av XorXaX »

Kod: Markera allt

   if(GPIO.input(17) == 0):
      print "Detection"
Du kan inte ha parentes direkt efter if utan mellanslag.

Kod: Markera allt

   if (GPIO.input(17) == 0):
      print "Detection"
eller

Kod: Markera allt

   if GPIO.input(17) == 0:
      print "Detection"
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43180
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Python tutorial för att lära sig grunderna?

Inlägg av sodjan »

> Du kan inte ha parentes direkt efter if utan mellanslag.

Kod: Markera allt

>>> if(a == 1):
...   print "OK"
...
OK
>>>
??

(Python 2.7.8...)
Senast redigerad av sodjan 4 januari 2016, 13:42:50, redigerad totalt 2 gånger.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43180
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Python tutorial för att lära sig grunderna?

Inlägg av sodjan »

Kod: Markera allt

while True:
    dataFromClient, address = server_socket.recvfrom(64)
    options[dataFromClient]()

    if(GPIO.input(17) == 0):
      print "Detection"
Notera att "if" nu ligger i linje med "data" och "options".
mippen
Inlägg: 740
Blev medlem: 15 april 2009, 15:34:31
Ort: Lindome

Re: Python tutorial för att lära sig grunderna?

Inlägg av mippen »

sodjan skrev:Utgå inte från någonting alls, RTFM...
Erkänner att jag inte läste manualen... och att utgå från saker innan är dumt..
sodjan skrev: "socket.recvfrom(bufsize[, flags])
Säkert feltolkning av mig när det både finns bufsize och flaggor....
sodjan skrev: > IndentationError: unexpected indent

Ja men fixa det då. Det syns ju direkt i rutan ovan.
Precis därför jag behövde Python for dummies så att jag kan lära mig vad som menas med indent:en....
https://www.codecademy.com/learn/python
Var precis det jag var ute efter.. lättläst, grundlig och tydlig.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43180
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Python tutorial för att lära sig grunderna?

Inlägg av sodjan »

> Säkert feltolkning av mig när det både finns bufsize och flaggor....

Nej, fel av mig i hastigheten! Det bör nog vara (256, 64).
Default för flags är 0. Jag undrade varför det var 256... :-)
Skriv svar