Python-如果有值,则遍历布尔值

时间:2019-01-13 10:23:32

标签: python if-statement count boolean

我正在尝试编写脚本,在其中检查名称的特定页面。在我继续总结问题之前。该页面轻弹-意味着一旦您转到该页面即可列出您的名字。您执行的下一个刷新页面将返回空名称列表,而下一个刷新页面将再次列出您的名称。 (这是我要尝试做的进一步的想法),但是我创建了一个自己的脚本,作为用户,我们可以更轻松地对其进行测试。

我没有创建请求,而是创建了一个txt文件来更轻松地运行程序

我要尝试的操作如下:

我想制作一个脚本,以便它在每个循环中打开txt,它会检查列表中是否有名称,然后只打印一次。如果没有名称,那么我想创建一个计数器来检查名称是否真正为空,这意味着在这种情况下,我想创建一种计数器来确认该名称,并声明该名称中没有名称。清单。这意味着在txt文件打开5次之后,该行的开头5个之后的列表中没有任何名称。那么我们可以将其声明为实际上是空的。

如果计数器已确认其为空,那么我们将循环运行直到找到名称并再次打印它,然后再从前重新开始。

我尝试过的是,我认为编码时会出现一些小问题,可能会使我感到困惑或使自己过于复杂。

count = 0
last_names = []
names_checker = False

while True:

    with open('./test.txt') as f:
        new_product_values = json.load(f)

    # {'name': 'Random names', 'url': 'www.stackoverflow.com', 'names': []}

    if names_checker == False:

        if not new_product_values['sizes']:
            count += 1
            time.sleep(1)

        if count == 5:
            names_checker = True
            count = 0
            logger.success('Declare value as No names')

        else:
            names_checker = True

    elif names_checker == True:

        while True:


            if new_product_values['names'] != last_names:

                print("NEW NAMES!")
                print(new_product_values['names'])
                last_names = new_product_values['names']
                logger.status(last_names)
                names_checker = False
                break

            else:
                logger.warn("Nothing found - sleep 1")
                time.sleep(1)

text file:

{'name': 'Random names', 'url': 'www.stackoverflow.com', 'names': []}

在这种情况下,我的预期结果是:

如果列表中没有名称,则在计数器中添加一个名称,如果下一个循环仍继续为我们提供空名称,则在计数器中添加另一个名称,直到它到达计数器5,然后又到达计数器5。我希望它声明为空列表。每当它为空时,我们都想循环直到找到名称。找到名称后,我们要声明列表不为空,然后打印一次名称,然后从计数器重新开始。

1 个答案:

答案 0 :(得分:0)

您的分析正确:您对问题的思考过多。

首先,将您正在做的事情分成简单的步骤

                +--------------------------+
  +-----------> |Get the data from the page| <-----------------+
  |             +-------------+------------+                   |
  |                           |                                |
  |                           v                                |
  |                                                            |
  |          +-------------------------------------------+     |
  |          |Get the data into a nice format (e.g. list)|     |
  |          +------------------+------------------------+     +------+
  |                             |                              |      |
  |                             |                     +--------+      |
  |                          +--+                     |               |
  |                          |                        |         +-------------+
  |                          v                        |         |wait for data|
  |                                                   |         +-------------+
  |         +--------------------------+              |
  |         |Do we actually have data? |              |                 ^
  |         +------+-----+-------------+              |flick            |no data
  |                |     |                            |                 |
+-+------+         |     |        +-------------------+-----------------+-----+
|do stuff|    <----+     +---->   |Is this a flick or is there really no data?|
+--------+     yes         no     +-------------------------------------------+

您会看到轻弹,最终没有数据返回以获取数据。

如果将上述步骤放入python代码中,则会得到以下内容:

def get_data():  # just an example
    r = requests.get(...)
    r.raise_for_status()
    return r

def parse_data(text, _old=[]):  # list is mutable => preserved across calls
    """convert the text to a list of names. If there are no (new) names, the list is empty"""
    ...
    if new_data not in _old:
        _old.append(new_data)
        return new_data
    else:
        return []

def delay_get_data(by):
    time.sleep(by)
    return get_data()

def do_stuff(names):
    ...

这样拆分不仅可以使您的代码得到更好的阅读和理解,而且还为您提供了一种更改各个部分的方法:如果您想使用本地文件/数据进行测试,则只需重写{{1 }},而无需进行其他任何更改:

get_data

按照上面的结构图,您现在可以先获取数据,检查数据并执行正确的操作,然后再通过在 one 循环中查看def get_data(): if random.randint(0, 1): # simulate flicks return empty_sample_data else: return random.choice(sample_data_with_names) 来获取新数据:

counter

如果新数据很快进入并且您确定不需要那么多日志记录,则也可以只取出WAIT_TIME = 10*60 counter = 0 data = parse_data(get_data()) while True: if data: counter = 0 do_stuff(data) print("I got the data and did {stuff}. Now I'll wait and repeat with new names") data = parse_data(delay_get_data(WAIT_TIME)) else: counter += 1 if counter >= 5: # cosmic rays may increase ``counter`` by 2 instead of 1 counter = 0 print("I think there actually isn't any data. I'll wait and then check again") data = parse_data(delay_get_data(WAIT_TIME)) else: data = parse_data(get_data()) # no delay, it was probably just a flick