Funktioner och parametrar

  • Författare
  • Meddelande
Användarvisningsbild

gostal

css-guru

  • Inlägg: 77
  • Blev medlem: 05 sep 2014, 10:37

Funktioner och parametrar

Inlägg14 nov 2014, 14:56

Att läsa dokumentationen om funktioner, parametrar och argument är allt annat än klargörande. Tittar man i glossary så finns det två slags argument: positional och keyword och fem slags parametrar vilkas beskrivningar inte är så enkla att särskilja i samtliga fall. Läser man beskrivningen av skillnaden mellan parameter och argument så står det att parametrar är det som står i funktionsdefinitionen och argument de värden man anger vid anropet. Tutorial nämner fyra sätt att överföra värden (argument): via den traditionella namngivna parametern, via default parameter som är ett namn med ett standardvärde, via keyword argument som i en syntax-rad är omöjlig eller i varje fall mycket svår att skilja från default parameter, samt via arbitrary argument list. Till exempel kan vi titta på on-line-hjälpen för print:
print(...)
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)

Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep: string inserted between values, default a space.
end: string appended after the last value, default a newline.
flush: whether to forcibly flush the stream.

Här står det tydligt att det finns optional keyword arguments. Klart och tydligt! Bra! Och value är uppenbarligen det som ska skrivas ut men vad representerar ...? Annat exempel:
split(...)
S.split(sep=None, maxsplit=-1) -> list of strings

Return a list of the words in S, using sep as the
delimiter string. If maxsplit is given, at most maxsplit
splits are done. If sep is not specified or is None, any
whitespace string is a separator and empty strings are
removed from the result.

Här får man inte klart för sig vilken typ av argument det handlar om förutom att de har standardvärden och då inte behöver anges. Om man vill ange dem framgår det inte hur de ska anges. Är det keyword eller positional? För att ytterligare förvirra så fungerar olika python-tolkar på olika sätt och accepterar ibland anrop på alla möjliga sätt.

Ibland anges parameterlistan i dokumentationen som:
Kod: Markera allt
def func(x, *args, **kwargs):
...

där **kwargs uppenbarligen handlar om keyword arguments vilket då skulle innebära att både x och *args var positional... Ja, det går att vända och vrida på det här på många sätt. Ett tydligt exempel på hur förvirrande det kan bli är denna lilla funktionspaketering:
Kod: Markera allt
>>> def printme(string):
...         print(string)
...         return
...
Nu kan man tänka att man ska anropa printme() endera med string tilldelad i förväg eller med en literal och det går så klart bra och i de fallen blir det ingen skillnad mellan print() och printme() men av någon för mig obegriplig anledning fungerar även anropet printme(string='cykel') och skriver ut ordet 'cykel' och det påverkar inte värdet av den lokala variabeln string men det är ju olika namnrymder så det är inte förvånande. Det går alltså att använda parametern string som om den hade ett standardvärde i printme() men något sådant är ju inte satt! och det går mycket riktigt inte att göra printme(). Försöker man får man veta att det saknas ett positional argument. (Så klart går det inte att göra print(string='cykel), men det var det väl ingen som trodde.)

??????
Hur hänger allt detta ihop egentligen?

Finns det några riktlinjer för hur man ska tolka on-line-hjälpen i python-tolken utifrån syntax-raden om det inte står klart uttryckt verbalt? Så klart kan man alltid prova men om det fanns något sätt att höja sannolikheten för en fungerande tolkning så vore det bra. Att prova ger ju heller ingen garanti för att det fungerar på en annan python-tolk.
gostal
:-^^-:
Användarvisningsbild

mos

dbwebb

  • Inlägg: 10922
  • Blev medlem: 10 nov 2011, 09:52
  • Ort: Ronneby / Bankeryd

Re: Funktioner och parametrar

Inlägg14 nov 2014, 21:23

gostal skrev:Här står det tydligt att det finns optional keyword arguments. Klart och tydligt! Bra! Och value är uppenbarligen det som ska skrivas ut men vad representerar ...?


... representerar variabelt antal argument.
Kod: Markera allt
>>> print("mumintrollet", "åker moped")
mumintrollet åker moped
...
..:
.... /mos
Användarvisningsbild

mos

dbwebb

  • Inlägg: 10922
  • Blev medlem: 10 nov 2011, 09:52
  • Ort: Ronneby / Bankeryd

Re: Funktioner och parametrar

Inlägg14 nov 2014, 21:27

gostal skrev:
split(...)
S.split(sep=None, maxsplit=-1) -> list of strings

Return a list of the words in S, using sep as the
delimiter string. If maxsplit is given, at most maxsplit
splits are done. If sep is not specified or is None, any
whitespace string is a separator and empty strings are
removed from the result.

Här får man inte klart för sig vilken typ av argument det handlar om förutom att de har standardvärden och då inte behöver anges. Om man vill ange dem framgår det inte hur de ska anges. Är det keyword eller positional


Det är både ock, positional och keyword.
Kod: Markera allt
>>> "mumintrollet åker moped".split()
['mumintrollet', 'åker', 'moped']
>>> "mumintrollet åker moped".split("m")
['', 'u', 'introllet åker ', 'oped']
>>> "mumintrollet åker moped".split(maxsplit=1)
['mumintrollet', 'åker moped']
>>>
...
..:
.... /mos
Användarvisningsbild

mos

dbwebb

  • Inlägg: 10922
  • Blev medlem: 10 nov 2011, 09:52
  • Ort: Ronneby / Bankeryd

Re: Funktioner och parametrar

Inlägg14 nov 2014, 21:30

gostal skrev:Ibland anges parameterlistan i dokumentationen som:
Kod: Markera allt
def func(x, *args, **kwargs):
...

där **kwargs uppenbarligen handlar om keyword arguments vilket då skulle innebära att både x och *args var positional...


Ett vanligt sätt att beskriva argumenten när man inte vet hur många man får in, som i print(...) som tar variabelt antal argument.

Läs en detaljerad förklaring här:
http://stackoverflow.com/questions/3394 ... and-kwargs
...
..:
.... /mos
Användarvisningsbild

mos

dbwebb

  • Inlägg: 10922
  • Blev medlem: 10 nov 2011, 09:52
  • Ort: Ronneby / Bankeryd

Re: Funktioner och parametrar

Inlägg14 nov 2014, 21:39

gostal skrev:
Kod: Markera allt
>>> def printme(string):
...         print(string)
...         return
...
Nu kan man tänka att man ska anropa printme() endera med string tilldelad i förväg eller med en literal och det går så klart bra och i de fallen blir det ingen skillnad mellan print() och printme() men av någon för mig obegriplig anledning fungerar även anropet printme(string='cykel') och skriver ut ordet 'cykel' och det påverkar inte värdet av den lokala variabeln string men det är ju olika namnrymder så det är inte förvånande. Det går alltså att använda parametern string som om den hade ett standardvärde i printme() men något sådant är ju inte satt! och det går mycket riktigt inte att göra printme(). Försöker man får man veta att det saknas ett positional argument. (Så klart går det inte att göra print(string='cykel), men det var det väl ingen som trodde.)


Först åteskapa funktionen du gör.

Kod: Markera allt
>>> def printme(str):
...   print(str)
...


str blir mitt argument. Det är både positional och keyword.

Kod: Markera allt
>>> printme("mumin")
mumin
>>> printme(str="moped")
moped


Sen kan jag uppdatera funktionen för att köra på ett default-värde också.

Kod: Markera allt
>>> printme()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: printme() missing 1 required positional argument: 'str'
>>> def printme(str="default"):
...   print(str)
...
>>> printme()
default


Sammantaget är det dessa bitar som man behöver få ihop så finns det en helhet bakom. Hoppas det hjälper dig att tänka i rätt banor.
...
..:
.... /mos
Användarvisningsbild

gostal

css-guru

  • Inlägg: 77
  • Blev medlem: 05 sep 2014, 10:37

Re: Funktioner och parametrar

Inlägg17 nov 2014, 17:28

Är det alltså så att parametrar normalt är både keyword och positional men att detta går att trasa sönder i funktionsdefinitionen så att det blir antingen-eller? Undra på att jag tycker det är rörigt! Får hoppas det klarnar så småningom. Får väl att labba en del med de olika metoderna så kanske kvintessensen ramlar ut nå'n gång.
gostal
:-^^-:

Vilka är online

Användare som besöker denna kategori: Google [Bot] och 10 gäster