Path: csiph.com!fu-berlin.de!uni-berlin.de!not-for-mail From: Stefan Behnel Newsgroups: de.comp.lang.python Subject: Re: [Python-de] f-string Formatanweisung Date: Mon, 22 Jun 2020 14:55:40 +0200 Lines: 102 Message-ID: References: <3c7649df-8e7a-6099-878c-a10882a90955@behnel.de> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Trace: news.uni-berlin.de DtWPMVS2PaV+1QOtIosSEADDvolJB9QQA+wZfn8yUQKA== Return-Path: X-Original-To: python-de@python.org Delivered-To: python-de@mail.python.org Authentication-Results: mail.python.org; dkim=pass reason="2048-bit key; unprotected key" header.d=behnel.de header.i=@behnel.de header.b=DYZp5NlE; dkim-adsp=pass; dkim-atps=neutral DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; t=1592830726; s=strato-dkim-0002; d=behnel.de; h=In-Reply-To:Date:Message-ID:From:References:To:Subject: X-RZG-CLASS-ID:X-RZG-AUTH:From:Subject:Sender; bh=7BtIPO1EvSA/dOd87dcCp6opoaz1NLrW18WhCxuUtEE=; b=DYZp5NlE3SygiP/HDLoYi2nDnPLeJn+B8O0cn1FUMrVs+l79LW63i9Na2WcupN/c7j MUwdS1Sp2tcCTc/AO6zo6AH0a19iEpf7wmG6omHzKduhV3sBfZ+3gG9FDkH8YPdUTfBV 50SNERvVXeOK0gnMYhR2NaIoTcfei+Gv8Nl25NGNcpADAx0FlYmsr5ACCl0MCv6EN6U6 uE1sRR7fJgJpdg00+yDdxejHBMMQdRQw6tcUicmeJsZvI+fWIN4gVa6ZSDy9HMDtgEyN cd/sp94aRkH076HFQyupwFh4rcVMVjGSe1ptq0fNVOHrOGvTWRrRuLfmxUTsvBMfGd5q RaoQ== X-RZG-AUTH: ":E1MMdFW4b++AXZOTwA41DOYM0Dv9LNWvavC/fJZ6Wfgmp/Lh1ANWCRaaq2R1hHsoZh74ArcRjqdrtbnfdSk7SR00Qivwavc27kbrx2CHRUeo5xXR" X-RZG-CLASS-ID: mo00 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.8.0 In-Reply-To: Content-Language: de-DE X-BeenThere: python-de@python.org X-Mailman-Version: 2.1.33 Precedence: list List-Id: Die Deutsche Python Mailingliste List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Mailman-Original-Message-ID: <3c7649df-8e7a-6099-878c-a10882a90955@behnel.de> X-Mailman-Original-References: Xref: csiph.com de.comp.lang.python:5645 Hallo Martin, schön, dass du deinen Code hier veröffentlichst. Lass es mich zum Anlass nehmen, weiter unten noch ein paar Kommentare dazu zu schreiben. Das hier s='f"'+(f"{{i:0{dl}d}} {{gray:0{fw}b}} {{bin:0{fw}b}}")+'"' scheint mir ein Versuch zu sein, einen f-string innerhalb einer Zeichenkette zu generieren. War das beabsichtigt? Zumindest wird er dann nirgendwo verarbeitet. Wie Mike schon bemerkte, fehlt da irgendwas, aber mir ist nicht so ganz klar, was der Zweck war und was dann die richtige Korrektur wäre. Kannst du das ein bisschen erklären? ruppert@hs-worms.de schrieb am 22.06.20 um 12:36: > #!/usr/bin/python3 > import sys > if(len(sys.argv)<2): > a=sys.argv[0].split('/') > a=a[len(a)-1] > print('usage:',a,'digits of GrayCode') > print(' eg.',a,'12') > exit(1) > > def bintogray(bin): > return(bin^(bin>>1)) > > def graytobin(n,gray): > val=0 > for i in range(n,-1,-1): > val = val|((((1<<(i+1))&val)>>1)^((1< return(val) > > dbg=0 > if(len(sys.argv)>2):dbg=int(sys.argv[2]) > fl=int(sys.argv[1]) > fw=fl > if(fw<4):fw=4 > dl=int(fl/3.321928+1) #dezimale Stellen > if(dl<4):dl=4 > f="%%-%ds %%-%ds %%-%ds"%(dl,fw,fw) > if(dbg>0):print("f=",f) > h=f%("#val","gray","bin") > f="{{:0{:1d}d}} {{:0{:1d}b}} {{:0{:1d}b}}".format(dl,fw,fw) > #s wird in der for-Schleife unten nicht interpretiert, > #sondern als string ausgegeben: > s='f"'+str(f"{{i:0{dl}d}} {{gray:0{fw}b}} {{bin:0{fw}b}}")+'"' > if(dbg>0):print("f=",f) > if(dbg>0):print("s=",s) > for i in range(2**fl): > if(i%24==0):print(h) > gray=bintogray(i) > bin=graytobin(fl,gray) > print(f.format(i,gray,bin)) > s='f"'+(f"{{i:0{dl}d}} {{gray:0{fw}b}} {{bin:0{fw}b}}")+'"' > print(s) Zusätzlich zu dem, was Mike schon gesagt hat: es wäre vermutlich auch für dich einfacher gewesen, in diesem Code einen Fehler zu finden, wenn du den Code mit mehr Abständen hingeschrieben hättest. Als jemand, der schon oft genug kopfschüttelnd vor meinem eigenen Code von vor ein paar Jahren gestanden hat, kann ich dir sagen: Code wird immer für Menschen geschrieben, nicht für Maschinen. Ich finden z.B. das hier if(fw<4):fw=4 dl=int(fl/3.321928+1) #dezimale Stellen if(dl<4):dl=4 f="%%-%ds %%-%ds %%-%ds"%(dl,fw,fw) sehr schwer zu lesen, wohingegen ich das folgende viel klarer finde: if fw < 4: fw = 4 dl = int(fl / 3.321928 + 1) # dezimale Stellen if dl < 4: dl = 4 f = "%%-%ds %%-%ds %%-%ds" % ( dl, fw, fw) Noch besser als das letzte Kommando finde ich in diesem Fall: f = f"%-{dl}s %-{fw}s %-{fw}s" Und der Zahl "3.321928" würde ich auch noch einen Namen geben, damit klar ist, woher die so plötzlich kommt und was für eine Bedeutung die hat, z.B. DEZIMALE_STELLEN_PRO_FRZLFIFF = 3.321928 dezimale_stellen = int(fl / DEZIMALE_STELLEN_PRO_FRZLFIFF + 1) Vielleicht ist das nicht auf den ersten Blick klar, aber es könnte irgendwann ein Tag kommen, an dem du jemandem auf den Knien danken möchtest, dass eine Variable im Code "dezimale_stellen" heißt und nicht "dl". Im besten Fall dir selbst. Stefan