Pythonians: Есть ли лучший способ кодировать это на Python? - PullRequest
2 голосов
/ 17 июня 2011

Я старший PHP и чувак из Perl, но Python для меня новичок.Я наслаждаюсь изучением этого!Я написал приведенный ниже код, но не могу избавиться от ощущения, что он может быть лучше написан кем-то, обладающим навыками Python «старшего уровня».Вы настоящие питонцы?

Обратите внимание: я хочу, чтобы код читался.Предполагается, что Python читабелен - мы не пишем здесь Perl, люди!(пример: мне нравится, что «день недели» - это строка, а не целое число, это ОЧЕНЬ ясно)

import datetime
today = datetime.datetime.now()
weekday = today.strftime("%a")
hourmin = int(today.strftime("%H%M"))
print "today here is: " + today.strftime("%c") # for debug
if weekday == "Sat" or \
   (weekday == "Sun" and hourmin < 2000) or \
   (weekday == "Fri" and hourmin > 1630) or \
   (hourmin >= 1630 and hourmin < 2000) :
    print "bad time"
else:
    print "good time"

Ответы [ 4 ]

6 голосов
/ 17 июня 2011

Вы можете отобразить дневную строку в лямбду, которая занимает час в минуту и ​​определяет, плохая она или нет. Например:

# establish the "rules"    
bad_time = {
    'Sat': lambda h: True,    # always bad time!
    'Sun': lambda h: h < 2000,
    'Fri': lambda h: h > 1630,
}

# ... get your `weekday` and `hourmin` values

is_bad = bad_time.get(weekday, lambda h: (1630 <= h < 2000))(hourmin)
print 'bad time' if is_bad else 'good time'

edit : следуйте советам kindall.

3 голосов
/ 17 июня 2011

Я бы предложил использовать класс, который позволит вам легко определить, находится ли время в предопределенном диапазоне, а затем поместить экземпляры этого класса в словарь, чтобы записывать время каждого дня «плохо». Возможно, используйте несколько предопределенных диапазонов для удобства и простоты последующего изменения.

class hmrange(object):
    def __init__(self, start, end):
        self.start, self.end = start, end
    def __contains__(self, hm):
        return self.start <= hm < self.end

alldayhours  = hmrange(0000, 2400)
weekdayhours = hmrange(1630, 2000)

badhours = {
    'Sun': hmrange(0000, 2000)
    'Mon': weekdayhours
    'Tue': weekdayhours
    'Wed': weekdayhours
    'Thu': weekdayhours
    'Fri': hmrange(1630, 2400)
    'Sat': alldayhours
}

badtime =  hourmin in badhours[weekday]
3 голосов
/ 17 июня 2011

В python вы можете перейти на следующую строку, если у вас есть непревзойденные символы без обратной косой черты. Вы также можете сделать два сравнения в одном логическом выражении.

if (weekday == "Sat" or
    (weekday == "Sun" and hourmin < 2000) or
    (weekday == "Fri" and hourmin > 1630) or
    1630 <= hourmin < 2000):
    print "bad time"
else:
    print "good time"
0 голосов
/ 17 июня 2011
import datetime
today = datetime.datetime.now()
weekday = today.strftime("%a")
hourmin = int(today.strftime("%H%M"))
print "today here is: " + today.strftime("%c") # for debug
days = ["Sun", "Fri"]
times = [2000, 1630]
if weekday == "Sat" or \
    weekday in days and hourmin < times[days.index(weekday)] or \
    2000 > hourmin >= 1630:
    print "bad time"
else:
    print "good time"
...