Вы пытаетесь добавить grades
, поэтому после 6 итераций это будет список из 6 значений. Поскольку вы добавляете gtotal
для каждой итерации, ваш код будет работать, когда вы удалите функцию append
.
Код:
print ("GPA Calculator")
gtotal = 0
ctotal = 0
grades = []
for i in (range(6)):
grades = input("Enter Grades in Order Here: ")
if grades == "A":
gtotal += 4
elif grades == "A-":
gtotal += 3.7
elif grades == "B+":
gtotal += 3.3
elif grades == "B":
gtotal += 3
elif grades == "B-":
gtotal += 2.7
elif grades == "C+":
gtotal += 2.3
elif grades == "C":
gtotal += 2
elif grades == "C-":
gtotal += 1.7
print(gtotal)
Выход:
GPA Calculator
24
Enter Grades in Order Here: A
Enter Grades in Order Here: A
Enter Grades in Order Here: A
Enter Grades in Order Here: A
Enter Grades in Order Here: A
Enter Grades in Order Here: A
Преобразуйте обе строки в метки времени (в Вашем выбранном разрешении, например, миллисекундах, секунды, часы, дни, безотносительно), вычтите ранее из позже, умножьте свое случайное число (предполагающий, что оно распределяется в range [0, 1]
) с тем различием, и добавьте снова к более раннему. Преобразуйте метку времени назад в строку даты, и у Вас есть случайное время в том диапазоне.
пример Python (вывод находится почти в формате, который Вы указали, кроме 0
, дополнение - обвиняет американские конвенции формата времени):
import random
import time
def str_time_prop(start, end, format, prop):
"""Get a time at a proportion of a range of two formatted times.
start and end should be strings specifying times formated in the
given format (strftime-style), giving an interval [start, end].
prop specifies how a proportion of the interval to be taken after
start. The returned time will be in the specified format.
"""
stime = time.mktime(time.strptime(start, format))
etime = time.mktime(time.strptime(end, format))
ptime = stime + prop * (etime - stime)
return time.strftime(format, time.localtime(ptime))
def random_date(start, end, prop):
return str_time_prop(start, end, '%m/%d/%Y %I:%M %p', prop)
print(random_date("1/1/2008 1:30 PM", "1/1/2009 4:50 AM", random.random()))
from random import randrange
from datetime import timedelta
def random_date(start, end):
"""
This function will return a random datetime between two datetime
objects.
"""
delta = end - start
int_delta = (delta.days * 24 * 60 * 60) + delta.seconds
random_second = randrange(int_delta)
return start + timedelta(seconds=random_second)
точность является секундами. Можно увеличить точность до микросекунд или уменьшиться к, скажем, получасу, если Вы хотите. Поскольку это просто изменяют вычисление последней строки.
выполненный пример:
from datetime import datetime
d1 = datetime.strptime('1/1/2008 1:30 PM', '%m/%d/%Y %I:%M %p')
d2 = datetime.strptime('1/1/2009 4:50 AM', '%m/%d/%Y %I:%M %p')
print(random_date(d1, d2))
вывод:
2008-12-04 01:50:17
Концептуально это довольно просто. В зависимости от которого языка Вы используете Вас, сможет преобразовать те даты в некоторое ссылочное целое число на 32 или 64 бита, обычно представляя секунды с эпохи (1 января 1970), иначе известной как "Время Unix" или миллисекунды начиная с некоторой другой произвольной даты. Просто генерируйте случайное целое число на 32 или 64 бита между теми двумя значениями. Это должно быть одним лайнером на любом языке.
На некоторых платформах можно генерировать время как двойное (дата является целой частью, время является дробной частью, одна реализация). Тот же принцип применяется кроме, Вы имеете дело с числами одинарной точности с плавающей точкой, или числа двойной точности с плавающей точкой ("плавает" или "удваивается" в C, Java и других языках). Вычтите различие, умножьтесь случайным числом (0 < = r < = 1), добавьте ко времени начала и сделанный.
Для чего Вы нуждаетесь в случайном числе? Обычно (в зависимости от языка) можно получить число секунд/миллисекунд с Эпохи с даты. Таким образом для randomd даты между startDate и endDate Вы могли сделать:
Много алгоритмов для преобразования даты к и от чисел уже доступны во многих операционных системах.
Самый легкий способ сделать это состоит в том, чтобы преобразовать оба числа в метки времени, затем установить их как минимальные и максимальные границы на генераторе случайных чисел.
А быстрый пример PHP был бы:
// Find a randomDate between $start_date and $end_date
function randomDate($start_date, $end_date)
{
// Convert to timetamps
$min = strtotime($start_date);
$max = strtotime($end_date);
// Generate random number using above bounds
$val = rand($min, $max);
// Convert back to desired date format
return date('Y-m-d H:i:s', $val);
}
Эта функция использует strtotime()
для преобразования описания даты и времени в метку времени Unix, и date()
для создания допустимой даты из случайной метки времени, которая была сгенерирована.