jede Stunde soll die Zahl größer werden

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
A1245x
User
Beiträge: 28
Registriert: Donnerstag 10. April 2014, 13:02

Hallo,
Ich möchte gerne wissen, wie ich eine Zahl um jede Stunde vergrößere.
Also zum Beispiel:
K = 30
K soll jede Stunde zum Beispiel um 1 vergrößert werden.
Danke im vorraus :)
Bin noch Anfänger. Also bitte nicht so kompliziert erklären.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Statt den Wert zu aendern wuerde ich den neuen Wert berechnen:

Code: Alles auswählen

import datetime

class TimeDependantValue(object):
    def __init__(self, initial, change, time_delta, start_time=None):
        self.start = start_time if start_time is not None else datetime.datetime.now()
        self.initial = initial
        self.change = change
        self.time_delta = time_delta

    @property
    def value(self):
        current = datetime.datetime.now()
        times = 0
        while current > self.start:
            times += 1
            current -= self.time_delta
        return self.initial + (self.change * times)

k = TimeDependantValue(30, 1, datetime.timedelta(hours=1))
k.value # => 30
# 3 stunden spaeter ...
k.value # => 33
Zuletzt geändert von cofi am Samstag 12. April 2014, 16:40, insgesamt 1-mal geändert.
Grund: Code korrigiert
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Vielleicht so:

Code: Alles auswählen

import time

class TimedValue(object):
    def __init__(self, value, seconds):
        self._value = value
        self._seconds = seconds
        self._creation = time.time()

    @property
    def value(self):
        current = time.time()
        return self._value + int((current - self._creation) / self._seconds)

Code: Alles auswählen

>>> K = TimedValue(30, 10)
>>> K.value
30
>>> # after 10 seconds...
>>> K.value
31
>>> # after 20 seconds...
>>> K.value
32
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
A1245x
User
Beiträge: 28
Registriert: Donnerstag 10. April 2014, 13:02

Bei mir kommt folgender Fehlercode:


Traceback (most recent call last):
File "G:/Informatik/Python/Python Programme/Programme/Anderes/zeit änderung.py", line 20, in <module>
k.value # => 30
File "G:/Informatik/Python/Python Programme/Programme/Anderes/zeit änderung.py", line 17, in value
return intial + (change * times)
NameError: name 'intial' is not defined

Könnt ihr mir helfen?
Zuletzt geändert von A1245x am Samstag 12. April 2014, 12:00, insgesamt 1-mal geändert.
Bin noch Anfänger. Also bitte nicht so kompliziert erklären.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@A1245x
Das ist ein weit verbreiteter 'copy&paste' Error, da kann man kaum was gegen unternehmen...
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
A1245x
User
Beiträge: 28
Registriert: Donnerstag 10. April 2014, 13:02

@mutetella
Dein Code funktioniert, aber was muss Ich ändern, damit es sich zum Beispiel jede 30s statt 10s ändert?
Und ändert das weiter wenn das Programm "offline" ist?
Ich brauch nämlich sowas.

EDIT: Nein, leider nicht. Weiss jemand, wie sich dass auch offline ändert? So jede 24h. Ich hätte eine Idee, weiss aber nicht wie ich das umsetzen kann, nämlich mit dem Befehl time.localtime.würde das gehen?Und wenn ja, wie?
Vielen Dank
Zuletzt geändert von A1245x am Samstag 12. April 2014, 12:15, insgesamt 1-mal geändert.
Bin noch Anfänger. Also bitte nicht so kompliziert erklären.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

A1245x hat geschrieben:Dein Code funktioniert, ...
Cofi's Code funktioniert auch...
A1245x hat geschrieben:aber was muss Ich ändern, damit es sich zum Beispiel jede 30s statt 10s ändert?
Das erschließt sich doch sehr einfach aus den Argumenten, die beim Erstellen eines `TimedValue` Exemplares verwendet werden.
A1245x hat geschrieben:Und ändert das weiter wenn das Programm "offline" ist?
Was meinst Du mit 'offline'? Ab dem Moment, ab dem das `TimedValue` Exemplar (in diesem Beispiel an den Namen 'K' gebunden) nicht mehr existiert, kannst Du darauf auch nicht mehr zugreifen und Du erhältst demnach auch keine Werte mehr. Wenn Du also das Programm, innerhalb dessen Du mit `TimedValue` Exemplaren arbeitest, beendest, musst Du diese natürlich abspeichern.

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
A1245x
User
Beiträge: 28
Registriert: Donnerstag 10. April 2014, 13:02

Mit offline meine ich den Pc ausschalten bzw. Programm beenden.
Ps: Mein Edit oben beachten
Bin noch Anfänger. Also bitte nicht so kompliziert erklären.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@A1245x
Wenn Du eine Idee hast, dann setz' das doch mal um und wenn Probleme auftauchen, dann frag'. Zum Thema "offline" hab' ich Dir ja schon geantwortet.

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
A1245x
User
Beiträge: 28
Registriert: Donnerstag 10. April 2014, 13:02

Code: Alles auswählen

lt2 = time.localtime()
lt = lt2[1:2]
K = 30

#Und hier fängt mein Problem an:

if lt > 30:
    K + 1
    print(K)
    print("Schließen:Eingabe")
    input()
else:
    print(K)
    print("Schließen:Eingabe")
    input()
Zuletzt geändert von Anonymous am Samstag 12. April 2014, 13:06, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
Bin noch Anfänger. Also bitte nicht so kompliziert erklären.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

mutetella hat geschrieben:
A1245x hat geschrieben:Dein Code funktioniert, ...
Cofi's Code funktioniert auch...
Ja, wenn man das fehlende `self.` ergaenzt und den Tippfehler korrigiert .. :oops:

@A1245x: Wenn "offline" beeinhaltet, dass sich das Programm schliesst, musst du eben dafuer sorgen, dass du die Startzeit ausserhalb, zB in einer Datei, speicherst.

Bei meinem Code gibt es den `start_time` Parameter um einen anderen Startwert zu setzen und mutetellas Code laesst sich auch einfach entsprechend anpassen.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

A1245x hat geschrieben:Und hier fängt mein Problem an
Ich glaube, Dein Problem fängt schon früher an... :wink:
Du bindest `lt2` an ein `struct_time` object der aktuellen Zeit und `lt` an ein tuple, das als einzigen Wert die Zahl des aktuellen Monats enthält. Was möchtest Du also mit ``if lt > 30`` erreichen und sollte diese Bedingung zutreffen, was soll ``K + 1`` bewirken?

mutetella

P.S. Und bitte setze Deine Codebeispiele in die dafür vorgesehen Codetags, damit erleichterst Du das Lesen ungemein...
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
A1245x
User
Beiträge: 28
Registriert: Donnerstag 10. April 2014, 13:02

Ok, Jetzt mal die Sachen beiseite:
Kann ich mit den if Befehl es so machen, sodass am Ende des monats bzw. Jeden Tag die Zahl K mit 1 addiert wird?
Wenn ja, wie?
Ich will den Code in vielen Programmen einprogrammieren, also soll K hier eigentlich (noch) nichts bewirken.
Bin noch Anfänger. Also bitte nicht so kompliziert erklären.
BlackJack

@A1245x: Das geht mit den „Sachen” die Du gerne beiseite lassen möchtest. Und da ist bei beiden Lösungen kein ``if`` dabei gewesen. Mit einem einfachen ``if`` und einem ``+ 1`` wäre es alleine ja auch nicht getan, denn dann hätte man ja immer den Wert K oder den Wert K + 1. Die sinnvolle Vorgehensweise, die ja auch von beiden gezeigten Lösungen umgesetzt wurde, ist einen Nullpunkt bestimmen, und dann auszurechnen wie viele Intervalle, also zum Beispiel Tage, man von diesem Nullpunkt entfernt ist, und das dann auf K drauf addieren. Eigentlich relativ einfache Mathematik, und mit dem `datetime`-Modul hat man auch einfache Möglichkeiten mit Datums- und Zeitangaben zu rechnen.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@A1245x
Ja, das ``if``-Statement könnte Dir dabei helfen. Aber ich glaube, Du solltest jetzt einfach mal die beiden Lösungen genau anschauen und verstehen. Du versuchst, Dich irgendwie zu einer irgendwie funktionierenden Lösung durchzuhangeln. Du hast bereits definiert, was Du erreichen möchtest und dazu zwei Lösungen erhalten. Aufbauend darauf solltest Du weitermachen und wenn Du etwas konkret nicht verstehst, wird Dir das hier bestimmt gerne erklärt werden.

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@A1245x: Als angehender Python-Profi (s. deine Signatur) zeigst du leider sehr wenig Interesse daran, zu verstehen, wie vergekaute Codebeispiele genau funktionieren. So wird das wohl nichts mit der Programmierkarriere... ;)
Benutzeravatar
A1245x
User
Beiträge: 28
Registriert: Donnerstag 10. April 2014, 13:02

Ok, Vielen Dank.
Das mit der Signatur werd ich mal ignorieren.
Bin noch Anfänger. Also bitte nicht so kompliziert erklären.
Benutzeravatar
A1245x
User
Beiträge: 28
Registriert: Donnerstag 10. April 2014, 13:02

So, Ich habs halbwegs geschafft...
Allerdings habe ich nun folgendes Problem:

Code: Alles auswählen

import time
TAG = 0 
MONAT = 0 
JAHR = 0 
x = 1
y = 1
z = 1

a = 2014
b = 4
c = 12
d = 0
e = 0
f = 0
g = 0
h = 0
i = 0
A = 2014 + JAHR
B = 5 + MONAT
C = 12 + TAG
D = 0
E = 0
F = 0
G = 0
H = 0
I = 0
dztupel1 = a, b, c, d, e, f, g, h, i
damals1 = time.mktime(dztupel1)
print("Zeit 1:", time.strftime("%d.%m.%Y %H:%M:%S",
                               dztupel1))

dztupel2 = A, B, C, D, E, F, G, H, I
damals2 = time.mktime(dztupel2)
print("Zeit 2:", time.strftime("%d.%m.%Y %H:%M:%S",
                               dztupel2))
diff_sek = damals2 - damals1
diff_min = diff_sek/60
diff_std = diff_min/60
diff_tag = diff_std/24
diff_monat = diff_tag/30
diff_jahr = diff_tag/300
if diff_tag > x:
    print("TAG")
    TAG + 1
else:
    time.sleep(0)

if diff_monat > y:
    print("MONAT")
    MONAT + 1
else:
    time.sleep(0)

if diff_jahr > z:
    print("JAHR")
    JAHR + 1
else:
    time.sleep(0)

print("Schließen:Eingabe")
input()

    
    
    

Nun ist das Problem, dass das + 1 gespeichert werden soll(siehe If bereich).
Versteht ihr was ich meine?
Wie kann ich das machen?
Bin noch Anfänger. Also bitte nicht so kompliziert erklären.
BlackJack

@A1245x: Der Quelltext ist äusserst schlecht. Fang bitte gar nicht erst an mit lauter einbuchstabigen Namen und durchnummerierten Namen. Einbuchstabe Namen sind in sehr begrenzen Gültigkeitsbereichen wie „list comprehensions” und Generatorausdrücken in Ordnung, oder für Zählvariablen mit ganzen Zahlen (`i`, `j`, `k`) und Koordinaten (`x`, `y`, `z`) wo die Leser so etwas aus der Mathematik kennen, aber ansonsten sollte ein Name dem Leser vermitteln was der Wert, der daran gebunden ist, bedeutet. Das ist in dem gezeigten Programm ganz sicher nicht der Fall. Und wenn man anfängt Namen mit angehängten Nummern zu versehen, dann möchte man entweder eine Datenstruktur verwenden, oft eine Liste, oder sich bessere, passendere Namen ausdenken.

Der konkrete Datentyp sollte nicht im Namen stehen. Wenn man den Typ später einmal ändert, und das kommt durchaus vor, muss man entweder an allen Stellen im Programm den oder die Namen anpassen, oder man hat irreführende Namen im Quelltext stehen.

Zum Rechnen mit Datums- und Zeitangaben weise ich jetzt einfach *noch mal* auf das `datetime`-Modul hin.

Die ganzen ``else``-Zweige machen keinen Sinn, die kann man ersatzlos streichen.

Was willst denn *eigentlich* machen, denn ich habe immer noch das Gefühl das Du das falsch angehst, wenn ich mir die Texte der Beiträge in diesem und in dem Cäsar-Verschlüsselungsthema so anschaue. Denn dann würdest Du hier versuchen einen Wert kontinuierlich aktuell zu halten während das Programm läuft, und bist auch darauf angewiesen dass das Programm wirklich kontinuierlich läuft und icht für mehr als das Zeitintervall zum Schlüssel änder ausfällt, und das obwohl man den Wert ganz einfach zu jedem Zeitpunkt *berechnen* kann.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@A1245x: so wie ich das verstanden habe, hast Du einen fixen Startzeitpunkt, und einen Zeitpunkt, an dem die Nachricht verschlüsselt wurde, und willst aus diesen zwei Angaben einen zeitabhängigen Schlüssel generieren:

Code: Alles auswählen

import datetime
START_DATE = datetime.datetime(2014,4,12)

def generate_key_values(current_date):
    months, days = divmod((current_date - START_DATE).days, 30)
    years, months = divmod(months, 360)
    return years, months, days

def main():
    current_date = datetime.datetime(2014,5,12)
    print(generate_key_values(current_date))

if __name__ == '__main__':
    main()
Antworten