как остановить цикл, когда значение в Python <0 - PullRequest
2 голосов
/ 09 декабря 2011

как я могу остановить мой цикл, если prod_Available < 0 (отрицательное значение) и возвращает status = 0, иначе он возвращает status = 1 ?.Возможно ли, что когда мой цикл встречает prod_Available < 0, он прекращает цикл и возвращает status = 0.?

, вот мой код:

   def get_hotel_sum_quantity(self, product_id, checkin_date, checkout_date, quantity):
        check_in = datetime.datetime.strptime(checkin_date, '%Y-%m-%d')
        check_in = check_in.date()
        start_date = check_in.day

        check_out = datetime.datetime.strptime(checkout_date, '%Y-%m-%d')
        check_out = check_out.date()
        end_date = check_out.day

        prod = Product.objects.get(id=product_id)
        prod_Available = 0
        array = []
        for x in range(start_date,end_date + 1):
            x = x - start_date
            delta = datetime.timedelta(days=x)
            all_date = check_in + delta
            sumOfQuantity = HotelCheck.objects.filter(date_booked=all_date, product=prod).aggregate(Sum('quantity'))['quantity__sum']
            if sumOfQuantity == None:
                sumOfQuantity = 0
            prod_Available = prod.quantity - sumOfQuantity
            prod_Available = float(prod_Available) - float(quantity)

            if prod_Available < 0:
                status = 0
            else:
                status = 1
            data = {'available': prod_Available, 'status': status, 'sumquantity': sumOfQuantity, 'quanity': quantity}
            array.append(data)           
        return array

я уже вернул все значение, ноэто не остановит зацикливание, когда prod_Available < 0 вот что я сделал:

>>> from booking.models import *
>>> Hotel.objects.get_hotel_sum_quantity(3, '2011-12-21', '2011-12-24', 1)
[{'available': 1.0, 'status': 1, 'sumquantity': 8, 'quanity': 1}, {'available': 1.0, 'status': 1, 'sumquantity': 8, 'quanity': 1}, {'available': 1.0, 'status': 1, 'sumquantity': 8, 'quanity': 1}, {'available': 9.0, 'status': 1, 'sumquantity': 0, 'quanity': 1}]
>>> Hotel.objects.get_hotel_sum_quantity(3, '2011-12-21', '2011-12-24', 2)
[{'available': 0.0, 'status': 1, 'sumquantity': 8, 'quanity': 2}, {'available': 0.0, 'status': 1, 'sumquantity': 8, 'quanity': 2}, {'available': 0.0, 'status': 1, 'sumquantity': 8, 'quanity': 2}, {'available': 8.0, 'status': 1, 'sumquantity': 0, 'quanity': 2}]
>>> Hotel.objects.get_hotel_sum_quantity(3, '2011-12-21', '2011-12-24', 3)
[{'available': -1.0, 'status': 0, 'sumquantity': 8, 'quanity': 3}, {'available': -1.0, 'status': 0, 'sumquantity': 8, 'quanity': 3}, {'available': -1.0, 'status': 0, 'sumquantity': 8, 'quanity': 3}, {'available': 7.0, 'status': 1, 'sumquantity': 0, 'quanity': 3}]
>>> 

Может кто-нибудь может дать мне представление о моей ситуации?

заранее спасибо

Ответы [ 3 ]

3 голосов
/ 09 декабря 2011

Mayb, вы можете использовать оператор python break , чтобы остановить ваш цикл:

if prod_Available < 0:
    status = 0
else:
    status=1

data = {'available': prod_Available, 'status': status, 'sumquantity': sumOfQuantity, 'quanity': quantity}
array.append(data)         
if status == 0:
   break

затем, когда prod_available будет меньше 0, он остановит цикл, и ваш метод продолжит выполнение (и вернет массив в вашем случае)

0 голосов
/ 09 декабря 2011

Вы должны использовать оператор break, чтобы остановить цикл! Заметьте, что оператор break прерывает выполнение цикла, в котором вы его вызываете,

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

Возможно, вы хотите разорвать цикл в самом конце (хотите ли вы добавить данные в массив, даже если статус равен 0?)

array.append(data)
if prod_Available < 0:
    break
0 голосов
/ 09 декабря 2011

вместо

for x in range(start_date,end_date + 1):      
    x = x - start_date
    ............

вы должны написать:

for x in range(end_date -start_date + 1):      
    ............

Но есть и другие моменты для улучшения.
Вот мое предложение:

import datetime
from time import strptime

def get_hotel_sum_quantity(product_id, checkin_date, checkout_date, quantity):        
    check_in = datetime.date(*strptime(checkin_date, '%Y-%m-%d')[0:3])
    check_out = datetime.date(*strptime(checkout_date, '%Y-%m-%d')[0:3])

    prod = Product.objects.get(id=product_id)
    prod_Available = 0
    array = []

    all_date = check_in
    one_day = datetime.timedelta(days=1)
    for i in xrange(check_in.day,check_out.day + 1):

        sumOfQuantity = HotelCheck.objects.filter(date_booked=all_date, product=prod).aggregate(Sum('quantity'))['quantity__sum']
        if sumOfQuantity == None:
            sumOfQuantity = 0
        prod_Available = prod.quantity - sumOfQuantity
        prod_Available = float(prod_Available) - float(quantity)

        if prod_Available > 0:
            array.append({'available': prod_Available, 'status': 1, 'sumquantity': sumOfQuantity, 'quanity': quantity})
            all_date += one_day           
        else:
            return array

Если вы хотите, чтобы элемент {'available': -1.0, 'status': 0, 'sumquantity': 8, 'quanity': 3} был включен и отображен в возврате, вы должны:

if prod_Available > 0:
    array.append({'available': prod_Available, 'status': 1, 'sumquantity': sumOfQuantity, 'quanity': quantity})
    all_date += one_day           
else:
    array.append({'available': prod_Available, 'status': 0, 'sumquantity': sumOfQuantity, 'quanity': quantity})
    return array

И я думаю, что если бы мы знали код HotelCheck.objects и Sum («количество»)), мы могли бы также улучшить часть, используя их
(пожалуйста, кто-нибудь говорит на правильном английском: исправьте это предложение, с глаголом что-то не так, но я не могу найти правильный путь)

.

Редактировать 1

У моего кода были некоторые недостатки, я его улучшил:

def get_hotel_sum_quantity(self,product_id, checkin_date, checkout_date, quantity,
                           daylta = datetime.timedelta(days=1)):

    all_date = datetime.date(*strptime(checkin_date, '%Y-%m-%d')[0:3])
    check_out_day = strptime(checkout_date, '%Y-%m-%d')[2]

    prod = Product.objects.get(id=product_id)
    prod_quant = prod.quantity

    array = []

    for i in xrange(all_date.day,check_out_day + 1):

        sumOfQuantity = HotelCheck.objects\
                        .filter(date_booked=all_date,product=prod)\
                        .aggregate(Sum('quantity'))['quantity__sum']

        if sumOfQuantity == None:  sumOfQuantity = 0
        prod_Available = float(prod_quant - sumOfQuantity) - float(quantity)

        if prod_Available > 0:
            array.append({'available': prod_Available, 'status': 1,
                          'sumquantity': sumOfQuantity, 'quantity': quantity})
            all_date += daylta
        else:
            break

    return array
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...