为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

守候你守候我 2021-10-10 14:45:14
我正在尝试编写一个脚本,在其中检查特定页面的名称。在我继续总结问题之前。该页面可以轻弹 - 这意味着一旦您进入该页面,它就会列出您的姓名。你做的下一个刷新页面,它会返回空的名字列表,下一个它会再次列出你的名字。(这是我正在尝试做的进一步想法)但是我创建了一个自己的小脚本,我们作为用户可以更轻松地对其进行测试。我创建了一个 txt 文件,而不是请求,以便更轻松地运行程序我正在尝试做的是以下内容:我想制作脚本,以便它在每个循环中打开 txt,它检查列表中是否有名称,然后我们只打印一次。如果没有名字 - 那么我想做一个计数器来检查名字是否真的是空的,这意味着在这种情况下我想创建一种确认这一点的计数器,并声明没有名字列表。这意味着在 txt 文件打开 5 次之后,并且在行打开的 5 次之后列表中没有任何名称。然后我们可以将它声明为它实际上是空的。如果计数器确认它是空的,那么我们循环直到找到名称并再次打印它,然后我们像以前一样重新开始。我尝试过的是,我认为在编码时会出现一些小问题,我可能会混淆自己或使自己过于复杂,而不是实际应该这样做。count = 0last_names = []names_checker = Falsewhile 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 回答

?
MMTTMM

TA贡献1869条经验 获得超4个赞

你的分析是对的:你把问题想得太多了。

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


                +--------------------------+

  +-----------> |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 do_stuff(names):

    ...

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


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

while True:

    data = parse_data(get_data())

    if data:

        counter = 0

        do_stuff(data)

        print("I got the data and did {stuff}. Now I'll wait and repeat with new names")

        time.sleep(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")

            time.sleep(WAIT_TIME)

如果新数据很快出现并且您决定不需要那么多日志记录,您也可以直接counter取出。


查看完整回答
反对 回复 2021-10-10
  • 1 回答
  • 0 关注
  • 224 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号