关于for...to/downto循环

几篇长文过后,打算来几个短篇了。短篇打算用随笔的形式发布,内容相对比较简单,只涉及一两个语法点。

for循环是几乎所有过程式编程语言都会有的语句,但在不同类型的语言中,它的语义又有差别。就是说明在Delphi语言中,for循环的语法是:

  for counter := initialValue to/downto finalValue do
    statment

首先,for循环必须有一个并且只能有一个计数器(Counter)变量,计数器变量有以下几个特点:

  1. 该计数器变量必须是序数类型(Ordinal Type),也就是:整数、枚举、字符、布尔类型这几大类。因而,初值与终值也只能与计数器类型相同,为序数类型。
  2. 编译器建议计数器使用局部变量,否则会给出警告;不能使用对象成员变量或类成员变量,否则编译器会提示出错。这么做的目的,也与下一条有不小的关系。
  3. 循环体中无法直接更改计数器变量的值。

for循环的计数器如此设计,与该语句的另外一个特点也有很大的关系:

在循环开始前,会首先确定initialValue与finalValue的值,也就是说,finalValue是一个值,而不是一个表达式。这就意味着:只要不在循环体中改变counter的值,并且循环体中不会break的话,循环的次数就是确定的。因而,Delphi(或者说是Pascal)里的for语句是一个典型的、确定次数的循环。在C类语言中,条件项是一个表达式,每次循环都会计算表达式的值——这意味着,如果表达式中包含一个函数,并且编译器没有进行非常激进的优化,那么每次都会调用该函数。在C类语言中,这种激进的优化是很危险的,因为就算编译器能够判断循环体中的代码会不会改变该函数的运行结果(实事上也很难判断),在多线程流行的今天,编译器也无法判断会不会有其它线程会改变函数结果。而在Pascal中,确定的for循环在语法上就规定了:如果想要每次通过一个函数确定终止条件,那就请用while/repeat吧,for做不到。
正因如此,用一个全局变量是危险的,因为虽然不能在循环体中直接改变counter的值,但却可以通过调用其它函数改变全局变量的值。同样,对于局部变量的counter,我们也还是有办法改变它的值的,方法类似,也是比较麻烦的。间接改变counter的值也是有效果的,但是强烈不建议做这种事,会使代码的可读性变差。如果有需要的话,还是老老实实的用while/repeat吧。

最后,delphi中的for没有类似basic中的step,也就是每次循环counter都顺序的增加或减少1。想要类似basic中步长的话,那就请用counter自己乘吧。

补充一点儿扩展知识:如果计算器变量是全局变量的话,特点1(序数类型)是有办法突破的(比如使用PAnsiChar类型)。也不知道算是Delphi的特性还是bug,反正在Free Pascal中是不行的。因此,我还是建议老老实实的按语法走,搞这种歪路子不利于优良代码风格的形成。

转载于:https://www.cnblogs.com/egust/archive/2010/08/02/1789667.html

根据您提供的代码片段,可以对其进行一些优化。首先,可以将文件写入操作放在循环之外,减少频繁的文件写入操作。另外,可以使用更简洁的方法来处理XPath选择器的结果。以下是优化后的代码: ```python import csv import time from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.keys import Keys from lxml import etree # 创建一个Chrome浏览器实例 s = Service('path/to/chromedriver') # 将路径替换为你的chromedriver路径 chrome_options = Options() chrome_options.add_argument('--headless') # 设置为无界面模式 browser = webdriver.Chrome(service=s, options=chrome_options) # 打开登录页面,登录 for p in range(1, 1190): try: time.sleep(1) html = etree.HTML(browser.page_source) content_html = html.xpath('//div[@class="table-responsive"]/table/tbody[@class="data-table"]/tr') result = [] for html_ in content_html: No_id = html_.xpath('.//td[2]/text()')[0] url2_list = html_.xpath('.//td[3]/div/text()')[0].replace('www.', '').rstrip('/') category_list = '、'.join(html_.xpath('.//td[4]/div/div/div[1]/span/text()')) performer_list = '$' + html_.xpath('.//td[10]/text()')[0] last = [p, No_id, '', 'globexportal.net', url2_list, '', '', category_list, '', '平台', performer_list] result.append(last) print(last) with open('globexportal.net.1.csv', 'a+', newline='', encoding='utf_8_sig') as fp: writer = csv.writer(fp) writer.writerows(result) # 模拟滚动 actions = ActionChains(browser) actions.move_by_offset(960, 720).perform() actions.send_keys(Keys.PAGE_DOWN).perform() actions.reset_actions() except Exception as e: print(str(e)) # 关闭浏览器 browser.quit() ``` 在优化后的代码中,使用XPath选择器时,直接使用索引来获取结果列表中的第一个元素,避免了使用变量并进行多余的操作。另外,将需要写入CSV文件的数据存储在一个列表中,然后一次性写入文件,减少了频繁的文件写入操作。 请确保已经正确导入所需的模块,并根据您的实际情况进行适当的调整和修改。另外,需要注意根据您的实际需求进行Chrome浏览器实例的配置,如使用无界面模式等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值