精华内容
下载资源
问答
  • 如何看某一网页的迭代
    千次阅读
    2019-06-11 21:38:20

    你好,【程序职场】专注于:Spring Boot ,微服务 和 前端APP开发,闲暇之余一起聊聊职场规划,个人成长,还能带你一起探索 副业赚钱渠道,在提升技术的同时我们一起交流 敏捷流程 提高工作效率,从技术到管理一步步提升自我!
     
    标签:一个执着的职场程序员!

     

    如何做好一个产品?

    怎么让产品快速迭代?

    怎么让客户尽快体验产品?

    这些问题一直困扰着创业公司?创业公司人员,资源有限,为了更好的抓住时机,需要快速的做好一个产品,给客户使用,得到客户的反馈和用户量。

    产品流程大致:前期调研,需求整理,需求确认,开发,测试,上线,但是如果按照该流程,产品出来也许会错过大好时机,快速开发一个产品,对于我们来说很重要。

    mvp可以很好的解决这个问题。

    什么是MVP

    MVP的概念是Eric Ries 《精益创业》里提出的概念。简单地说,就是指开发团队通过提供最小化可行产品获取用户反馈,并在这个最小化可行产品上持续快速迭代,直到产品到达一个相对稳定的阶段。MVP对于创业团队来说是很重要的,可以快速验证团队的目标,快速试错。

    其实概念大家都知道,但是可能真正实行起来才会发现好像一知半解。我自己也是在创业团队后才真正接触并实践MVP原则的。在我理解里MVP有四个要素:

    1、要抓住核心流程,MVP是一个过程

    MVP要求我们抓住最核心的产品流程,剥掉多余的功能或者高级功能,只要主流程可以跑起来可以。完美并不是我们的目标,快速试错才是目标。

    MVP并不是回答产品设计是否优雅,技术是否高效这样具体的功能问题,而是用来验证产品是否被用户接受,是否有人愿意为产品买单

    那什么是最核心的产品流程?这要结合我们产品的核心目标来看。譬如一款电商产品核心目标就是让用户在产品上下单买东西。那核心流程就可能是:进入产品——挑选商品——下单付款——查询物流信息。那就围绕这个流程,剥离多余的高级功能(分享啊,评论啊,个性化推荐啊,积分啊这些都不要做)做一款MVP产品。

    MVP不是一个产品,而是一个过程。不同阶段的MVP特点有所不同,关注的目标,甚至用户都可以不同。所以MVP不能只是一个短暂的产品,三分钟热度可不行。

    2、MVP不是单一的产品形态

    有的同学会问,那MVP用怎样的产品形态比较好呢?我认为,MVP的产品不是单一的形态。可以是一个只有基本功能的APP,也可以是一个微信公众号,一个微信群,甚至是一款纸面原型,一个视频。只要他可以让你的用户直观地感知到,可以让他们实际使用起来,能激发他们真实的使用体验就OK。

    Dropbox最初的时候并没有马上急于开发,创始人Drew Houston只是发布了一段视频,虚构了产品功能。结果视频播放的次数很快来到播放首位,有75000多人愿意等待产品问世,几十万人访问了视频中的登录页面。得到这样的数据,Dropbox才迈向了开发。

    在实际工作中我有一个方法可以和大家分享。以往我们做原型,通常是axure先行,然后讨论修改原型,接下来UI出设计图,设计图讨论修改确定才付诸开发。这个流程不仅慢,而且Axure在移动段展示不足体验不好,用户其实没什么感知,不要说用户了,在一些偷懒的同事眼里都没什么感知。在MVP原则里,我就直接在纸上画出纸面原型,然后添加到墨刀原型里,设置好点击事件,通过微信分享给用户,用户不需要安装即可在微信上体验整个流程,我们也可以收集到很多意见。纸面原型收集一轮意见后,再让UI出效果图(不用高保真,只要大致美观)。效果图依旧添加到墨刀里,收集第二轮第三轮用户意见。这样的方法大大提高了工作效率。

    3、带着明确的目标去做MVP

    MVP是一个简洁的产品,但目的是什么?有人一定会说,不就是快速试错吗?这有什么好说的啊?BUT,试错也要有有的放矢吧。

    我理解,不同阶段的MVP目标不同。MVP1.0应该是验证需求,设想的需求是真实存在还是伪需求?设想的需求是高频还是低频?是刚需还是非刚需?在收集了一轮意见之后,MVP2.0则可以关注核心流程的路径是否顺畅,用户体验等问题。跟随MVP不断迭代的过程,我们不断调整关注的目标——但是请注意一定要始终聚焦在核心流程之上。

    4、尽量多用轮子

    尽量多用轮子,就是尽可能借用现成成熟的产品,避免自己去研发。这一点对于小团队最为关键。举个我自己的例子,做一个电商产品的时候,全部开发只有5个人。做过电商的同学都知道,核心流程上的支付、订单管理,退货等流程是一套复杂的流程,我们团队不仅人少,而且都没开发电商产品的经验,还有2个刚毕业的同学。人力和实力上其实都是一般,不足以独立去做自己的整个电商流程。怎么办?我们就在某电商平台开一个店,商品上架,所有的交易流程,订单管理都用这个电商平台的页面内嵌在APP里。快速实现产品上线,上线了才有流水。

    这样的方法有问题吗?当然有,一些促销手段用起来不那么顺手,毕竟不是自己的嘛,平台也不可能给你定制。但是在最初的MVP阶段,这些都可以忍受和克服,毕竟我们最重要的目的是快速验证我们的电商产品是否有用户买单呀。

    MVP必备模块

    MVP产品除了核心流程以外,还有几个必备模块,这里做一下简单的介绍:

    1、便捷的反馈渠道

    尽可能为用户在MVP产品内提供便捷的反馈机制,而不仅仅是微信群和QQ群。为什么,用户发现问题了,最希望第一时间把自己的疑问或者不满反应出来,微信群和QQ群毕竟有滞后性;其次,微信群和QQ群接触的用户可能数量不足,在群里活跃的可能就老是那几个人,一个个去私聊嘛,效率可能低。所以,我们在微信QQ以外还是结合一套内部反馈机制比较好。

    2、数据埋点不可少

    MVP的目的就是要验证。因此相应的数据埋点也不可少(纸面原型和墨刀原型不能埋点)。但是简单开发的还是可以埋点的。但是传统的数据埋点方法耗时比较久,这里我推荐growing io,只需要把一段SDK代码埋入网页和应用中,产品经理和运营人员就可以快速自己埋点( 也有类似产品,比如诸葛IO,神策,但是我没用过,不好评价)

    3、前期用户调研不可少

    做MVP虽然从某种意义上可以理解为用户调研的一种延伸,但是不能因为有了MVP,就忽视了正式的用户调研。毕竟MVP也是要依赖于前期用户调研。

    综上所述,初创公司和个人开发者更适合mvp开发过程。

    更多相关内容
  • 篇:网页设计教程(7):提高网页制作效率:很有必要的唠叨。有秩序,有规律,有特殊。叫层次!层次的迭代,表达出空间的存在感。点,线,面。点动成线,线动成面,面动成体,多个体的复杂构成。即为空间。当然,...
  • 敏捷开发-快速迭代

    千次阅读 2018-05-28 20:54:45
    今天跟大家分享的是“敏捷开发、快速迭代”。我们大都采用的是“瀑布开发模式”,有了问题,就得返工,虽然最终的产品会比较齐全完善,但是开发周期太长,开发人员会产生排斥,甚至厌恶的心理。经过YH系统的开发,也...

    今天跟大家分享的是“敏捷开发、快速迭代”。我们大都采用的是“瀑布开发模式”,有了问题,就得返工,虽然最终的产品会比较齐全完善,但是开发周期太长,开发人员会产生排斥,甚至厌恶的心理。经过YH系统的开发,也且生体会到了这一弊端。

    有问题就要去解决它!于是我想到了“敏捷开发”。借鉴敏捷开发模式,来改善软件开发过程,提高项目的开发效率。

    要想借鉴,首先得弄懂以下3个问题。

    1. 什么是敏捷开发
      百度百科中是这样解释的:敏捷开发是一种以人为核心、迭代、循序渐进的开发方法。在敏捷开发中,软件项目的构建被切分成多个子项目,各个子项目的成果都经过测试,具备集成和可运行的特征。换言之,就是把一个大项目分为多个相互联系,但也可独立运行的小项目,并分别完成,在此过程中软件一直处于可使用状态。

    我们可以这样认为,敏捷开发是一种面临迅速变化的需求快速开发的能力。要明确几点:
    敏捷不仅仅是一个项目快速完成、而是对整个产品领域需求的高效管理;
    敏捷不仅仅是简单的快,而是短周期的不断改进、提高和调整;
    敏捷不仅仅是一个版本只做几个功能,而是突出重点、果断放弃当前的非重点;
    敏捷不仅仅是随时增加需求,而是每个迭代周期对需求的重新审核和排序。

    2.如何进行敏捷开发?
    敏捷开发的体系建设主要有如下六个方面:
    1、组织建设
    也就是团队建设,建立以产品经理为主导,包含产品、设计、前后台开发和测试的team,快速进行产品迭代开发;扁平化的团队管理,大家都有共同目标,更有成就感;

    2、敏捷制度
    要找准适合自身的敏捷开发方式,主要是制定一个完善的效率高的设计、开发、测试、上线流程,制定固定的迭代周期,让用户更有期待;

    3、需求收集
    这个任何方式下都需要有,需求一定要有交互稿,评审通过后,一定要确定功能需求列表、责任人、工作量、责任人等;

    4、工具建设
    是指能够快速完成某项事情的辅助工具,比如开发环境的一键安装,各种底层的日志、监控等平台,发布、打包工具等;

    5、系统架构
    略为超前架构设计:支持良好的扩容性和可维护性;组件化基础功能模块:代码耦合度低,模块间的依赖性小;插件化业务模块:降低营销活动与业务耦合度,自升级、自维护;客户端预埋逻辑;技术预研等等;

    6、数据运营与灰度发布
    点击率分析、用户路径分析、渠道选择、渠道升级控制等等。

    有幸拾得某位牛人的敏捷开发经验,再结合自己的理解,一起拿出来与大家分享一下:
    1 、 重点明确,及时调整。
    通过分析需求的紧急性和重要性,做出优先级的判定,优先级从1排到10,没有重复;
    迭代中严格按照优先级顺序开发,即使最后时间不够,也能保证最需要的功能开发完成;
    每次迭代前重新调整需求的重要性,及时加入重要的业务需求和用户需求,将重要性不高的需求往后调整。

    2、倾听用户的声音、相信用户的直觉。
    在迭代中充分关注线上版本用户的反馈,并且主动联系用户了解困扰,在当个迭代或下个迭代快速优化;通过对用户反馈的及时响应获得用户的认可和口碑。
    这里就提到一个名叫“AB test”的开发模式,一个问题有A、B两种解决方案,不知道哪个更符合用户的需求,那么就让用户去选择,根据用户的反馈去迅速调整。
    有兴趣的话,可以看看这个视频,是我在找资料时看到的,里面讲到了这个问题,即小米MIUI产品经理许斐演讲的“快速迭代的互联网开发模式 ”。

    3、勇于创新、小步快跑。
    在迭代中勇于创新,快速实现创新想法,并在后续的迭代中不断优化。
    一直远离媒体视线的腾讯CEO马化腾,在“合作伙伴大会一周年”的活动上,也给合作伙伴和同行们“小步快跑,快速迭代”的建议,被赋予“一直在模仿,从未被超越”称号的腾讯开发团队,其实创新也是国内最多的。

    4、持续不断地发现问题,解决问题。
    通过每天的版本发布来检验团队在每日立会上做出的承诺;
    测试和验证功能的开发程度;
    对于功能的实现第一时间给出反馈,并能快速调整,而不会像瀑布式等到开发末期才发现实现上的问题。

    5、持续提升整个团队的产品能力。
    专门的团队面向一个产品领域;
    持续优化用户体验和产品流程;
    通过产品迭代的心跳保持产品团队的用户和市场敏感度;
    提升产品经理的产品感觉、提高技术团队的产品意识;
    团队伴随业务而成长,获得更高的成就感。

    更多具体的实施和经验分享,可以参考“项目管理专栏”。

    说了这么多,归结起来就是,产品通过不断的获取用户新需求,不断的更新迭代而愈加成熟。而快速迭代,则能提升团队的市场竞争力,从而快速占领市场。
    看过一幅图片:快速迭代,越变越美。那么如何快速迭代呢?

    这里写图片描述
    3.如何快速迭代
    其实这个问题已经在第二个问题中回答过了,这里再单拿出来说,是为了强调一下。
    现在是互联网的时代,互联网产品的更新速度可谓是日新月异。互联网的开发模式也是主要围绕“快速迭代”的主题来开发产品的 在飞速发展的互联网行业里,产品是以用户为导向在随时演进的。因此,在推出一个产品之后要迅速收集用户需求进行产品的迭代——在演进的过程中注入用户需求的基因,完成快速的升级换代,裂变成长,才能让你的用户体验保持在最高水平。不要闭门造车以图一步到位,否则你的研发速度永远也赶不上需求的变化。

    可能我们做的不是互联网的项目,但是如果是大项目,依旧推荐使用敏捷开发。分级需求,快速迭代产品。让用户能在短时间内用户用上你的产品,短时间内使用到新功能。

    采用“短周期迭代法”,可以压缩项目开发实施周期,减少项目风险,简化管理,提高各个环节达成率,有效推进项目建设。

    快速迭代,版本更新快,所以要考虑降低项目风险,确保正确的方向。

    敏捷开发能够缩短项目的反馈周期,因其将项目分成了若干个迭代周期,每个迭代周期结束都能立即反馈。且通过不断的沟通,还能减少理解上的偏差,配合反馈,减少误解,从而降低修正错误的代价。且每个迭代周期的结束都能接受验证,从而能快速的适应变化,及时的适应新的需求,保证产品的正确性。

    这里写图片描述
    那么迭代周期设定为多少合适呢,“小步快跑、快速迭代”,当然系统大小也会影响到迭代周期,所以把迭代周期一般设置为1-6周为佳。

    曾经跟QQ安全管家的一个开发人员聊过天,得知QQ安全管家是一星期一个beta版本,一月一个正式版。小米的MIUI更新周期,每天都有更新给荣誉开发组,每周都更新ROM包,提供给用户下载。百度每天都会有上百次更新升级上线,网页搜索的结果页每一天都有几十个等待测试上线的升级项目。可见快速迭代是多么许多公司都推荐的一种开发模式。

    还有一点要注意,快速迭代,不是说一定要做好了,才能上线,半成品也能上线。

    在没有上线之前,你怎么知道哪好那不好。所以半成品也是可以出门的,一定不要吝惜在家,丑媳妇才需要尽早见公婆。尽早的让用户去评判你的想法,你的设计是否可以赢得用户的喜爱。快速发出,紧盯用户反馈。百度完成了第一版的搜索引擎,也是让用户去做的选择。用百度CEO李彦宏(Robin)的话来说“你怎么知道如何把这个产品设计成最好的呢?只有让用户尽快去用它。既然大家对这版产品有信心,在基本的产品功能上我们有竞争优势,就应该抓住时机尽快将产品推向市场,真正完善它的人将是用户。他们会告诉你喜欢哪里不喜欢哪里,知道了他们的想法,我们就迅速改,改了一百次之后,肯定就是一个非常好的产品了。”

    简单地分享了一下对敏捷开发,快速迭代的理解。这里再给大家一个连接,51CTO的《专题:初探敏捷开发》,供大家参阅。

    展开全文
  • python读取txt文件并取其某一列数据的示例菜鸟笔记首先读取的txt文件如下:AAAAF110 0003E818 0003E1FC 0003E770 0003FFFC 90AAAAF110 0003E824 0003E208 0003E76C 0003FFFC A5AAAAF110 0003E814 0003E204 0003E760 ...

    python读取txt文件并取其某一列数据的示例

    菜鸟笔记

    首先读取的txt文件如下:

    AAAAF110 0003E818 0003E1FC 0003E770 0003FFFC 90

    AAAAF110 0003E824 0003E208 0003E76C 0003FFFC A5

    AAAAF110 0003E814 0003E204 0003E760 0003FFFC 85

    AAAAF110 0003E7F0 0003E208 0003E764 0003FFFC 68

    AAAAF110 0003E7CC 0003E1FC 0003E758 0003FFFC 2B

    现在要读取其每行的第3个数据,将其组成一个数组,代码如下:

    import codecs

    f = codecs.open('data.txt', mode='r', encoding='utf-8') # 打开txt文件,以‘utf-8'编码读取

    line = f.readline() # 以行的形式进行读取文件

    list1 = []

    while line:

    a = line.split()

    b = a[2:3] # 这是选取需要读取的位数

    list1.append(b) # 将其添加在列表之中

    line = f.readline()

    f.close()

    for i in list1:

    print(i)

    输出结果为:

    ['0003E1FC']

    ['0003E208']

    ['0003E204']

    ['0003E208']

    ['0003E1FC']

    以上这篇python读取txt文件并取其某一列数据的示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

    时间: 2019-02-18

    利用numpy库 (缺点:有缺失值就无法读取) 读: import numpy my_matrix = numpy.loadtxt(open("1.csv","rb"),delimiter=",",skiprows=0) 写: numpy.savetxt('2.csv', my_matrix, delimiter = ',') 可能遇到的问题: SyntaxError: (unicode error) 'unicodeescape' codec

    使用机器学习训练数据时,如果数据量较大可能我们不能够一次性将数据加载进内存,这时我们需要将数据进行预处理,分批次加载进内存. 下面是代码作用是将数据从数据库读取出来分批次写入txt文本文件,方便我们做数据的预处理和训练机器学习模型. #%% import pymssql as MySQLdb #这里是python3 如果你是python2.x的话,import MySQLdb #数据库连接属性 hst = '188.10.34.18' usr = 'sa' passwd = 'p@ssw0rd'

    在HeadFirstPython网站中下载所有文件,解压后以chapter 3中的"sketch.txt"为例: 新建IDLE会话,首先导入os模块,并将工作目录却换到包含文件"sketch.txt"的文件夹,如C:\\Python33\\HeadFirstPython\\chapter3 复制代码 代码如下: >>> import os>>> os.getcwd()    #查看当前工作目录'C:\\Python33'>&

    第一:pandas.read_csv读取本地csv文件为数据框形式 data=pd.read_csv('G:\data_operation\python_book\chapter5\\sales.csv') 第二:如果存在日期格式数据,利用pandas.to_datatime()改变类型 data.iloc[:,1]=pd.to_datetime(data.iloc[:,1]) 注意:=号,这样在原始的数据框中,改变了列的类型 第三:查看列类型 print(data.dtypes) 第四:方法一

    本文实例讲述了python读取json文件并将数据插入到mongodb的方法.分享给大家供大家参考.具体实现方法如下: #coding=utf-8 import sunburnt import urllib from pymongo import Connection from bson.objectid import ObjectId import logging from datetime import datetime import json from time import mktime

    1.处理包含数据的文件 最近利用Python读取txt文件时遇到了一个小问题,就是在计算两个np.narray()类型的数组时,出现了以下错误: TypeError: ufunc 'subtract' did not contain a loop with signature matching types dtype('

    如何用python循环读取下面.txt文件中,用红括号标出来的数据呢? 首先,观察数据可知,不同行的第一个数据元素不一样,所以考虑直接用正则表达式. 再加上,对读和写文件的操作,就行了 注:我用的是pycharm+python2.7 话不多说,直接上代码 import re f1=file('shen.txt','r') data1=f1.readlines() # print data1 f1.close() results = [] for line in data1: data2=line

    blank.gif

    读取整个文件: 首先创建一个文件,例如我创建了一个t x t文件了. 然后我想读取这个文件了,我首先将上面的这个文件保存在我即将要创建的Python的文件目录下, 即读取文件成功. 解析: 函数open()接受一个参数:即要打开的文件的名称.python在当前执行的文件所在的目录中查找指定文件. 关键字with在不再需要访问文件后将其关闭 要让python打开不与程序文件位于同一目录中的文件,需要提供文件的路径,它让python到系统指定的位置去查找. 以上就是本文的全部内容,希望对大家的学习有

    背景: 文件内容每一行是由N个单一数字组成的,每个数字之间由制表符区分,比如: 0 4 3 1 2 2 1 0 3 1 2 0 -- 现在需要将每一行数据存为一个list,然后所有行组成一个大的list 工具: 1.strip():用于移除字符串头尾指定的字符,默认为空格,返回是字符串 2.split():通过指定分隔符对字符串进行切片,返回是字符串组成的list 实例: #!/usr/bin/python #coding=utf-8 def readfile(filename): with o

    这篇文章主要介绍了使用Python脚本从文件读取数据代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 最近自学Python的进度比较慢,工作之余断断续续的看着效率比较低,看来还是要狠下心来每天进步一点点. 还记得前段时间陈大猫提了一口"先实现用python读取本地文件",碰巧今天看到文件与异常,结合练习整理下用Python读取本地文件的代码: import os #从标准库导入os模块 os.chdir('F:\HeadFirs

    本文以实例形式讲述了Python实现抓取网页并解析的功能.主要解析问答与百度的首页.分享给大家供大家参考之用. 主要功能代码如下: #!/usr/bin/python #coding=utf-8 import sys import re import urllib2 from urllib import urlencode from urllib import quote import time maxline = 2000 wenda = re.compile("href=\"htt

    在学习xg的 时候,想画学习曲线,但无奈没有没有这个 evals_result_ AttributeError: 'Booster' object has no attribute 'evals_result_' 因为不是用的分类器或者回归器,而且是使用的train而不是fit进行训练的,看过源码fit才有evals_result_这个,导致训练后没有这个,但是又想获取学习曲线,因此肯定还需要获取训练数据. 运行的结果 上面有数据,于是就想自己解析屏幕的数据试一下,屏幕可以看到有我们迭代过程的数

    开始之前请先确保自己安装了Node.js环境,如果没有安装,大家可以到我们下载安装. 1.在项目文件夹安装两个必须的依赖包 npm install superagent --save-dev superagent 是一个轻量的,渐进式的ajax api,可读性好,学习曲线低,内部依赖nodejs原生的请求api,适用于nodejs环境下 npm install cheerio --save-dev cheerio是nodejs的抓取页面模块,为服务器特别定制的,快速.灵活.实施的jQuery核心

    L3Byb3h5L2h0dHAvZmlsZXMuamI1MS5uZXQvZmlsZV9pbWFnZXMvYXJ0aWNsZS8yMDE5MDkvMjAxOTk0OTQ1MDU4OTEucG5nJiMwNjM7MjAxOTg0OTQ2MzU=.jpg

    前言 上项目的时候,遇见一次需求,需要把在线的 其中一个 collection 里面的数据迁移到另外一个collection下,于是就百度了看到好多文章,其中大部分都是使用导入的方法,没有找到在线数据的迁移方法.于是写了python脚本,分享出来. 思路: collection数据量比较大,所以一次性操作所有数据太大,于是分段执行操作. 先分段 按1000条数据量进行查询,处理成json数据 把处理后的json数据 发送到目的collection上即可 实现: 一.使用http的接口先进行查询

    L3Byb3h5L2h0dHAvZmlsZXMuamI1MS5uZXQvZmlsZV9pbWFnZXMvYXJ0aWNsZS8yMDE4MTIvMjAxODEyMjkxNzEyNTcyNzUuanBnJiMwNjM7MjAxODExMjkxNzEzMTQ=.jpg

    python读取.txt(.log)文件 ..xml 文件 .excel文件数据,并将数据类型转换为需要的类型,添加到list中详解 1.读取文本文件数据(.txt结尾的文件)或日志文件(.log结尾的文件) 以下是文件中的内容,文件名为data.txt(与data.log内容相同),且处理方式相同,调用时改个名称就可以了: 以下是python实现代码: # -*- coding:gb2312 -*- import json def read_txt_high(filename): with o

    1.网络爬虫的基本概念 网络爬虫(又称网络蜘蛛,机器人),就是模拟客户端发送网络请求,接收请求响应,一种按照一定的规则,自动地抓取互联网信息的程序. 只要浏览器能够做的事情,原则上,爬虫都能够做到. 2.网络爬虫的功能 网络爬虫可以代替手工做很多事情,比如可以用于做搜索引擎,也可以爬取网站上面的图片,比如有些朋友将某些网站上的图片全部爬取下来,集中进行浏览,同时,网络爬虫也可以用于金融投资领域,比如可以自动爬取一些金融信息,并进行投资分析等. 有时,我们比较喜欢的新闻网站可能有几个,每次都要分别

    本文实例讲述了Python爬虫爬取.解析数据操作.分享给大家供大家参考,具体如下: 爬虫 当当网 http://search.dangdang.com/?key=python&act=input&page_index=1 获取书籍相关信息 面向对象思想 利用不同解析方式和存储方式 引用相关库 import requests import re import csv import pymysql from bs4 import BeautifulSoup from lxml import e

    展开全文
  • 迭代器模式

    2018-06-10 12:03:40
    很多人认为今天看迭代器模式使用价值远不如学习价值了,Martin Flower 甚至在在自己的网页上提出撤销此模式。当然这种说法也不无道理,因为现在像高级语言如C# 、java 等已经把这个模式做在语言中了。但是这个模式就...

    很多人认为今天看迭代器模式使用价值远不如学习价值了,Martin Flower 甚至在在自己的网页上提出撤销此模式。当然这种说法也不无道理,因为现在像高级语言如C# 、java 等已经把这个模式做在语言中了。但是这个模式就真的如网上所言没有实用价值了吗?我并不认为是这样的。

        本文将介绍这种模式与其它模式搭配使用 适配器-迭代器模式。至于有没有用评判在你惊讶 希望于你有益~

    模式背景

        有两家餐厅A和B,餐厅A是一家早餐餐厅店,而餐厅B是一家午餐餐厅店。

        现在两个餐厅的大Boss决定将两家餐厅进行合并。在餐厅A中,菜单的逻辑实现是基于ArrayList的,而餐厅B的菜单逻辑实现则是基于数组的。如果去修改任何一家餐厅的菜单实现,都可能会引发一些不必要的修改,且这种修改可能还会导致不必要的Bug,所以A和B都不愿意去修改菜单的原始实现。

        现在的需求是,在不改变两家餐厅对菜单的实现上,再方便地对菜单进行遍历。

                                                                          -- 摘自《Head Frist设计模式》


    模式定义

    何谓迭代器模式?所谓迭代器模式就是提供一种方法顺序访问一个聚合对象中的各个元素,而不是暴露其内部的表示。在实际的开发过程中,我们可能需要针对不同的需求,可能需要以不同的方式来遍历整个整合对象,但是我们不希望在聚合对象的抽象接口层中充斥着各种不同的便利操作这个时候我们就需要这样一种东西,它应该具备如下三个功能:

          1、能够便利一个聚合对象。

          2、我们不需要了解聚合对象的内部结构。

          3、能够提供多种不同的遍历方式。

          这三个功能就是迭代器模式需要解决的问题。作为一个功能强大的模式,迭代器模式把在元素之间游走的责任交给迭代器,而不是聚合对象这样做就简化了聚合的接口和实现,也可以让聚合更专注在它所应该专注的事情上,这样做就更加符合单一责任原则


    科普

        聚合对象:

    聚合(Cohesion)是一个模块内部各成分之间相关联程度的度量。

    这里有多个含义值得考虑。首先,聚合是对一个模块内部的度量,这也是许多情况下我们把聚合称之为内聚的原因。第二,这里出现的模块是广义的模块,它可能是子系统,可能是功能模块,也可能是功能模块中的某一个类。从不同的层次看,聚合的程度也会有所不同。至于为什么不同,后面会有解释。第三,模块的成分包括模块的行为和状态。要做到高聚合,那么模块内部的行为必须要与模块的内部状态紧密关联。通俗来讲,一个模块仅完成一个独立的功能,模块内部不存在与该功能无关的操作或状态。

    举一个生活中的例子。

    有两座城市Sidtown和Fredborough,连接两座城市的公路一天到晚总是拥堵不堪。经过"有关部门"调查之后发现,这两座城市中有两家公司Better Mousetrap和 Zokko Soda,Better Mousetrap的工厂建造在Sidtown,而该工厂的员工都居住在Fredborough,所以每天早上大批员工从Fredborough出发前往Sidtown,并在傍晚返回;类似的,Zokko Soda公司的运输车在每天的工作时间都需要在制瓶工厂和灌装工厂穿梭来往。


    很明显,如果Better Mousetrap的工厂和员工居住地都在同一城市,而Zokko Soda的两座工厂都建造在另一座城市,那么城市之间的交通状况将会明显改善。


    对比两图,上面两座城市间之所以出现交通的问题,是因为每座城市的"聚合性"都比较低:不相关的两个公司出现在了同一座城市,使得城市内部交通的利用率比较低,而城市之间的交通出现了超负荷。

    模式结构


    模式实现

    公共接口

    package com.nchu.iterator;
    
    import java.util.Iterator;
    
    public interface Menu {  
        public Iterator<MenuItem> createIterator();  
    }  

    迭代器的创建

    在上面的类图中我们可以找到BreakfastMenu和LunchMenu两个菜单类,它们都是实现了Menu接口的。可是,因为它们包含了不同的容器对象(BreakfastMenu包含了ArrayList,LunchMenu包含了数组),所以在创建迭代器的时候就会有所不同。

    BreakfastMenu创建迭代器

        

    package com.nchu.iterator;
    
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    
    public class BreakfastMenu implements Menu {
    
    	private List<MenuItem> menuItems = new ArrayList<>();
    	
    	public void addMenuItem(MenuItem menuItem){
    		menuItems.add(menuItem);
    	}
    	
    	public void remove(MenuItem menuItem){
    		menuItems.remove(menuItem);
    	}
    	
    	public Iterator<MenuItem> createIterator() {  
            return menuItems.iterator();  
        }  
    }
    

    因为ArrayList自身就包含了迭代器的实现,所以这里就可以直接返回ArrayList的迭代器。

    LuchMenu创建迭代器

    package com.nchu.iterator;
    
    import java.util.Iterator;
    
    public class LuchMenu implements Menu {
    
    	private MenuItem[] menuItems = new MenuItem[30];
    	private int position = 0;
    	
    	public void addMenuItem(MenuItem menuItem){
    		menuItems[position++] = menuItem;
    	}
    	
    	public void remove(MenuItem menuItem){
    		int i = 0;
    		while(menuItems[i] != menuItem) ++i;
    	}
    	
    	public Iterator<MenuItem> createIterator() {  
                    return  new LunchIterator(menuItems, position);  
        }  
    }
    

    数组没有迭代器的实现部分,所以与上面的创建方式会有所不同,此时正是迭代器模式大显身手的时候。

    自定义迭代器

    由于数组本身不具备迭代的功能,所以我们就需要对其进行扩展。可是,如果想要“迭代”数组,其根本实现还是要依赖于数组的循环遍历。因为数组只有这一种方式可以依次提取元素。在迭代器中有两个核心方法:hasNext()和next()。所以,我们就利用这两个方法变相实现对数组的迭代。

    package com.nchu.iterator;
    
    import java.util.Iterator;
    
    
    
    public class LunchIterator implements Iterator<MenuItem>{
    
    	private MenuItem[] menuItems = null;  
        private int position = 0;
        private int index;
        
    	public LunchIterator(MenuItem[] menuItems, int index) {
    		this.menuItems = menuItems;
    		this.index = index;
    	}
    
    	@Override
    	public boolean hasNext() {
    		if(menuItems == null)
    			return false;
    		return position < this.index;
    	}
    
    	@Override
    	public MenuItem next() {
    		MenuItem munuItem = menuItems[position++];
    		return munuItem;
    	}
    
    	@Override
    	public void remove() {
    	}
    }
    


    迭代器组合

    这里说的迭代组合是针对迭代器之外,客户端的实现逻辑。假定我们有一个女服务员,她可以打印出客户所需要的菜单,而不用关心此菜单的实现方式。

    package com.nchu.iterator;
    
    import java.util.Iterator;
    
    public class Waitress {  
      
        private Iterator<MenuItem> iterator = null;  
        private Menu menu = null;  
          
        public Waitress(Menu menu) {  
            this.menu = menu;  
        }  
          
        public void printMenu() {  
            System.out.println("\n菜单:");  
            iterator = menu.createIterator();  
            while(iterator.hasNext()) {  
                System.out.println(iterator.next());  
            }  
        }  
    } 


    菜品类

    package com.nchu.iterator;
    
    public class MenuItem {
    
    	private String foodName;
    	
    	public MenuItem(String foodName) {
    		this.foodName = foodName;
    	}
    
    	@Override
    	public String toString() {
    		return this.foodName;
    	}
    	
    	
    }
    

    测试类

    package com.nchu.iterator;
    
    public class Client {
    
    	public static void main(String[] args) {
    		BreakfastMenu bm = new BreakfastMenu();
    		bm.addMenuItem(new MenuItem("a"));
    		bm.addMenuItem(new MenuItem("b"));
    		bm.addMenuItem(new MenuItem("c"));
    		
    		LuchMenu lm = new LuchMenu();
    		lm.addMenuItem(new MenuItem("d"));
    		lm.addMenuItem(new MenuItem("e"));
    		lm.addMenuItem(new MenuItem("f"));
    		
    //		Waitress wa = new Waitress(bm);
    		Waitress wa = new Waitress(lm);
    		
    		wa.printMenu();
    	}
    }
    

    使用场景

         1、访问一个聚合对象的内容而无须暴露它的内部表示。

          2、需要为聚合对象提供多种遍历方式。

          3、为遍历不同的聚合结构提供一个统一的接口


    模式优缺点

        优点
             1、它支持以不同的方式遍历一个聚合对象。

           2、迭代器简化了聚合类。

           3、在同一个聚合上可以有多个遍历。

           4、在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。

            

        缺点

            由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。


    模式总结

            迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明的访问集合内部数据。

        
    展开全文
  • Q1: ... 然后运行Controller,设置用户数为100?...但是我需要说明的是测并发数的时候,本身就是模拟的虚拟用户,所以我认为不一定非要参数化100个用户,用个用户跑100遍也是可以的。当然你这样进行设...
  • 牛顿迭代

    千次阅读 2018-07-31 15:45:22
    牛顿迭代法 进入词条全站搜索帮助 声明:百科词条人人可编辑,词条创建和修改均免费,绝不存在官方及代理商付费代编,请勿上当受骗。详情&amp;gt;&amp;gt; 首页 历史上的今天 百科冷知识 图解百科 ...
  • 访问网页的全过程(超详细版)

    万次阅读 多人点赞 2020-03-17 14:15:39
    Nginx根据我们设定的分配算法和规则,选择台后端的真实Web服务器,与之建立TCP连接、并转发我们浏览器发出去的网页请求。 寻找IP地址过程: 请求一旦发起,浏览器首先要做的事情就是解析这个域名,一般来说,...
  • 文章目录前言、背景二、名词解释三、设计目标3.1 实现功能3.2 性能指标Ⅰ.数据精确度Ⅱ.时间特性Ⅲ.适应性四、系统环境4.1 相关软件和硬件4.2 数据规模预估五、系统设计5.1 基础介绍5.2 系统架构图5.3 系统流程图...
  • 行输入经过map处理后,得到如下结果: B 0.0833 C 0.0833 D 0.0833 同理,第二三四行经过map处理后,得到: A 0.125 D 0.125 C 0.25 B 0.125 C 0.125 系统会自动对map的输出进行shuflle处理,即对key进行...
  • 从5月25号我们开始了为期两个月的实习,我们需要做个大型大数据项目,个项目由三个学生+个企业的项目经理完成。请大家持续关注我的专栏,我会每天更新。 专栏:大数据案例实战——大三春招大数据开发 专栏:...
  • 案列: 软件要求,从网络抓取各个城市气温信息,并依次显示: ...我们期望以'用时访问'的策略,并且能把所有城市气温封装到个对象里,可用for语句进行进行迭代,如何解决? import requests from collec...
  • Thymeleaf篇就够了

    万次阅读 多人点赞 2020-07-24 14:35:48
    目录什么是Thymleaf模板引擎介绍Thymleaf介绍第个thymleaf程序thymleaf语法详解 什么是Thymleaf 大家好,我是bigsai,今天我们来学习Thymleaf,对于Thymleaf你可能比较陌生,但它很容易学习与理解,并有着自己鲜明...
  • python中获取网页元素

    千次阅读 2021-09-06 14:39:29
    python中获取网页元素 、方法概括 xml/html文本: 正则表达式re、xpath json文件:jsonpath模块、正则表达式re 二、通用方法 使用所有方法获取页面元素都是需要先请求获取数据(爬虫),对返回数据进行分析,...
  • 8.21: Hackday、慈善x快速迭代

    千次阅读 2015-08-24 22:33:44
    8.21: Hackday、慈善x快速迭代 过去总想着写点小日志什么的来记录一下日常的生活,难得有了点想法 + 实力终于可以做这件事了。当然,这不会是流水账,每天都会有个主题,直到20天以后。 于是,第天以Hackday...
  • 教你撸网页聊天室

    千次阅读 2020-01-19 16:19:17
    最近在学校比较闲,终于有这么块时间可以自由支配了,所以内心还是十分的酸爽舒畅的。当然了,罪恶的事情也是有的,比如已经连续周没有吃早饭了,其实现在回头想想,真的不能怪我啊,因为最近的天气实在是太!冷...
  • 网页脚本

    千次阅读 2022-03-27 19:25:07
    网页脚本,原理,流程
  • 这一年,这些书:2021年读书笔记

    千次阅读 2021-12-31 22:32:21
    真正驾驭项技能的人,早已不会被技能束缚。他们能直达本质,把专业变得通俗易懂。 武学中有句话叫:“心狠手不准。”意思是:心越狠的人,出手越不准。因为他总是恨不得下子就把对方置于死地,所以每招都是...
  • 迷茫,仿佛就是团乌云,笼罩在每个心中怀有抱负的人的头上。每当夜深人静,思绪归于对自己人生未来的严肃思考,不知去往何处的苦闷,再加之不断迫近的升学/就业选择的压力,尤其是一些看似周密的计划,由于想把...
  • 编者按:近日国际电信组织3GPP在美国举行全体会议,批准并冻结了5G独立组网功能标准,加上去年12月完成的非独立组网标准,5G第阶段的标准化工作全部完成。5G商用就要开始冲刺并有望明年实现商用试点。5G离我们更近...
  • 欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给...
  • 今天就给大家分享篇爬虫基础知识和入门教程: 什么是爬虫? 爬虫就是自动获取网页内容的程序,例如搜索引擎,Google,Baidu 等,每天都运行着庞大的爬虫系统,从全世界的网站中爬虫数据,供用户检索时使用。 ...
  • import webbrowser import xlrd wb = xlrd.open_workbook("demo.xlsx") sht = wb.sheet_by_name(... # 用系统默认浏览器打开指定网页 ```![在这里插入图片描述](https://img-blog.csdnimg.cn/20200807104345256.jp
  • leader:你的代码太烂了我根本不懂

    千次阅读 多人点赞 2021-03-05 00:09:02
    、可读性的重要性 编程有很大部分时间是在阅读代码,不仅要阅读自己的代码,而且要阅读别人的代码。因此,可读性良好的代码能够大大提高编程效率。 可读性良好的代码往往会让代码架构更好,因为程序员更愿意去...
  • C语言之单链表反转(递归,迭代),排序 前言 这篇会是关于单链表最后篇的介绍,之前还介绍过的文章分别是: 单链表及各项操作介绍 单链表初始化 单链表打印(遍历),查询,定位,插入,删除...从上面的图片可以
  • 原因是它的网页结构相当规整,比较适合爬虫新手练习。下面我将详细展示爬虫的整个过程。 爬虫过程 网页链接分析 爬虫起点网页为豆瓣电影 Top 250,整个250部电影一共分10页,每页对应的链接如下: ...
  • web链接分析算法

    千次阅读 2017-03-27 11:06:04
     HITS从机制上很容易被作弊者操纵,比如作弊者可以建立网页,页面内容增加很多指向高质量网页或者著名网站的网址,这就是个很好的Hub页面,之后作弊者再将这个网页链接指向作弊网页,于是可以提升作弊网页的...
  • <br /> 简单的说,敏捷开发是种以人为核心、迭代、循序渐进的开发方法。在敏捷开发中,软件项目的构建被切分成多个子项目,各个子项目的成果都经过测试,具备集成和可运行的特征。换言之,就是把个大项目...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 27,402
精华内容 10,960
关键字:

如何看某一网页的迭代