Matroids Matheplanet Forum Index
Moderiert von matph
Informatik » Programmieren » Python: Auslagern in Funktion
Autor
Schule Python: Auslagern in Funktion
Bekell
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 05.09.2008
Mitteilungen: 2517
  Themenstart: 2021-07-30

Hallo, ich möchte meinen funktionierenden Zellfärbeblock in eine Funktion auslagern. \sourceon Python \numberson from openpyxl import Workbook from openpyxl.styles import Color, PatternFill, Font, Border wb = Workbook() ws=wb.active leuchtendgrünFill = PatternFill(start_color="FF00FF00", end_color="FF00FF00", fill_type="solid") yellowFill = PatternFill(start_color="00FFFF00", end_color="00FFFF00", fill_type="solid") redFill = PatternFill(start_color="FFFF0000", end_color="FFFF0000", fill_type="solid") def def_zellenferber(li,nr,key): abso=0 if len(li)==1: # Färbeblock ws.cell(nr+2,key+1).fill = yellowFill if len(li)==2: ws.cell(nr+2,key+1).fill = leuchtendgrünFill if len(li)==3: ws.cell(nr+2,key+1).fill = redFill return \sourceoff jetzt fragt er mich: NameError: name 'ws' is not defined Im Hauptprogramm ist ws.definiert. Muß ich denn das gesamte Excel-Öffnungzeremoniell in die Funktion übertragen? Ich dachte, wenn man aus einer Funktion heraus den print-Befehl benutzt, wird doch auch dort gedruckt, wie aus dem Mainblock heraus. Also, die Tabelle wird in Excel zwar gedruckt, aber nicht gefärbt. Woran kann das liegen?


   Profil
DerEinfaeltige
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 11.02.2015
Mitteilungen: 2999
  Beitrag No.1, eingetragen 2021-07-30

Wenn du ein Objekt (hier ein Excelworksheet-Objekt) innerhalb einer Funktion nutzen will, muss man entweder der Funktion sagen, dass sie dieses als globale Variable nutzen soll oder der Funktion das Objekt eben übergeben.


   Profil
Bekell
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 05.09.2008
Mitteilungen: 2517
  Beitrag No.2, vom Themenstarter, eingetragen 2021-07-30

\quoteon(2021-07-30 15:13 - DerEinfaeltige in Beitrag No. 1) Wenn du ein Objekt (hier ein Excelworksheet-Objekt) innerhalb einer Funktion nutzen will, muss man entweder der Funktion sagen, dass sie dieses als globale Variable nutzen soll oder der Funktion das Objekt eben übergeben. \quoteoff Danke Einfältiger, erklärst Du bitte am Beispiel, wie man A (der Funktion sagen) und B (der Funktion das Objekt übergeben) macht? ich übergebe ja schon Variable...


   Profil
helmetzer
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 14.10.2013
Mitteilungen: 1532
  Beitrag No.3, eingetragen 2021-07-30

Kann den Fehler nicht reproduzieren.


   Profil
Folgende Antworten hat der Fragesteller vermutlich noch nicht gesehen.
__blackjack__
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 23.09.2021
Mitteilungen: 39
  Beitrag No.4, eingetragen 2021-09-24

@Bekell: Mir geht es wie helmetzer, ich kann das Problem mit dem gezeigten Code nicht nachvollziehen. Das würde auftreten wenn es `ws` nicht auf Modulebene geben würde. Das sollte da auch nicht stehen, sondern ebenfalls lokal in einer Funktion existieren. Ja, Du übergibst der Funktion Werte, aber eben nicht alle die benötigt werden. `ws` halt nicht. Das `def_` am Anfang vom Funktionsnamen macht keinen Sinn. Funktionen erkennt man daran, dass der Name die Tätigkeit beschreibt, die die Funktion durchführt. Damit kann man Funktionen leicht von eher passiven Werten unterscheiden. `abso` wird definiert, aber nirgends verwendet. Das ``return`` am Ende der Funktion ist sinnlos, das passiert da auch ohne diese Anweisung. Die drei ``if``-Bedingungen schliessen sich gegenseitig aus, da würde man also besser ``elif`` einsetzen, damit nicht unnötig geprüft wird. Da sich die Inhalte der Zweige aber nur durch einen berechenbaren Wert unterscheiden, würde man eher die Farben/Füllmuster in eine Liste stecken und über den berechneten Index darauf zugreifen. \sourceon python #!/usr/bin/env python3 from openpyxl import Workbook from openpyxl.styles import PatternFill LIGHT_GREEN_FILL = PatternFill("solid", "FF00FF00", "FF00FF00") RED_FILL = PatternFill("solid", "FFFF0000", "FFFF0000") YELLOW_FILL = PatternFill("solid", "00FFFF00", "00FFFF00") def faerbe_zellen(sheet, an_argument_in_need_of_a_better_name, number, key): colors = [YELLOW_FILL, LIGHT_GREEN_FILL, RED_FILL] index = len(an_argument_in_need_of_a_better_name) - 1 if 0 <= index < len(colors): sheet.cell(number + 2, key + 1).fill = colors[index] def main(): workbook = Workbook() faerbe_zellen(workbook.active, [4711], 42, 23) if __name__ == "__main__": main() \sourceoff


   Profil
Bekell wird per Mail über neue Antworten informiert.

Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2021 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]