杰言杰语

以中有足乐者,不知口体之奉不若人也.


  • 首页

  • 分类

  • 关于

  • 归档

  • 标签

  • 搜索

day1_课前思考

发表于 2017-06-06 | 分类于 14天改变计划 | 阅读次数

#​ 案例企业1:懒财网
懒财网是一家互联网活期理财平台,现在它想让用户认为 “理财投资,就上懒财网”.
懒财网与其它理财产品的区别在于:

  • 懒财网提供活期7.5%的收益率,用户资金面临的风险较低;大多数活期理财,收益率维持在3%左右,风险较低;懒财网的高收益是因为其拥有平台智能算法,可将用户的钱分散地投入到不同的优质投资资产上,从而实现降低风险,保证收益
  • 在获取7.5%的收益率的同时,用户可以将资金随存随取,提现时没有最高的提现金额限制,每笔提现会被收取固定3元手续费;收益同在7.5%的其他的理财产品,多为固定期限投资,无法实现随存随取,提现时若还在期限以内,会被收取较多的手续费用

请简要分析,对懒财网来说,它应该针对哪些消费者,主打什么需求?从而让他们选择懒财网,而不是其他理财产品?并尝试为它撰写一句话文案.

针对的消费者是:上班族,主动:没风险理财.不想在理财方面浪费太多时间与精力;一句话文案:尽情享受生活,把理财交给我们!

案例企业2:优集品

优集品是一家出售更有设计感和质感家居用品的电商平台,比如在上面,用户能挑选到没有添加剂的洗发水,更有设计感的茶杯,高颜值的烧水壶.但它发现,很多消费者在产生家居用品的购物需求时,往往会选择买些普通货(比如他们可能会买些沃尔玛、家乐福就能买到的品牌),而不会上优集品.

请简要分析,对优集品来说,它应该针对哪些消费者,主打什么需求?从而让他们选择到优集品上买东西,而不是像过去一样买些普通货?并尝试为它撰写一句话文案.

主要针对消费者是:选择症困难户;主打需求:挑选好货;一句话文案:我们只挑选好货.

案例企业3:有物手工电商美食平台

有物是一家手工电商美食平台,在上面,消费者可以购买到的都是手工制作的美食,比如“xx小姐手工制作的凤梨酥和柚子茶”,而不是在其他地方所买到的机器批量化生产的普通食品.现在,这一美食平台想要吸引更多用户使用自己的产品购买美食.

请简要分析,对有物来说,它应该针对哪些消费者,主打什么需求?从而让他们选择到这里购买食品?并尝试为它撰写一句话文案.

针对消费者:吃货人群;主打需求:手工美食产品;一句话文案:用手改变生活!

案例企业4:南海科日公司所开发的超声波香薰机

南海科日公司卡发出了这样一款产品-超声波香薰机,它体积小、使用便捷,安全环保,当加入精油打开时,能够发出柔和的香味帮助用户改善身心健康,比如帮助睡眠.而过去,用户往往会选择通过吃药、针灸、运动等方式改善身心健康(比如吃安眠药助眠).

请简要分析,对超声波香薰机来说,它应该针对哪些消费者,主打什么需求?从而让他们选择购买香薰机.

针对消费者:养生人群;主打需求:睡前方式减压一句哈文案:改善身心健康,不仅仅是吃药能解决的;

案例企业5:手持激光美容仪

某公司开发出了这样一款手持激光美容仪,用户在产生祛痘、嫩肤需求时,可以自己手持产品,针对面部进行美容护理.但这家公司发现,很多他们的目标用户(中产阶级白领)在产生美容需求时,往往会选择去美容院或者医院接受专业服务,而不是自己解决.

请简要分析,对手持美容仪来说,应该针对哪些消费者,主打什么需求?从而让他们选择购买?

针对消费者:爱美人士;主打需求:美容,方便;一句话文案:我的皮肤我做主!

线上目标

线上化州特产”我是线上化州特产创始人,我们的产品都是严格挑选的好货,但是不确认纯线上这块如何精准策划,用户的接受度有多高;因为我们的定位是远在他乡的人群能享受到化州特色的美味;所以通过自学本课程来获取灵感.

营销人员只能发现事实,你不能说虚假需求.
你跟美好生活只差58到家?这不是事实.人不能发明成功,但是成功可以复制.

  • 低价需求:让你5万元购买一台奔驰车;
  • 过程体验:美图秀秀,非专业人士也能美图;
  • 可达性;
  • 替你做:自己做不了交给别人做;(如维生素,每天的不同维生素,我都愿意做成复合维生素);
  • 新颖:你洗了头发,洗过头皮吗?都尝试,不要被思维所限制;
  • 文案:激发和唤起用户疼点营销:跟用户疼点联系->(心理阶梯;用户视角;)
  • 战略:发现需求(机会)找需求模板,需求自检清单;珍爱生命,远离后见之明;放弃碎片化知识;要解决例题;系统化的方法(框架+清单);组合接受(主动+被动学习);

以训练过程为重点;一直都是接受,从没改变;

推荐书籍:好战略坏战略(基本的战略思维);定位;让创意更有黏性;奢侈品:划分档次;高档品:犒劳自己;时尚品:社会模仿;

Lesson 63 She was not amused 她并不觉得可笑

发表于 2017-05-05 | 分类于 English | 阅读次数

单词讲解

circle n.圈子
draw a circlea
a large circle of friends

  • admire v.赞美
    admire sb. for sth.
    We admire him for his knowledge

  • close /s/ adj.亲密的,近的
    Our home is close to the school.
    get close to…
    closest friends
    /z/ v.关闭

  • sort n.种类
    this sort of thing
    sort of…

语法讲解

  • Everybody admires him for his great sense of humour…

  • …everybody, that is, except his six-year-old daughter,jenny.

  • Recently, one of Jeremy’s closest friends asked him to make a speech…
    one of : 表示什么范围之一,所以后面加可数名字.

  • This is the sort of thing that Jeremy loves.(定语从句)
    挨着谁,就是什么从句.(在名词后面)
    n. + that 从句
    定语从句或同位语从句
    We hava no idea that the boss has come.(同位语从句)
    It is the most interesting move that I have ever seen.(定语从句)

  • He had included a large number of funny stories in the speech…
    include v.包括,包含
    contain v.
    container n.容器
    a number of…
    a large / great number of…

  • As soon as he had finished, Jenny told him she wanted to go home.
    Jenny told him (that) she wanted to go home.
    vt. + 人 + 从句
    双宾语结构

  • Jereny was a little disappointed … but he did as his daughter asked.
    as + 句子 “按照…方式”
    引导方式状语从句
    When in Rome, do as Romans do.(按照罗马的方式去做事情)
    Do it as I told you last week.

  • … he asked Jenny if she had enjoyed the speech.
    if (是否)
    vt. + 人 + 从句
    双宾语结构
    宾语从句

  • Jeremy asked her why this was so and she told him that she did not like to see so many people laughing at him!
    Jeremy asked her why this was so and
    she told him that she did not like to see…!

Lesson 62 After the fire 火灾后

发表于 2017-05-05 | 分类于 English | 阅读次数

单词讲解

  • control n.控制
    Paul took control of the business after his father retired.(接管)
    Everything is under control.(在掌控之后)
    The situation is out of control.(失控)

  • smoke n.烟
    have a smoke
    There’s no smoke without fire. 无火不起烟.
    Where there’s smoke there’s fire. 无风不起浪;事出有因.

  • desolate adj.荒凉的
    a desolate island

  • threaten v.威胁
    threat(n.) + en
    The boss threatened to fire the waiter.
    The robber threatened the man with a gun.

  • surrounding adj.周围的
    the surrounding countries
    in the surrounding area

  • destruction n.破坏,毁坏
    the destruction of the forest
    The forest fire caused widespread destruction

  • flood n.洪水,水灾

  • authority n. 当局
    the French authorities
    Mr. Johnson is an authority on econmics.(学术权威专家)

  • grass- seed n.草籽

  • spray v.喷洒
    John sprayed paint on / over the wall.

  • quanitity n.数量
    quality n.质量
    Sam drank a large quantity of beer.(大量的)
    Nick has read quantities of books. (大量的)

  • root n.根

  • century n.世纪
    A century is a period of a hundred years.
    At the turn of the country, great changes took place in this country.(在世纪之交)

  • patch n.小片
    There is a patch on his pants. (补丁)
    a patch of land

语法讲解

  • Firemen had been fighting the forest fire…
    had been doing : 过去完成进行时
    强调动作在过去更早的某段时间内一直进行
    常连用的表示时间的词 : for,since,before…

I had been waiting for Tom for an hour by the time he came.
Sam had been looking for his car key for days befor he found it.

  • … before they could get it under control.
    get … under control 使…得到控制
    The police has got the situation under control.

  • … great trees had covered the countryside…
    around 在周围,四周
    There is no house for miles around.

  • Winter was coming on…
    come on 开始,来临
    There is a storm coming on.
    The show is coming on.

  • … the hills threatened the surrounding…
    threaten … with … 以(某种方式或手段)威胁
    The man tied her up and threatened her with a knife.
    The father threatened the boy with a beating.

wash away 冲走,冲掉
The floods washed away the bridge.

  • When the fire had at last been put out…
    put out 熄灭
    put out the light
    put out the candle

ton n.吨
a ton of coal 一顿煤
tons of oil 数吨石油

  • … over the ground in huge quantities…
    quantity 数量
    a large quantity of 大量的
    a small quantity of 少量的
    a large / small quantity of water
    quantities 大量
    The mother bought toys in large quantities for her boy.
    The mother bought quantities of toys for her boy.

  • … the grass had already taken root.
    take toot 生根
    The little tree has taken root.
    The idea has taken root in his mind.(想法扎根)

  • In place of the great trees…
    in place of 替代,取代
    Tim was sick. I had to take the business trip in place of him.

in the place of 在…的地方
When you think over the question, you may put yourself in the place of the boss.

知识扩展

过去完成进行时
had been doing
表示开始于过去某个时刻(A)之前的动作(B)持续到过去这一时刻(A),并继续持续下去.

与过去完成进行时常连用的时间状语
for + 时间段
since + 时间点
all morning
all day
before
…
When I got home, my brother had been repairing his bicycle for several hours.
当我回家的时候,我的兄弟还在那修自行车修了几个小时了.

When I got to the office, Frank had been waiting for me for an hour.

Lesson 61 Trouble with the Hubble 哈勃望远镜的困境

发表于 2017-04-05 | 分类于 English | 阅读次数

单词讲解

  • space n.空间
    outer space
    There is no space in my room.

  • distant adj.遥远的

  • distance n.距离
    different adj.
    difference n.
    important adj.
    importance n.
    significant adj.
    significance n.
    convenient adj.
    convenience n.

  • billion n.十亿

语法讲解

  • The Hubble telescope was launched into space by NASA… at a cost of over a billion dollars.

  • Right form the start there was trouble with…
    There be + n. + 介词短语
    There is a girl in the classroom.
    There are problems in front of us.

  • The pictures it sent us were very disappointing because its main mirror was faulty.
    分析句子 :
    标准化的步骤
    标点符号,关键词,分析主谓
    The pictures it sent(谓) us were(谓) disappointing…!
    名词 + 从句 是定语从句
    他发给我的图片令人失望.

  • NASA is… going to put the telescope right, so it will … be sending up four astronauts to repair it.

  • A robot-arm … will grab the telescope
    and hold it .
    while the astronauts make the necessary repairs.

  • By the time you read this, the Hubble’s eagle eye will have sent us… pictures.
    by + 时间 表示”截止到…时间”,与完成时连用.
    by the time + 句子 引导时间状语从句
    by the time you read this 时间状语从句,一般现在时表示将来
    by the time 一般现在时到将来用将来完成时

知识扩展

  • 将来完成时 考点 :
    by + 将来完成时
    by the time + 句子(一般现在时)

看 ‘北大最短毕业致辞’ 的感受

发表于 2017-04-05 | 分类于 Thinking Model | 阅读次数

做自己尊重的人

在祝福裹着告诫呼啸而来的毕业季,请原谅我不敢祝愿每一位毕业生都成功、都幸福;因为历史不幸地记载着:有人的成功代价是丧失良知;有人的幸福代价是损害他人。

  • 从物理学来说,无机的原子逆热力学第二定律出现生物是奇迹;

  • 从生物学来说,按进化规律产生遗传信息指导组装人类是奇迹。

  • 超越化学反应结果的每一位毕业生都是值得珍惜的奇迹;

  • 超越动物欲望总和的每一位毕业生都应做自己尊重的人。

  • 过去、现在、将来,能够完全知道个人行为和思想的只有自己;

  • 世界很多文化借助宗教信仰来指导人们生活的信念和世俗行为;

  • 而对无神论者——也就是大多数中国人——来说,自我尊重是重要的正道。

在你们加入社会后看到各种离奇现象,知道自己更多弱点和缺陷,可能还遇到小难大灾后,如何在诱惑和艰难中保持人性的尊严、赢得自己的尊重并非易事,却很值得。

这不是:

自恋、自大、自负、自夸、自欺、自闭、自缚、自怜;

而是:

自信、自豪、自量、自知、自省、自赎、自勉、自强。

自尊支撑自由的精神、自主的工作、自在的生活。

我祝愿:

退休之日,你觉得职业中的自己值得尊重;

迟暮之年,你感到生活中的自己值得尊重。

不要问我如何做到,50年后返校时告诉母校你如何做到:在你所含全部原子再度按热力学第二定律回归自然之前,它们既经历过物性的神奇,也产生过人性的可爱。

演讲视频

HTTP请求模型和头信息参考

发表于 2017-03-28 | 分类于 NetworkPenetration | 阅读次数

HTTP请求模型

一、连接至Web服务器

一个客户端应用(如Web浏览器)打开到Web服务器的HTTP端口的一个套接字(缺省为80).

例如:
http://www.myweb.com:8080/index.html
在Java中,这将等同于代码 :

1
2
InputStreamin=socket.getInputStream();
OutputStreamout=socket.getOutputStream();

二、发送HTTP请求

通过连接,客户端写一个ASCII文本请求行,后跟0或多个HTTP头标,一个空行和实现请求的任意数据.

一个请求由四个部分组成 : 请求行、请求头标、空行和请求数据.

  • 请求行 : 请求行由三个标记组成:请求方法、请求URI和HTTP版本,它们用空格分隔.

例如 : GET/index.htmlHTTP/1.1

  • HTTP规范定义了8种可能的请求方法 :
    • GET检索URI中标识资源的一个简单请求
    • HEAD与GET方法相同,服务器只返回状态行和头标,并不返回请求文档
    • POST服务器接受被写入客户端输出流中的数据的请求
    • PUT服务器保存请求数据作为指定URI新内容的请求
    • DELETE服务器删除URI中命名的资源的请求
    • OPTIONS关于服务器支持的请求方法信息的请求
    • TRACEWeb服务器反馈Http请求和其头标的请求
    • CONNECT已文档化但当前未实现的一个方法,预留做隧道处理
  • 请求头标 : 由关键字/值对组成,每行一对,关键字和值用冒号(:)分隔.
    请求头标通知服务器有关于客户端的功能和标识,典型的请求头标有 :
    • User-Agent客户端厂家和版本
    • Accept客户端可识别的内容类型列表
    • Content-Length附加到请求的数据字节数
  • 空行 : 最后一个请求头标之后是一个空行,发送回车符和退行,通知服务器以下不再有头标.
  • 请求数据 : 使用POST传送数据,最常使用的是Content-Type和Content-Length头标.

三、服务端接受请求并返回HTTP响应

Web服务器解析请求,定位指定资源.服务器将资源副本写至套接字,在此处由客户端读取.

  • 一个响应由四个部分组成;状态行、响应头标、空行、响应数据.

    • 状态行 : 状态行由三个标记组成:HTTP版本、响应代码和响应描述.
    • HTTP版本 : 向客户端指明其可理解的最高版本.
    • 响应代码 : 3位的数字代码,指出请求的成功或失败,如果失败则指出原因.
    • 响应描述 : 为响应代码的可读性解释.
    • 例如 : HTTP/1.1200OK
  • HTTP响应码 :
    1xx:信息,请求收到,继续处理
    2xx:成功,行为被成功地接受、理解和采纳
    3xx:重定向,为了完成请求,必须进一步执行的动作
    4xx:客户端错误 :

  • 响应头标 : 像请求头标一样,它们指出服务器的功能,标识出响应数据的细节.

  • 空行 : 最后一个响应头标之后是一个空行,发送回车符和退行,表明服务器以下不再有头标.
  • 响应数据 : HTML文档和图像等,也就是HTML本身.

四、服务器关闭连接,浏览器解析响应

  • 浏览器首先解析状态行,查看表明请求是否成功的状态代码.
  • 然后解析每一个响应头标,头标告知以下为若干字节的HTML.
  • 读取响应数据HTML,根据HTML的语法和语义对其进行格式化,并在浏览器窗口中显示它.
  • 一个HTML文档可能包含其它需要被载入的资源引用,浏览器识别这些引用,对其它的资源再进行额外的请求,此过程循环多次.

五、无状态连接

HTTP模型是无状态的,表明在处理一个请求时,Web服务器并不记住来自同一客户端的请求.

##实例

  • 浏览器发出请求
    GET/index.htmlHTTP/1.1

  • 服务器返回响应
    HTTP/1.1200OK Date:Apr11200615:32:08GMT Server:Apache/2.0.46(win32) Content-Length:119 Content-Type:text/html<HTML><HEAD><LINKREL="stylesheet"HREF="index.css"></HEAD><BODY><IMGSRC="image/logo.png"></BODY></HTML>

  • 浏览器发出请求
    GET/index.cssHTTP/1.1

  • 服务器返回响应
    HTTP/1.1200OK Date:Apr11200615:32:08GMT Server:Apache/2.0.46(win32) Connection:Keep-alive,close Content-Length:70 Content-Type:text/plane h3{ font-size:20px; font-weight:bold; color:#005A9C; }
  • 浏览器发出请求
    GETimage/logo.pngHTTP/1.1

  • 服务器返回响应
    HTTP/1.1200OK Date:Apr11200615:32:08GMT Server:Apache/2.0.46(win32) Connection:Keep-alive,close Content-Length:1280 Content-Type:text/plane {Binaryimagedatafollows}

  • 附录

    • HTTP规范 : Internet工程制定组织(IETF)发布的RFC指定Internet标准,这些RFC被Internet研究发展机构广泛接受.因为它们是标准文档,故一般用正规语言编写,如立法文标一样.
    • RFC : RFC一旦被提出,就被编号且不会再改变,当一个标准被修改时,则给出一个新的RFC.作为标准,RFC在Internet上被广泛采用.
    • HTTP的几个重要RFC :
      RFC1945HTTP1.0描述
      RFC2068HTTP1.1初步描述
      RFC2616HTTP1.1标准
    • 资源标识符URI(UniformResourceIdentifter,URI)
  • HTTP参考

    • 一、HTTP码应码
      响应码由三位十进制数字组成,它们出现在由HTTP服务器发送的响应的第一行.

    • 响应码分五种类型,由它们的第一位数字表示:

      • 1xx:信息,请求收到,继续处理
      • 2xx:成功,行为被成功地接受、理解和采纳
      • 3xx:重定向,为了完成请求,必须进一步执行的动作
      • 4xx:客户端错误,请求包含语法错误或者请求无法实现
      • 5xx:服务器错误,服务器不能实现一种明显无效的请求

下表显示每个响应码及其含义 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
100            继续
101            分组交换协
200            OK
201            被创建
202            被采纳
203            非授权信息
204            无内容
205            重置内容
206            部分内容
300            多选项
301            永久地传送
302            找到
303            参见其他
304            未改动
305            使用代理
307            暂时重定向
400            错误请求
401            未授权
402            要求付费
403            禁止
404            未找到
405            不允许的方法
406            不被采纳
407            要求代理授权
408            请求超时
409            冲突
410            过期的
411            要求的长度
412            前提不成立
413            请求实例太大
414            请求URI太大
415            不支持的媒体类型
416            无法满足的请求范围
417            失败的预期
500            内部服务器错误
501            未被使用
502            网关错误
503            不可用的服务
504            网关超时
505            HTTP版本未被支持

  • 二、HTTP头标

头标由主键/值对组成.它们描述客户端或者服务器的属性、被传输的资源以及应该实现连接.

四种不同类型的头标 :

  • 通用头标 : 即可用于请求,也可用于响应,是作为一个整体而不是特定资源与事务相关联.
  • 请求头标 : 允许客户端传递关于自身的信息和希望的响应形式.
  • 响应头标 : 服务器和于传递自身信息的响应.
  • 实体头标 : 定义被传送资源的信息.即可用于请求,也可用于响应.
    头标格式 : <name>:<value><CRLF>
  • 下表描述在HTTP/1.1中用到的头标

    • Accept : 定义客户端可以处理的媒体类型,按优先级排序;
      在一个以逗号为分隔的列表中,可以定义多种类型和使用通配符.例如:Accept: image/jpeg,image/png,/
    • Accept-Charset : 定义客户端可以处理的字符集,按优先级排序;
      在一个以逗号为分隔的列表中,可以定义多种类型和使用通配符.例如 : Accept-Charset: iso-8859-1,*,utf-8

    • Accept-Encoding : 定义客户端可以理解的编码机制.例如:Accept-Encoding:gzip,compress

    • Accept-Language : 定义客户端乐于接受的自然语言列表.例 如:Accept-Language: en,de
    • Accept-Ranges : 一个响应头标,它允许服务器指明:将在给定的偏移 和长度处,为资源组成部分的接受请求.
      该头标的值被理解为请求范围的度量单位.例如Accept-Ranges: bytes或Accept-Ranges: none
    • Age : 允许服务器规定自服务器生成该响应以来所经过的时间长度,以秒为单位.
      该头标主要用于缓存响应.例如:Age: 30
    • Allow : 一个响应头标,它定义一个由位于请求URI中的次源所支持的HTTP方法列表.例如:Allow: GET,PUT
    • aUTHORIZATION : 一个响应头标,用于定义访问一种资源所必需的授权(域和被编码的用户ID与口令).
      例如 : Authorization: Basic YXV0aG9yOnBoaWw=
    • Cache-Control : 一个用于定义缓存指令的通用头标.例如:Cache-Control: max-age=30
    • Connection : 一个用于表明是否保存socket连接为开放的通用头标.例如 : Connection: close或Connection: keep-alive
    • Content-Base : 一种定义基本URI的实体头标,为了在实体范围内解析相对URLs.
      如果没有定义Content-Base头标解析相对URLs,使用Content-Location URI(存在且绝对)或使用URI请求.
      例如:Content-Base: Http://www.myweb.com
    • Content-Encoding : 一种介质类型修饰符,标明一个实体是如何编码的.例如:Content-Encoding: zip
    • Content-Language : 用于指定在输入流中数据的自然语言类型.例如 : Content-Language: en
    • Content-Length : 指定包含于请求或响应中数据的字节长度.例如 : Content-Length:382
    • Content-Location : 指定包含于请求或响应中的资源定位(URI).
      如果是一绝.对URL它也作为被解析实体的相对URL的出发点.
      例如 : Content-Location:http://www.myweb.com/news
    • Content-MD5 : 实体的一种MD5摘要,用作校验和.
      发送方和接受方都计算MD5摘要,接受方将其计算的值与此头标中传递的值进行比较.
      例如 : Content-MD5:
    • Content-Range : 随部分实体一同发送;标明被插入字节的低位与高位字节偏移,也标明此实体的总长度.
      例如 : Content-Range : 1001-2000/5000
    • Contern-Type : 标明发送或者接收的实体的MIME类型.例如 : Content-Type: text/html
    • Date : 发送HTTP消息的日期.例如:Date: Mon,10PR 18:42:51 GMT
    • ETag : 一种实体头标,它向被发送的资源分派一个唯一的标识符.
      对于可以使用多种URL请求的资源,ETag可以用于确定实际被发送的资源是否为同一资源.
      例如 : ETag: “208f-419e-30f8dc99”
    • Expires : 指定实体的有效期.例如 : Expires: Mon,05 Dec 2008 12:00:00 GMT
    • Form : 一种请求头标,给定控制用户代理的人工用户的电子邮件地址.例如 : From:webmaster@myweb.com
    • Host被请求资源的主机名.对于使用HTTP/1.1的请求而言,此域是强制性的.例如 : Host : www.myweb.com
    • If-Modified-Since如果包含了GET请求,导致该请求条件性地依赖于资源上次修改日期.
      如果出现了此头标,并且自指定日期以来,此资源已被修改,应该反回一个304响应代码.
      例如 : If-Modified-Since: Mon,10PR 18:42:51 GMT
    • If-Match : 如果包含于一个请求,指定一个或者多个实体标记.只发送其ETag与列表中标记区配的资源.
      例如 : If-Match : “208f-419e-308dc99”
    • If-None-Match : 如果包含一个请求,指定一个或者多个实体标记.资源的ETag不与列表中的任何一个条件匹配,操作才执行.
      例如 : If-None-Match : “208f-419e-308dc99”
    • If-Range : 指定资源的一个实体标记,客户端已经拥有此资源的一个拷贝.必须与Range头标一同使用.
      如果此实体自上次被客户端检索以来,还不曾修改过,那么服务器只发送指定的范围,否则它将发送整个资源.
      例如 : Range: byte=0-499If-Range:”208f-419e-30f8dc99”
    • If-Unmodified-Since : 只有自指定的日期以来,被请求的实体还不曾被修改过,才会返回此实体.
      例如 : If-Unmodified-Since:Mon,10PR 18:42:51 GMT
    • Last-Modified : 指定被请求资源上次被修改的日期和时间.例如:Last-Modified: Mon,10PR 18:42:51 GMT
    • Location : 对于一个已经移动的资源,用于重定向请求者至另一个位置.
      与状态编码302(暂时移动)或者301(永久性移动)配合使用.
      例如 : Location : http://www2.myweb.com/index.jsp
    • Max-Forwards : 一个用于TRACE方法的请求头标,以指定代理或网关的最大数目,该请求通过网关才得以路由.
      在通过请求传递之前,代理或网关应该减少此数目.例如:Max-Forwards: 3
    • Pragma : 一个通用头标,它发送实现相关的信息.例如 : Pragma: no-cache
    • Proxy-Authenticate : 类似于WWW-Authenticate,便是有意请求只来自请求链(代理)的下一个服务器的认证.
      例如 : Proxy-Authenticate: Basic realm-admin
    • Proxy-Proxy-Authorization : 类似于授权,但并非有意传递任何比在即时服务器链中更进一步的内容.
      例如 : Proxy-Proxy-Authorization: Basic YXV0aG9yOnBoaWw=
    • Public : 列表显示服务器所支持的方法集.例如 : Public : OPTIONS,MGET,MHEAD,GET,HEAD
    • Range : 指定一种度量单位和一个部分被请求资源的偏移范围.例如 : Range : bytes=206-5513
    • Refener : 一种请求头标域,标明产生请求的初始资源.对于HTML表单,它包含此表单的Web页面的地址.
      例如 : Refener : http://www.myweb.com/news/search.html
    • Retry-After : 一种响应头标域,由服务器与状态编码503(无法提供服务)配合发送,以标明再次请求之前应该等待多长时间.
      此时间即可以是一种日期,也可以是一种秒单位.例如:Retry-After: 18
    • Server : 一种标明Web服务器软件及其版本号的头标.例如 : Server : Apache/2.0.46(Win32)
    • Transfer-Encoding : 一种通用头标,标明对应被接受方反向的消息体实施变换的类型.例如:Transfer-Encoding: chunked
    • Upgrade : 允许服务器指定一种新的协议或者新的协议版本,与响应编码101(切换协议)配合使用.
      例如 : Upgrade : HTTP/2.0
    • User-Agent : 定义用于产生请求的软件类型(典型的如Web浏览器).
      例如 : User-Agent : Mozilla/4.0(compatible; MSIE 5.5; Windows NT; DigExt)
    • Vary : 一个响应头标,用于表示使用服务器驱动的协商从可用的响应表示中选择响应实体.例如:Vary: *
    • Via : 一个包含所有中间主机和协议的通用头标,用于满足请求.例如 : Via: 1.0 fred.com, 1.1 wilma.com
    • Warning : 用于提供关于响应状态补充信息的响应头标.例如:Warning: 99 www.myweb.com Piano needs tuning
    • www-Authenticate : 一个提示用户代理提供用户名和口令的响应头 标,与状态编码401(未授权)配合使用.响应一个授权头标.
      例如 : www-Authenticate: Basic realm=zxm.mgmt

第2章 算法

发表于 2017-03-28 | 分类于 DataStructures | 阅读次数

算法 :
算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作.

1. 两种算法的比较

一个求 1 + 2 + 3 + … +100结果的程序 :

1
2
3
4
5
6
int i, sum = 0, n = 100;
for( i = 1; i <= n; i++)
{
sum = sum + i;
}
printf("%d",sum);

高斯解析道 :
sum = 1 + 2 + 3 + … + 99 + 100
sum = 100 +99 + 98 + … + 2 + 1
2xsum = 101 + 101 + 101 + … + 101 + 101
共 100 个 / 所以 sum = 5050

用程序实现如下 :

1
2
3
int i, sum = 0, n = 100;
sum = (1+n) * n / 2;
printf("%d",sum);

2. 算法的定义

算法是解决特定问题求解步骤的描述,在计算机中表现为指令有限序列,并且每条指令表示一个或多个操作.

3. 算法的特征

算法具有五个基本特征 : 输入 / 输出 / 有穷性 / 确定性和可行性.

  • 输入输出 :
    算法具有零个或多个输入.算法至少有一个输出或多个输出.

  • 有穷性 :
    指算法在执行有限的步骤之后,自动结束而不会出现无限循环,并且每一个步骤在可接受的时间内完成.

  • 确定性 :
    算法的每一步骤具有确定的含义,不会出现二义性.算法在一定条件下,只有一条执行路径,相同的输入只能有唯一的输出结果.算法的每个步骤被精准定义而无歧义.

  • 可行性 :
    算法的每一步都必须是可行的,也就是说,每一步都能够通过执行有限的次数完成.

4. 算法设计的要求

  • 正确性 :
    算法的正确性是指算法至少应该具有输入,输出和加工处理无歧义,能正确反映问题的需求,能够得到问题的正确答案.

  • 可读性 :
    算法设计的另一目的是为了便于阅读,理解和交流.

  • 健壮性 :
    当输入数据不合法时,算法也能做出相关的处理,而不是产生异常或莫名其妙的问题.

  • 时间效率高和存储量低 :
    时间效率指的是算法的执行时间,对于同一个问题,如果有多个算法能够解决,执行时间短的算法效率最高,存储量需求指的是算法在执行过程中需要的最大存储空间,主要是指算法程序运行时所占用的内存或外部硬盘存储空间.设计算法应该尽量满足时间效率高和存储量低的需求.花最少的时间,办最大的事.

5. 算法效率的度量方法

  • 事后统计方法 :
    这种方法主要是通过设计的好的测试程序和数据,利用计算机时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低. (因受机器的影响,我们考虑不予采纳)

  • 事前分析估算方法 :
    在计算机程序编制前,依据统计方法对算法进行估算.一个程序的运行时间,依赖于算法的好坏和问题的输入规模,所谓问题输入规模是指输入量的多少.

  • 第一种算法 :

    1
    2
    3
    4
    5
    6
    int i, sum = 0, n = 100; //执行一次
    for( i = 1; i <= n; i++) //执行N+1次
    {
    sum = sum + i; //执行N次
    }
    printf("%d",sum); //执行一次
  • 第二种算法 :

    1
    2
    3
    int i, sum = 0, n = 100; //执行一次
    sum = (1+n) * n / 2; //执行一次
    printf("%d",sum); //执行一次

显然第一种执行了2n+3次,而第二种算法执行了3次.最终,在分析程序的运行时间时,最重要的是把程序看成是独立于程序设计语言的算法或一系列步骤.

6. 函数的渐近增长

函数的渐近增长

函数的渐进增长 : 给定两个函数 f(n) 和 g(n) ,如果存在一个整数 N ,使得对于所有的 n > N, f(n) 总是比 g(n) 大,那么,我们说 f(n) 的增长渐近快于 g(n).

判断一个算法的效率时,函数中的常数和其他次要项常常可以忽略,而更应该关注主项(最高阶项)的阶数.

某个算法,随着n的增大,它会越来越优于另一个算法,或者越来越差于另一个算法.

7. 算法时间复杂度定义

在进行算法分析时,语句总的执行次数 T(n) 是关于问题规模 n 的函数,进而分析 T(n) 随 n 的变化情况而确定 T(n) 的数量级.算法的时间复杂度,也就是算法的时间量度.记做 : T(n) = O(f(n)).它表示随问题规模 n 的增大,算法执行时间的增长率和 f(n) 的增长率相同,称作算法的渐近时间复杂度.简称为时间复杂度.其在 f(n) 是问题规模 n 的某个函数.

一般情况下, T(n) 增长最慢的算法为最优算法.

  • 推导大 O 阶方法

    • 用常数 1 取代运行时间中所有的加法常数.
    • 在修改后的运行次数函数中,只保留最高阶项.
    • 如果最高阶项在且不是 1 ,则去除与这个项相乘的常数.
  • 常数阶
    如高斯算法运行次数 f(n) = 3 ,第一步就是把常数项3改为1,所以为 O(1).

  • 线性阶
    如 : for(i = 0; i < n; i++){} 它的循环时间复杂度为 O(n) ,因为循环体中的代码须要执行 n 次.

  • 对数阶
    int count = 1; while(count<n){ count = count * 2; }

由于每次 count 乘以 2 之后,就距离 n 更近了一分.也就说说,有多少个 2 相乘后大于 n,则会退出循环. 由 2^x=n 得到 x=log2n.所以这个循环的时间复杂度为O[logn]

  • 平方阶
    下面是循环嵌套,它的内循环时间复杂度为 : O(n).
    1
    2
    3
    4
    5
    6
    7
    8
    int i,j;
    for(i=0; i<n; i++)
    {
    for(j=0; j<n; j++)
    {
    // 时间复杂度为O(1)的程序步骤系列
    }
    }

对于外循环,不过是内部这个时间复杂度为 O(n) 的语句,再循环n次.所以这段代码的时间复杂度为 O(n^2).如果外循环的次数改为m,时间复杂度为 O(m*n).

总结出 :
循环的时间复杂度等于循环体的复杂度乘以该循环运行的次数.

1
2
3
4
5
6
7
8
int i,j;
for(i=0; i<n; i++)
{
for(j=i; j<n; j++)
{
// 时间复杂度为O(1)的程序步骤系列
}
}

由于 i = 0 时,内循环执行了 n 次,当 i = 1 时,执行了 n-1 次,… 当 i = n - 1 时,执行了1次.所以总的执行次数为 :
执行的总次数

用大 O 阶的方法,该段代码时间复杂度为 O(n^2).

1
2
3
4
5
6
7
8
9
10
int i,j;
for(i=0; i<n; i++)
{
function(i);
}
void function(int count)
{
print(count);
}

整体的时间复杂度为 O(n).

8. 常见的时间复杂度

常见的时间复杂度

常用的时间复杂度所耗费的时间从小到大依次是 :
耗费时间从小到大

9. 最坏情况和平均情况

最坏情况运行时间是一种保证,那就是运行时间将不会再坏了.在应用中,这是一种最重要的需求.通常,除非特别指定,我们提到的运行时间都是最坏情况下的运行时间.

平均运行时间是所有情况中最有意义的,因为它是期望的运行时间.

10. 算法空间的复杂度

算法的空间复杂度通过计算算法所需的存储空间实现,算法空间复杂度的计算公式记做 : S(n) = O(f(n)),其中,n 为问题的规模, f(n) 为语句 n 所占存储空间的函数.

11. 总结

  • 算法的定义 :
    算法是解决特定问题求解步骤的描述,在计算机中为指令的有限序列,并且每条指令表示一个或多个操作.
  • 算法的特征 :
    有穷性,确定性,可行性,输入,输出.
  • 算法的设计要求 :
    正确性,可读性,健壮性,高效性和低存储量需求.
  • 算法的度量方法 :
    事后统计方法(不科学),事前分析估算方法.
  • 函数的渐近增长 :
    给定两个函数 f(n) 和 g(n) ,如果存在一个整数 N ,使得对于所有的 n > N ,f(n) 总是比 g(n) 大,那么,我们说 f(n) 的增长渐近快于 g(n). 可以分析出 : 随着 n 的变大, 它会越来越优于另一算法,或者越来越差于另一算法.
  • 推导大 O 阶 :
    • 用常数 1 取代运行时间中所有加法常数
    • 在修改后的运行次数函数中,只保留最高阶项
    • 如果最高阶项存在且不是1,则去除与这个项相乘的常数
      得到的结果就是大 O 阶.

第1章 数据结构绪论

发表于 2017-03-28 | 分类于 DataStructures | 阅读次数

数据结构 :
是相互之间存在一种或多种特定关系的数据元素的集合.数据结构是一种研究非数值计算的程序设计问题的操作对象,以及它们之间的关系和操作等相关问题的学科.

程序设计 = 数据结构 + 算法

  • 数据 : 是描述客观事物的符号,是计算机可以操作的对象,是能被计算机识别,并输入到计算机处理的符号集合.数据不仅仅包括整型 / 实数等数值类型,还包括字符及声音 / 图像 / 视频等非数值类型.

    • 可以输入到计算机中
    • 能被计算程序处理
  • 数据元素 : 是组成数组的 / 有一定意义的基本单位,在计算机中通常作为整体处理,也被称为元素.如人类中,人就是数据元素.

  • 数据项 : 一个数据元素可以由若干个数据项组成.如人的数据元素中,可以有眼,耳,嘴,鼻,手,脚等这些数据项.

    • 数据项是数据不可分割的最小单位.
  • 数据对象 : 是性质相同的数据元素的集合,是数据的子集.是指数据元素具有相同数量和类型的数据项.如 : 人都有姓名 / 生日 / 性别等相同的数据项.

在现实世界中,不同数据元素之间不是独立的,而是存在特定关系,我们将这些关系称为结构.

  • 数据结构 : 是相互之间存在一种或多种特定关系的数据元素的集合.

在计算机中,数据元素并不是孤立/杂乱无章的,而是具有内在联系的数据集合.数据元素之间存在的一种或多种特定关系,也就是数据的组织形式.

  • 逻辑结构 : 是指数据对象中数据元素之间的相互关系.
    • 集合结构 : 集合结构中的数据元素除了同属于一个集合外,它们之间没有其他关系.各个数据元素是”平等”的,它们的共同属性是”同属于一个集合”.
      集合结构
  • 线性结构 : 线性结构中的数据元素之间是一对一的关系.

线性结构

  • 树形结构 : 树形结构中的数据元素之间存在一种一对多的层次关系.

树形结构

  • 图形结构 : 图形结构的数据元素是多对多的关系.
    • 将每一个数据元素看做一个结点,用圆圈表示.
    • 元素之间的逻辑关系用结点之间的连线表示,如果这个关系是有方向的,那么用带箭头的连线表示.

图形结构

  • 物理结构 : 是指数据的逻辑结构在计算机中的存储方式.
    数据元素的存储结构形式有两种 : 顺序存储和链式存储.

    • 顺序存储结构 : 是把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的.
      顺序存储结构

    • 链式存储结构 : 是把数据元素存放在任意的存储单元里,这组逻辑单元可以使连续的,也可以是不连续的.数据元素的存储关系并不能反映其逻辑关系,因此需要用一个指针存放数据元素的地址,这些通过地址就可以找到相关联数据元素的位置. (如银行的排队系统,当我领取到号码后,我不需要总是站着等排队)

链式存储结构

  • 数据类型 : 是指一组性质相同的值集合及定义在此集合上的一些操作的总称.
    数据类型是按照值的不同进行划分,在高级语言中,每个变量,常量和表达式都有各自的取值范围.类型就用来说明变量或表达式的取值范围和所能进行的操作.

在C语言中,按照取值的不同,数据类型可以分为两类 :

  • 原子类型 : 是不可以再分解的基本类型,包括整型,实型,字符型等.
  • 结构类型 : 由若干个类型组合而成,是可以再分解的.例如,整型数组是由若干整型数据组成的.

抽象是指抽取出事物具有的普遍性的本质.它是抽出问题的特征而忽略非本质的细节,是对具体事物的一个概括.抽象是一种思考问题的方式,它隐藏了繁杂的细节,只保留实现目标所必须的信息.

  • 抽象数据类型 : 是指一个数学模型及定义在该模型上的一组操作.抽象数据类型的定义仅取决于它的一组逻辑特征,而非其在计算机内部如何表示和实现无关.

事实上,抽象数据类型体现了程序设计中问题分解,抽象和信息隐藏的特征.抽象数据类型把实际生活中的问题分解为多个规模小且容易处理的问题,然后建立一个计算机能处理的数据模型,并把每个功能模块的实现细节作为一个独立的单元,从而使具体实现过程隐藏起来.

  • 总结 : 数据结构是相互之间存在一种或多种特定关系的数据元素集合.

第5章 条件,循环和其他语句

发表于 2017-03-28 | 分类于 Python | 阅读次数

1. print 和 import 的更多信息

提示
对于很多应用程序来说,使用logging模块记日志比print语句更合适.

1.1 使用逗号输出

1
2
3
4
5
>>> name = 'kevin'
>>> age = 19
>>> print name,age
kevin 19
>>>

1.2 把某些事作为另一件事导入

从模块导入函数,通常可以使用 :

  • import somemodule
  • from somemodule import somefunction
  • from somemodule import somefunction,anotherfunction,yetanotherfuction
  • from somemodule import *

如果两个模板都有相同函数,可以在语句末尾增加一个as子句,在子句后给出想要的别名.

1
2
3
4
>>> import math as foobar
>>> foobar.sqrt(4)
2.0
>>>

或者为函数提供别名

1
2
3
4
>>> from math import sqrt as foobar
>>> foobar(4)
2.0
>>>

2. 赋值魔法

2.1 序列解包

多个赋值的操作可以同时进行 :

1
2
3
4
>>> x,y,z = 1,2,3
>>> print x,y,z
1 2 3
>>>

交换两个(或多个)变量 :

1
2
3
4
>>> x,y = y,x
>>> print x,y,z
2 1 3
>>>

还可以这样玩 :

1
2
3
4
5
6
7
>>> values = 1,2,3
>>> values
(1, 2, 3)
>>> x,y,z = values
>>> x
1
>>>

2.2 链式赋值

链式赋值(chained assignment) 是将同一个值赋给多个变量的捷径.

x = y = somefunction()

2.3 增量赋值

x = x + 1 等于 x+=1

3. 语句块 : 缩排的乐趣

注意
使用tab字符也可以缩进语句块.Python将一个tab字符解释为到下一个tab字符位置的移动,而一个tab字符位置为8个空格,但是标准且推荐的方式是只用空格,尤其是在每个缩进需要4个空格的时候.

4. 条件和条件语句

4.1 这就是布尔变量的作用

下面的值作为布尔表达式的时候,会被解释器看做假(false)
False None 0 "" () [] {}

注意
尽管[]和””都是假值,但是它们本身不相等.

4.2 条件执行和if语句

1
2
3
4
5
6
7
What is your name?kevin
>>> if name.endswith('kevin'):
print 'hello'+name
hellokevin
>>>

4.3 else语句

1
2
3
4
5
6
7
8
What is your name?kevin
>>> if name.endswith('kevin') :
print 'hello'+name
else :
print 'hello'
hellokevin
>>>

4.4 elif子句

elif是else if的简写

4.5 嵌套代码块

1
2
3
4
5
6
7
8
9
10
name = raw_input("What is your name?")
if name.endswith('Gumby'):
if name.startswith('Mr.'):
print 'Hello,Mr.Gumby'
elif name.startswith('Mrs.'):
print 'Hello,Mrs.Gumby'
else:
print 'Hello,Gumby'
else:
print 'hello,stranger'

4.6 更复杂的条件

表达式 描述
x is y x和y是同一个对象
x is not y x和y是不同的对象
x in y x是y容器(例如,序列)的成员
x not in y x不是y容器(例如,序列的)成员

相等运算符 ‘foo’ = ‘foo’

is : 同一性运算符
is 运算符是判定同一性而不是相等性.变量x和变量y都被绑定到同一个列表上,而变量z被绑定在另外一个具有相同数值和顺序的列表上.

总结 : 使用 == 运算符来判定两个对象是否相等,使用is判定两者是否相同(同一个对象).

4.7 断言

1
2
3
4
5
6
7
8
9
The number is positive
>>> age = -1
>>> assert 0 <age<100
Traceback (most recent call last):
File "<pyshell#32>", line 1, in <module>
assert 0 <age<100
AssertionError

5. 循环

  • while 循环 :
1
2
3
4
x = 1
while x<=100:
print x
x+=1
  • for 循环 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
>>> words = ['this','is','an','ex']
>>> for word in words:
print word
this
is
an
ex
# 或者:
>>> range(0,10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 或者 :
>>>
  • 循环遍历字典元素
1
2
3
4
5
6
7
8
9
>>> d = {'x':1,'y':2,'z':3}
>>> for key in d:
print key,d[key]
y 2
x 1
z 3
>>>

5.4 一些迭代工具

  • 并行迭代
1
2
3
4
5
6
7
>>> names = ['kevin','leona']
>>> ages = [22,21]
>>> for i in range(len(names)):
print names[i],ages[i],'years old'
kevin 22 years old
leona 21 years old

5.5 跳出循环

break : 结束本次循环
continue : 跳过本次循环

6. 列表推导式 - 轻量级循环

列表推导式(List comprehension) 是利用其他列表创建新列表.

1
2
>>> [x*x for x in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

7. 总结

函数 描述
chr(n) 当传入序号n时,返回n所代表的包含一个字符的字符串,(0<=n<256)
eval(source[,globals[,locals]]) 将字符串作为表达式计算,并且返回值
enumerate(seq) 产生用于迭代(索引,值)对
ord(c) 返回单字符字符串的int值
range([start,]stop[,step]) 创建整数的列表
reversed(seq) 产生seq中值的反向版本,用于迭代
sorted(seq[,cmp][,key][,reverse]) 返回seq中值排序后的列表
xrange([start,]stop[,step]) 创建xrange对象用于迭代
zip(seq1,seq2) 创建用于并行迭代的新序列

第4章 字典:当索引不好用时

发表于 2017-03-28 | 分类于 Python | 阅读次数

字典是Python中唯一内建的映射类型.字典中的值并没有特殊的顺序,但是都存储在一个特定的键(Key)下.键可以是数字/字符串甚至是元组.

1. 字典的使用

  • 表示一个游戏棋盘的状态,每个键都是由坐标值组成的元组;
  • 存储文件修改时间,用文件名作为键.
  • 数字电话/地址簿.

2. 创建和使用字典

  • 字典可以通过下面的方式创建 :
    phonebook = {'Kevin':'520','Leona':'1314'}

字典由多个键及其对应的值构成的键-值对组成,在上面的例子中,名字是键,数字则是值.每个键和它的值之间用冒号(:)隔开,项之间用逗号(,)隔开,而整个字典都是由一对大括号括起来.空字典(不包括任何项)由两个大括号组成,像这样 : {}.

2.1 dict函数

dict函数,通过其它映射(比如其他字典)或者(键,值)对的序列建立字典.

1
2
3
4
5
>>> items = [('name','kevin'),('age',21)]
>>> d = dict(items)
>>> d['name']
'kevin'
>>>

dict函数也可以通过关键字参数来创建字典 :

1
2
3
4
>>> d = dict(name="Kevin",age=42)
>>> d
{'age': 42, 'name': 'Kevin'}
>>>

2.2 基本字典操作

字典的基本行为在很多方面与序列(sequence)类型 :

  • len(d)返回d中项(键-值对)的数量;
  • d[k]返回关联到键k上的值;
  • d[k] = v 将值v关联到见k上;
  • del d[k] 删除键为k的项
  • k in d 检查d中是否有含有键为k的项.
  • 键类型 : 字典的键不一定为整数类型,键可以是任意的不可变类型,比如浮点型(实型),字符串或者元组.
  • 自动添加 : 即使键起初在字典中并不存在,也可以为它赋值,这样字典就会建立新的项.
  • 成员资格 : 表达式 k in d(d为字典)查找的键,而不是值.表达式v in l(l为列表)则用来查找值,而不是索引.

键可以是任意不可变类型 :

1
2
3
4
5
>>> x = {}
>>> x[12] = 'kevin'
>>> x
{12: 'kevin'}
>>>

2.3 字典的格式化字符串

1
2
3
>>> "Cecil's phone number is %(Cecil)s."%phonebook
"Cecil's phone number is 3258."
>>>

2.4 字典方法

  • clear
    clear方法清除字典中所有的项.这个是原地操作,所以无返回值.
1
2
3
4
5
6
7
8
>>> d = {}
>>> d['name'] = 'kevin'
>>> d
{'name': 'kevin'}
>>> d.clear()
>>> d
{}
>>>
  • copy
    copy方法返回一个具有相同键-值对的新字典.(这个方法实现的浅复制,因为值本身就是相同的,而不是副本.)
1
2
3
4
5
>>> x = {'username':'admin','pasword':123456}
>>> y = x.copy()
>>> y
{'username': 'admin', 'pasword': 123456}
>>>

但是,如果修改了某个值(原地修改,而不是替换),原始的值也会改变,因为同样的值存储在原字典中.模块的deepcopy函数来完成操作.

1
2
3
4
5
6
7
8
9
>>> from copy import deepcopy
>>> d = {}
>>> d['names'] = ['Kevin','Leona']
>>> c = d.copy()
>>> dc = deepcopy(d)
>>> d['names'].append('Clive')
>>> c
{'names': ['Kevin', 'Leona', 'Clive']}
>>>
  • fromkeys
    fromkeys方法使用给定的键建立新的字典,每个键都对应一个默认的的值None.
1
2
3
>>> {}.fromkeys(['name','age'])
{'age': None, 'name': None}
>>>
  • get
    get方法是个更宽松的字典项的方法,当使用get访问一个不存在的键时,没有任何异常,而得到了None值.还可以自定义”默认值”,替换None.
1
2
>>> d.get('name','N/A')
'N/A'
  • has_key
    has_key方法可以检查字典中是否有特定的键.表达式d.has_key(k)相当于表达式k in d.
1
2
3
4
5
6
>>> d = {'name':'kevin'}
>>> d.has_key('name')
True
>>> d.has_key("password")
False
>>>
  • items和iteritems
    items方法将所有字典的项以列表方式返回,列表中的每一项都表示为(键,值)对的形式.但是项在返回时并没有遵循特定的次序.

  • keys和iterkeys
    keys方法将字典中的键以列表形式返回,而iterkeys则返回针对键的迭代器.

  • pop
    pop方法用来获得对应给定键的值,然后将这个键-值对从字典中移除.

1
2
3
4
5
6
>>> d = {'x':1,'y':2}
>>> d.pop('x')
1
>>> d
{'y': 2}
>>>
  • popitem
    popitem方法类似于list.pop,后者会弹出列表的最后一个元素.

  • setdefault
    setdefault方法在某种程度上类型于get方法,能够获得与给定键相关联的值,除此之外,setdefault还能在字典中不包含有给定键的情况下设定相应的键值.

1
2
3
4
5
>>> d.setdefault('name','N/A')
'N/A'
>>> d['name'] = 'kevin'
>>> d.setdefault('name','N/A')
'kevin'

可以看到,当键不存在的时,setdefault返回默认值并且相应地更新字典.如果键存在,那么就返回与其对应的值,但不改变字典.默认值是可选的,这点和get一样.

  • update
    update方法可以利用一个字典项更新另外一个字典 :
1
2
3
4
5
6
>>> d = {'title':'python Web Site','url':'http://www.python.org'}
>>> x = {'title':'python language website'}
>>> d.update(x)
>>> d
{'url': 'http://www.python.org', 'title': 'python language website'}
>>>
  • values和itervalues
    values方法以列表的形式返回字典中的值(itervalues返回值的迭代器).与返回键的列表不同的是,返回值的列表中可以包含重复的元素.
1
2
3
4
5
6
>>> d = {}
>>> d[1] = 1
>>> d[2] = 2
>>> d.values()
[1, 2]
>>>

3. 小结

  • 映射 : 映射可以使用任意不可变对象标识元素,最常用的类型是字符串和元组.
  • 利用字典格式化字符串 : 可以通过在格式化说明中包括名称(键)来对字典应用字符串格式化操作.当在字符格式化中使用元组时,还需要对元组中每一个元素都设定”格式化说明符”.在使用字典时,所有的说明符可以比在字典中用到的项少.
  • 字典的方法 : 字典很多方法,调用的方式和调用列表以及字符串方法的方式相同.
123…13
王裕杰

王裕杰

以中有足乐者,不知口体之奉不若人也.

130 日志
13 分类
24 标签
GitHub 微博 豆瓣 知乎
© 2016 - 2017 王裕杰
由 Hexo 强力驱动
主题 - NexT.Muse