python迭代器的意义在哪

python这迭代器的意义是什么啊 这两行for语句有什么区别吗

img

iter 是一个类型转换,他可以将原本某些不可迭代的东西转成可迭代对象

a = '1234'
print(type(a))
print(type(iter(a)))
for i in iter(a):
    print(i)
<class 'str'>
<class 'str_iterator'>
1
2
3
4

img

iter 的意义主要在于第二种用法,你可以自己定义迭代的结束位置,而不必定长

可以看到两次指令,一样,但迭代的次数完全不同

import random
def rnd():
    return random.randint(0,10)

for i in iter(rnd,0):
    print(i)
7
3

import random
def rnd():
    return random.randint(0,10)

for i in iter(rnd,0):
    print(i)
5
3
2
4
7
9
10
2
9
9
10
8
1
7
1

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/361578
  • 你也可以参考下这篇文章:Python 打印异常信息的两种实现方式和区别
  • 同时,你还可以查看手册:python- 迭代器 中的内容
  • 除此之外, 这篇博客: python爬虫 多线程 爬取网站排行榜上的所有小说中的 完整代码 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • import os
    import requests
    import re
    import time
    import random
    import threading
    
    #创建目录
    if not os.path.exists('Txt'):
        os.mkdir('Txt')
    
    #获取网页html
    def get_htmlcode(url):
        try:
            urlhtml = requests.get(url)
            htmlcode = urlhtml.content
        # path = open('Txt/html.txt','wb')
        # path.write(htmlcode)
        # path.close()
        except:
            htmlcode = 'error'
        return htmlcode
    
    #获取所有免费top榜的txt地址,去重,再完善地址路径
    def get_topfree_list(htmlcode):
        reg = '</a></td><td><a class="red" href="(.+?)" title='
        reg_msg = re.compile(reg)
        list_all = reg_msg.findall(htmlcode.decode())
        #去重
        list_temp = list(set(list_all))
        list_top = []
        #完善地址,加上https前缀,并将book替换成list
        for i in list_temp:
            i = 'https:'+ i
            i = i.replace('book','list')
            list_top.append(i)
        return list_top
    
    #获取小说名称
    def get_novel_name(htmlcode):
        reg = '<h1 class="Title">(.+?)</h1>'
        reg_msg = re.compile(reg)
        novel_name = reg_msg.findall(htmlcode.decode())
        return novel_name
    
    #获取章节地址列表(无https:前缀)
    def get_chapter_list(htmlcode):
        htmldecode = htmlcode.decode()
        reg = r'href="/chapter/(.+?).html'
        reg_msg = re.compile(reg)
        chapter_list = reg_msg.findall(htmldecode)
        return chapter_list
    
    #获取章节名称
    def get_subject(htmlcode):
        reg = '<h1>(.+?)</h1>'
        reg_msg = re.compile(reg)
        subject = reg_msg.findall(htmlcode.decode())
        return subject
    
    #获取正文,需要先切割再正则
    def get_novel(htmlcode):
        htmldecode = htmlcode.decode()
        a = htmldecode.index('<div class="p">')
        b = htmldecode.index('<p class="copy ">')
        htmldecode_final = htmldecode[a:b]
        reg = '<p>(.+?)</p>'
        reg_msg = re.compile(reg)
        novel = reg_msg.findall(htmldecode_final)
        return novel
    
    #判断是否被锁定
    def insert_lock(htmlcode):
        str1 =htmlcode.decode()
        str2 ='<h1>该章节已被锁定</h1>'
        temp = str1.find(str2)
        return temp
    
    #从小说章节列表地址到爬取完成
    def get_novel_all(chapter_url):
        # 章节列表网站的html
        Htmlcode_chapter_list = get_htmlcode(chapter_url)
        if Htmlcode_chapter_list == 'error':
            print('~~~~~~~~~~~~~17K小说地址出错了:%s,请稍后再试~~~~~~~~~~~~~'%chapter_url)
        else:
            # 获取小说名称
            Novel_name = get_novel_name(Htmlcode_chapter_list)
            Novel_name_str = str(Novel_name)
            # 从源码中匹配出所有章节的地址
            Chapter_list = get_chapter_list(Htmlcode_chapter_list)
            # 创建TXT文件并打开
            path = open('17k/' + Novel_name_str + '.txt', 'a',encoding='utf-8')
            # 写入小说名称
            path.write('~~~~~~%s~~~~~~' % Novel_name_str)
            path.write('\n\n\n')
            flag = 0
            # 循环处理每个章节地址
            for l in Chapter_list:
                # 逐一处理章节地址,加上前缀
                url_chapter = 'https://www.17k.com/chapter/'+l+'.html'
                flag += 1
                print(url_chapter)
                # 获取具体章节的html
                Htmlcode = get_htmlcode(url_chapter)
                # 从章节的html中得到章节名
                Subject = get_subject(Htmlcode)
                Temp = insert_lock(Htmlcode)
                if Temp == -1:
                    # 从html中得到小说
                    Novel = get_novel(Htmlcode)
                    # 输入到最终TXT中
                    path.write(str(Subject))
                    path.write('\n')
                    for j in Novel:
                        path.write('   ')
                        path.write(j)
                        path.write('\n')
                    path.write('\n\n')
                    # 加一个提示信息
                    print('章节%s %s打印结束' % (Novel_name_str, Subject))
                    # 短暂随机休息,防止被网站后台封禁
                    time.sleep(round(random.uniform(0.2, 0.5), 2))
                else:
                    print('章节%s爬取失败'%Subject)
                    path.write('\n')
                    path.write(str(Subject))
                    path.write('\n')
            path.close()
            print('小说%s爬取完成' % Novel_name_str)
    
    url_list = 'https://www.17k.com/top/refactor/top100/06_vipclick/06_click_freeBook_top_100_pc.html'
    
    if __name__ =='__main__':
        Htmlcode_Freetop = get_htmlcode(url_list)
        #获取免费榜单所有小说的url
        Topfree_List = get_topfree_list(Htmlcode_Freetop)
        #循环启动多进程,设置间隔时间
        for i in Topfree_List:
            threading.Thread(target=get_novel_all, args=(i,)).start()
            time.sleep(0.5)
        print('免费榜单上的所有txt已爬取完成')
    

    总共407部小说,脚本跑大概15分钟后,爬完了405部,总共有300M。有两部因为章节数太多,一个是快5千章,另一个是接近上万章,所以提前结束了进程,没跑完。最后剩下的那部小说是正则表达式没有找到章节名,线程报错而停止了,可能是又有一个类似锁定的其他结构吧。(只不过我也懒得再去纠结了,哈哈哈~)至少从整体正确性和效率性上来看,爬虫工具的任务完成得还算及格。
    在这里插入图片描述
    在这里插入图片描述

  • 您还可以看一下 黄棒清老师的Python实战量化交易理财系统课程中的 双均线策略股票量化交易模拟实战小节, 巩固相关知识点