《葵花宝典》是谁写的?
长文预警!! 金庸小说里,神功秘籍众多。然而《葵花宝典》,来无影去无踪,只在《笑傲江湖》里惊鸿一瞥,却以其独特的练功前提和超强的功效,荣登最知名秘籍榜。 不少人都认为:《葵花宝典》乃是金庸武学体系中的第一秘籍。 这么厉害的宝典,究竟是谁创造的? (1) 唯快不破 相比其秘籍,《葵花宝典》显得非常另类。一个另类之处,在于它有姐妹武功《辟邪剑谱》。实际上,真正全本的《葵花宝典》早已被红叶禅师烧毁。无论是东方不败练的《葵花宝典》还是岳不群林平之练的《辟邪剑谱》,都不过是全本《葵花宝典》的残篇。因而任我行认为,这两部书根本是同等的。 盈盈听到这里,心想:“爹爹曾道,这《辟邪剑谱》,其实和我教的《葵花宝典》同出一源,基本原理并无二致,无怪岳不群和这林平之的剑法,竟然和东方不败如此近似。” 如果我们想要探讨的,是全本的《葵花宝典》,那么东方不败手中的残本《葵花宝典》和林远图所写的《辟邪剑谱》,无疑都在我们的考察范围之内。 另一个奇怪的方面在于:《葵花宝典》(也包括《辟邪剑谱》,下同),练的是什么? 是招式吗? 但令狐冲和盈盈都已瞧了出来,这人所使剑招虽是辟邪剑法,但闪跃进退固与东方不败相去甚远,亦不及岳不群和林平之的神出鬼没,只是他本身武功甚高,远胜青城诸弟子,加上辟邪剑法的奇妙,以一敌众,仍大占上风。岳灵珊道:“他剑法好像和你相同,但出手没你快。”林平之吁了口气,道:“出手不快,便不合我家剑法的精义。可是……可是,他是谁?为甚么会使这剑法?” 《辟邪剑法》招式虽然精妙,但是明眼人都可以看出,其要义不在招式。否则,招式精熟的林震南林平之父子怎会惨遭余沧海的毒手?林平之习得真正的《辟邪剑法》之后又说过这件事。 林平之阴森森的道:“正是。这辟邪剑谱的第一道法诀,便是:‘武林称雄,挥剑自宫’。”岳灵珊道:“那……那为甚么?”林平之道:“练这辟邪剑法,自练内功入手。若不自宫,一练之下,立即欲火如焚,登时走火入魔,僵瘫而死。”岳灵珊道:“原来如此。”语音如蚊,几不可闻。 拿其他著名秘籍举例。《九阴真经》中不仅包括高妙的内功法门,也包括了九阴白骨爪这样狠辣的武功。而像《九阳真经》则主讲内功,没有招式,但是包含了许多武学至理,对学习和创造高深武功极有帮助。《葵花宝典》看上去应该是侧重内功,武功不太多。 可是,林平之的内功又怎么样呢? 林平之长剑刺入,和他驼剑相触,手臂便一阵酸麻,显然对方内力比自己强得太多,稍有不慎,长剑还会给他震飞。这么一来,出招时便不敢托大,看准了他空隙再以快剑进袭。木高峰只是自行使剑,一柄驼剑运转得风雨不透,竟然不露丝毫空隙。林平之剑法虽高,一时却也奈何他不得。 木高峰并非绝顶高手,而林平之竟然不能与他正面对撼。他的内功都学到哪里去了? 其实上文引用了这么多,答案已经初露端倪了。 忽听得啊啊两声响,青城派中于人豪、吉人通脸色大变,胸口鲜血狂涌,倒了下去。旁人都不禁惊叫出声,明明眼见他要出手对付木高峰,不知如何,竟会拔剑刺死了于吉二人。他拔剑杀人之后,立即还剑入鞘,除了令狐冲等几个高手之外,但觉寒光一闪,就没瞧清楚他如何拔剑,更不用说见他如何挥剑杀人了。令狐冲心头闪过一个念头:“我初遇田伯光的快刀之时,也是难以抵挡,待得学了独孤九剑,他的快刀在我眼中便已殊不足道。然而林平之这快剑,田伯光只消遇上了,只怕挡不了他三剑。我呢?我能挡得了几剑?”霎时之间,手掌中全是汗水。 林平之剑快,东方不败也快。 这当世三大高手联手出战,势道何等厉害,但东方不败两根手指拈着一枚绣花针,在三人之间穿来插去,趋退如电,竟没半分败象。上官云拔出单刀,冲上助战,以四敌一。斗到酣处,猛听得上官云大叫一声,单刀落地,一个筋斗翻了出去,双手按住右目,这只眼睛已被东方不败刺瞎。 快!快!快!剑快,身快,绣花针也快,快到行若鬼魅,令人觉得恐惧。这才是《葵花宝典》和《辟邪剑法》的要诀! 天下武功,唯快不破。这天下武功,能比《葵花宝典》还快吗?《葵花宝典》借此无敌于天下。东方不败,岳不群,林平之,三位习练者,谁也不是败在武功上,而是场外因素作怪。 《葵花宝典》,当真乃金书中第一奇功! (2)道家神术 但是,想要修得绝世神功,就要付出一些代价。 任我行伸手到东方不败衣衫袋中,摸出一本薄薄的旧册页,随手一翻,其中密密麻麻的写满了字。他握在手中扬了扬,说道:“这本册子,便是《葵花宝典》了,上面注明,‘欲练神功,引刀自宫’,老夫可不会没了脑子,去干这等傻事,哈哈,哈哈,……” 若仅仅是自宫,还则罢了。《葵花宝典》带给修炼者的影响不仅局限于此。 譬如,胡须脱落。 你爹还在强辩:‘我向来便是如此。’你妈道:‘每天早晨,你被窝里总是落下了许多胡须……’你爹尖叫一声:‘你瞧见了?’语音甚是惊怖。你妈叹道:‘我早瞧见了,一直不说。你粘的假须,能瞒过旁人,却怎瞒得过和你做了几十年夫妻的枕边之人?’ 声线变化。 你爹爹大声道:‘你怎知我在学辟邪剑法?你……你……在偷看我吗?’你妈道:‘我又何必偷看这才知道?’你爹大声道:‘你说,你说!’他说得声嘶力竭,话音虽响,却显得颇为气馁。“你妈道:‘你说话的声音,就已经全然变了,人人都听得出来,难道你自己反而不觉得?’ 涂脂抹粉。 林平之不答,目光中满是怒火,脸上却又大有兴奋之色,折扇一拢,交于左手,右手撩起袍角,跨出草棚,直向木高峰走去。熏风过处,人人闻到一阵香气。 直至性情大变。 除了令狐冲之外,众人都认得这人明明便是夺取了日月神教教主之位、十余年来号称武功天下第一的东方不败。可是此刻他剃光了胡须,脸上竟然施了脂粉,身上那件衣衫式样男不男、女不女,颜色之妖,便穿在盈盈身上,也显得太娇艳、太刺眼了些。这样一位惊天动地、威震当世的武林怪杰,竟然躲在闺房之中刺绣! 虽说自宫之后的男人已经不能称之为男人,但是这并不代表着他们就一定要变成女人。古代的太监,若是成年以后净身,依然能保持男性特征不变。宋代权阉童贯,便有一副好胡须,人称“美髯公”。清代的宫闱之内,太监常与宫女结成对食,俨然便似夫妻一般。出宫养老的太监,也会取个小老婆,在形式上补完自己的男性身份。阉割,和身体上与心理上的变性,委实还有着不小的距离。 练习了《葵花宝典》和《辟邪剑谱》的三位,却都明显出现了性别倒错的现象。可能东方不败学的最深(也因他本人之前武功最高,而且最为聪明),他的变化也最深。不光身体上,三个人都不同程度地出现了“羡慕女性,模仿女性,仇视女性”的心理。 至于为什么会出现这种变化,面对质疑,东方不败是如此解释的。 东方不败叹了口气,说道:“我初当教主,那可意气风发了,说甚么文成武德,中兴圣教,当真是不要脸的胡吹法螺。直到后来修习《葵花宝典》,才慢慢悟到了人生妙谛。其后勤修内功,数年之后,终于明白了天人化生、万物滋长的要道。”…… 东方不败又叹了口气,幽幽的道:“很好是谈不上,只不过我一直很羡慕你。一个人生而为女子,已比臭男子幸运百倍,何况你这般千娇百媚,青春年少。我若得能和你易地而处,别说是日月神教的教主,就算是皇帝老子,我也不做。” 也许《葵花宝典》并不是一部传统意义上的武学经典。相比之于《九阴真经》等秘籍,它的核心不在练武功,而在于改造人体本身,将人体提升至另一个层次,这才能让修炼者获得如同鬼魅般的速度。但是其代价就是性别错乱。 谁这么热衷于改造人体呢?东方不败的这段话是习练者对《葵花宝典》的真切描绘,相当珍贵。他所使用的术语如“天人化生,万物滋长”等,都给我提供了明确的指向。 《葵花宝典》,是一门道家武功。只有道家,才会热衷于修炼和炼丹,追求白日飞升,让人变成仙。《葵花宝典》的思想核心,必是出自道家无疑。 这也并非什么奇事。黄裳精研道藏,就能创造出一套《九阴真经》来,深刻地说明了道家经典与武学秘籍之间的密切关系。内功修炼这回事,本来就是道家修炼的产物。不过平常的武功修炼,应当属于道家修身养性的末等功夫,改造身体、成仙得道才是道家(道教)的根本追求。武学之士,本就属于修炼之人,也难怪他们看到《葵花宝典》这等高任何武学秘籍一等的宝贝,会如此爱不释手了。 (3)宫廷武学 但是,《九阴真经》尚有作者,《葵花宝典》的作者又是谁呢?书中对此语焉不详,只有一段描写。 他顿了一顿,缓缓说道:“这部《葵花宝典》,武林中向 来都说,是前朝皇宫中一位宦官所著。”令狐冲道:“宦官?” 方证道:“宦官就是太监。”令狐冲点头道:“嗯。”方证道: “至于这位前辈的姓名,已经无可查考,以他这样一位大高手, 为甚么在皇宫中做太监,那是更加谁也不知道了。 在这段说明里,《葵花宝典》的具体作者其姓名、身世与创作动机依然未能揭示出来。我们只能知道,作者是一名宦官。进而可以推论:《葵花宝典》是一门宫廷武学。 大内之中,需要高手,又不需要高手。有一个高手贴身保护,皇帝的安全系数当然会大大提高。但这个高手万一叛变怎么办?离皇帝最近的地方,放一个武力值爆表的人,其实带来的危险大于安全,很容易变成肘腋之患。还不如多置侍卫,安排火枪弓箭,来得稳妥。 […]
程序猿远离监狱避坑指南
力量和责任总是相伴相生的,拥有了强大开发能力的程序员们,还需要拥有同样强大的鉴别能力,来知道什么可以做什么不能做。下面,我们就来盘点下写项目的过程中,你需要具备的法律知识。 Web领域及外包开发 从合规角度出发,最基本的就是域名要备案,业务要与备案信息相符,不符合这一条,你的域名随时可能被云服务商停止解析,导致服务无法访问。 域名备案后,经营的业务要与域名的备案信息相符,同时还要有必要的营业资质。比如,办论坛的需要有互联网增值业务许可证;做教育的需要有教育培训的许可证;卖食品的要有食品安全许可证;做金融类的要有相关业务的牌照,等等。总之,做业务一定要证件先行,以免造成欣欣向荣的业务猝死。 这个资质的要求前些年是没有那么严格的,这两年开始严查了。严查到什么地步呢?个人备案的域名相关网站,连“登录”功能都不准有,否则就是非法收集用户信息。没有“登录”,也就谈不上互动,网站就变成只能做信息发布,无法做信息采集了。问题是发布的内容也是有严格限制的,只能是个人经验分享一类的原创内容。如果你发布了非个人经验分享类的内容,你就极大可能会触犯这几条相关法律:发布新闻的会触犯《互联网新闻信息管理规定》,因为你没有相关媒体资质;转载文章的,你有可能因为侵犯他人版权而被追责(现在版权追责都是专业公司代理的,追到的赔偿代理公司和版权所有人分账,所以追责是非常有动力的,你不要觉得你不会被发现);评价产品及名人的,有可能被直接起诉,说你造谣及伤害名誉。结果你思前想后,会发现你的“网站”除了作为一个发布文章还需要手动更新源代码的博客以外,再无其他可做之事。可是这样,那你为什么还要自己做个网站呢?直接注册个公众号或者今日头条号不好吗?对,确实没必要自己做个网站。事实上,现在个人备案的域名已经再无任何实际意义。如果想做点业务,就注册个公司,以公司名义备案,备足各类资质,真真切切地经营起来。当然,这都是要钱的。低成本自主(不依附平台)创业的时代,真的过去了。 除了这些合规性的事项,你还要注意合法的问题,也就是你的业务一定要合法:千万不要做非法集资、赌博、传销这类来钱快但是有点灰色的项目,甚至外包都不要接这类的项目。这类项目直接参与,蹲个三年五载很正常;外包接了不参与运营,拘留所里走一遭。关键是有时候你可能第一眼都没有发现自己正在做的项目是违法的:用户钱收上来没给发东西(或服务),都可以判定为非法集资,比如众筹之后项目没成;用户钱收上来然后概率性的可以获得物品或服务,都可以判定为赌博,比如付费的抽奖;用户的钱收上来,一部分支付给销售链上的人了,这个链条长度达到三级,都可以判定为传销。从这个抽象的角度去分析,你就会发现,这个法律红线离你是多么的近。你要多么小心,才能行走在安全区内。 爬虫领域 爬虫领域需要注意的核心问题是爬取的内容和爬取的速度。 爬取的内容要经过内容所有人的同意,即公开内容。但是事实上你的老板让你写爬虫,七八成的概率就是爬取未经同意的内容,这也是爬虫领域案件多发的原因。这时候,你可以给你的老板普普法,让他清醒一些,别被“增长”迷昏了头,将来蹲了局子后悔莫及。爬虫爬取内容如果涉及“行踪轨迹信息、通信信息、征信信息、财产信息”,未经允许爬超50条,就可以判3年;淘宝交易记录,未经允许爬取超500条,也可以判3年;运营商网站通话记录,未经允许爬超过500条,可以判7年。你看看这些数字,50条、500条,程序运行起来不就是几分钟的事情?你启动程序的那一瞬间,可能你的监狱3年游行程就已经预定好了,连反悔再想想的时间都没有。所以,你真的需要认真想一想的时间点,应该是程序编写前。这个爬虫合法吗?这个内容应该获取吗?这才是对你最重要的问题。 其次,你爬别人的内容,一定不要干扰到人家的正常服务。一旦形成干扰,那就给别人带来切实的经济损失了。你影响别人赚钱了,这事可能不违法吗? 人工智能领域 人工智能领域的相关法律是近期才颁布的,主要是拜deepfake这个项目所赐。它的出现让网络内容完全没了可信度可言。为此,今年11月18日颁布的《网络音视频信息服务管理规定》特意为它定制了两条: 简单说,就是人工智能修改过的视频必须要有标识;转载新闻信息,必须转载自国家规定的来源,不能三人成虎。 训练一个模型不容易,训练出来不能用就亏大了。如果不想亏,训练之前就要先想好,这个模型对社会有没有益处?如果无益,还是直接不要训练的好。 Devop领域 这个领域还是比较安全的,毕竟不直接接触用户,碰法律红线的概率就大大降低了。对这个领域的同学小编就一句话:冷静,别删库,别跑路。做到这一点,基本你跟监狱无缘。 总结 道路千万条,安全第一条。挣钱不易,但千万不能为了多挣钱去投机取巧,挣不义之财。法律千万条,良心就一条。只要你做事光明正大、利人利己,就算不知道那么多法律条文,法律也不会找上你。归根结底,程序员还是要有自己的底线和道德标准,才能走得远走的长。 PS:环境越来越清明,同时监管越来越严格。实话讲,发财的机会是越来越少了,大环境对创业者的要求是越来越高了。社会进入定型期,想做大事业,更需要持续努力和定力了,前20年那种单凭闯劲就少年得志的例子恐怕要越来越少了。合理生活,持之以恒,诸君勉乎哉!
一个测试工程师走进酒吧
一个测试工程师走进酒吧: 他点了 1 杯啤酒;他点了 7 杯啤酒;他点了 2333333333333 杯啤酒;他点了 0 杯啤酒;他点了 -1 杯啤酒;他点了 0.2 杯啤酒;他点了 1 只 ?;他试了不付钱就走人;他点了 NaN 杯 Null;他点了 หนึ่งหนึ่งหนึ่งหนึ่งหนึ่งหนึ่งหนึ่ง 杯啤酒;他点了??????????;他点了 1 杯啤酒,付钱的中途跳窗而走; 他点了 1 杯啤酒,然后端着去了卫生间洗脚;他点了 1 杯啤酒,又说不要了,然后又点了,又不要了。再点了,又不要了……;他点了 1 杯啤酒,仔细盯着女服务员把啤酒放到收银台,生怕啤酒洒出来了; 他点了 1 杯啤酒,女服务员递给他后,他说为啥不给我 3 杯;他点了 1 杯啤酒,开始撩女服务员,并要她的联系方式;他点了 1 杯啤酒,然后遛进收银台,拔了电脑电源,等着看女服务员的反应;他点了 1 杯啤酒,走出酒吧后往街上撒了一把爆米花,然后打碎玻璃从窗户爬进酒吧,看看女服务员是不是还认识他。他点了 1 杯啤酒,并同时让数万个机器人同时都点了一杯;他二话不说,抄起凳子就开始砸吧台; …… 他看着就像一个深井冰。他就是个深井冰。 …… 另一个测试工程师走进酒吧,卒! …… 酒吧上线后,有个客户牵着狗狗去酒吧点了 1 份狗粮,酒吧?塌了。
kafka安装及Kafka-PHP扩展的使用
话说用了就要有点产出,要不然过段时间又忘了,所以在这里就记录一下试用Kafka的安装过程和php扩展的试用。 下面就开始讲Kafka的安装吧。我以CentOS6.4为例,64位。 一. 首先确认下jdk有没有安装 使用命令 [root@localhost ~]# java -version java version “1.8.0_73” Java(TM) SE Runtime Environment (build 1.8.0_73-b02) Java HotSpot(TM) 64-Bit Server VM (build 25.73-b02, mixed mode) 如果有以上信息的话,就往下安装吧,有些可能是jdk对不上,那就装到对的上的。如果没有安装,就看一下下面的jdk安装方法: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 到这个地址下载jdk8版本,我下载的是jdk-8u73-linux-x64.tar.gz,然后解压到/usr/local/jdk/下。 然后打开/etc/profile文件 [root@localhost ~]# vim /etc/profile 把下面这段代码写到文件里 export JAVA_HOME=/usr/local/jdk/jdk1.8.0_73 export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar export PATH=$JAVA_HOME/bin:$PATH 最后 [root@localhost ~]# source /etc/profile 这时jdk就生效了,可以使用 java -version验证下。 二. 接下来安装Kafka 1. 下载Kafka 到http://kafka.apache.org/downloads.html下载相应的版本,我使用的是kafka_2.9.1-0.8.2.2.tgz。 […]
Python并发编程之实战异步IO框架:asyncio 下篇(十一)
大家好,并发编程 进入第十一章。 前面两节,我们讲了协程中的单任务和多任务 这节我们将通过一个小实战,来对这些内容进行巩固。 在实战中,将会用到以下知识点: 多线程的基本使用 Queue消息队列的使用 Redis的基本使用 asyncio的使用 . 动态添加协程 在实战之前,我们要先了解下在asyncio中如何将协程态添加到事件循环中的。这是前提。 如何实现呢,有两种方法: 主线程是同步的 import time import asyncio from queue import Queue from threading import Thread def start_loop(loop): # 一个在后台永远运行的事件循环 asyncio.set_event_loop(loop) loop.run_forever() def do_sleep(x, queue, msg=””): time.sleep(x) queue.put(msg) queue = Queue() new_loop = asyncio.new_event_loop() # 定义一个线程,并传入一个事件循环对象 t = Thread(target=start_loop, args=(new_loop,)) t.start() print(time.ctime()) # 动态添加两个协程 # […]
Python并发编程之学习异步IO框架:asyncio 中篇(十)
大家好,并发编程 进入第十章。 好了,今天的内容其实还挺多的,我准备了三天,到今天才整理完毕。希望大家看完,有所收获的,能给小明一个赞。这就是对小明最大的鼓励了。 为了更好地衔接这一节,我们先来回顾一下上一节的内容。 上一节「」,我们首先介绍了,如何创建一个协程对象. 主要有两种方法 通过async关键字, 通过@asyncio.coroutine 装饰函数。 然后有了协程对象,就需要一个事件循环容器来运行我们的协程。其主要的步骤有如下几点: 将协程对象转为task任务对象 定义一个事件循环对象容器用来存放task 将task任务扔进事件循环对象中并触发 为了让大家,对生成器和协程有一个更加清晰的认识,我还介绍了yield和async/await的区别。 最后,我们还讲了,如何给一个协程添加回调函数。 好了,用个形象的比喻,上一节,其实就只是讲了协程中的单任务。哈哈,是不是还挺难的?希望大家一定要多看几遍,多敲代码,不要光看哦。 那么这一节,我们就来看下,协程中的多任务。 . 本文目录 协程中的并发 协程中的嵌套 协程中的状态 gather与wait . 协程中的并发 协程的并发,和线程一样。举个例子来说,就好像 一个人同时吃三个馒头,咬了第一个馒头一口,就得等这口咽下去,才能去啃第其他两个馒头。就这样交替换着吃。 asyncio实现并发,就需要多个协程来完成任务,每当有任务阻塞的时候就await,然后其他协程继续工作。 第一步,当然是创建多个协程的列表。 # 协程函数 async def do_some_work(x): print(‘Waiting: ‘, x) await asyncio.sleep(x) return ‘Done after {}s’.format(x) # 协程对象 coroutine1 = do_some_work(1) coroutine2 = do_some_work(2) coroutine3 = do_some_work(4) # […]
Python并发编程之初识异步IO框架:asyncio 上篇(九)
大家好,并发编程 进入第九篇。 通过前两节的铺垫(关于协程的使用),今天我们终于可以来介绍我们整个系列的重点 — asyncio。 asyncio是Python 3.4版本引入的标准库,直接内置了对异步IO的支持。 有些同学,可能很疑惑,既然有了以生成器为基础的协程,我们直接使用yield 和 yield from 不就可以手动实现对IO的调度了吗? 为何Python吃饱了没事干,老重复造轮子。 这个问题很好回答,就跟为什么会有Django,为什么会有Scrapy,是一个道理。 他们都是框架,将很多很重复性高,复杂度高的工作,提前给你做好,这样你就可以专注于业务代码的研发。 跟着小明学完了协程的那些个难点,你是不是也发现了,协程的知识点我已经掌握了,但是我还是不知道怎么用,如何使用,都说它可以实现并发,但是我还是不知道如何入手? 那是因为,我们现在还缺少一个成熟的框架,帮助你完成那些复杂的动作。这个时候,ayncio就这么应运而生了。 . 本文目录 如何定义/创建协程 asyncio的几个概念 学习协程是如何工作的 await与yield对比 绑定回调函数 . 如何定义/创建协程 还记得在前两章节的时候,我们创建了生成器,是如何去检验我们创建的是不是生成器对象吗? 我们是借助了isinstance()函数,来判断是否是collections.abc 里的Generator类的子类实现的。 同样的方法,我们也可以用在这里。 只要在一个函数前面加上 async 关键字,这个函数对象是一个协程,通过isinstance函数,它确实是Coroutine类型。 from collections.abc import Coroutine async def hello(name): print(‘Hello,’, name) if __name__ == ‘__main__’: # 生成协程对象,并不会运行函数内的代码 coroutine = hello(“World”) # 检查是否是协程 Coroutine 类型 […]
Python并发编程之从生成器使用入门协程(七)
大家好,并发编程 进入第七篇。 从今天开始,我们将开始进入Python的难点,那就是协程。 为了写明白协程的知识点,我查阅了网上的很多相关资料。发现很难有一个讲得系统,讲得全面的文章,导致我们在学习的时候,往往半知半解,学完还是一脸懵逼。 学习协程的第一门课程,是要认识生成器,有了生成器的基础,才能更好地理解协程。 如果你是新手,那么你应该知道迭代器,对生成器应该是比较陌生的吧。没关系,看完这系列文章,你也能从小白成功过渡为Ptyhon高手。 再次提醒: 本系列所有的代码均在Python3下编写,也建议大家尽快投入到Python3的怀抱中来。 本文目录 可迭代、迭代器、生成器 如何运行/激活生成器 生成器的执行状态 生成器的异常处理 从生成器过渡到协程:yield . 可迭代、迭代器、生成器 初学Python的时候,对于这三货真的是傻傻分不清。甚至还认为他们是等价的。 其实,他们是不一样的。 可迭代的对象,很好理解,我们很熟悉的:字符串,list,dict,tuple,deque等 为了验证我说的,需要借助collections.abc这个模块(Python2没有),使用isinstance()来类别一个对象是否是可迭代的(Iterable),是否是迭代器(Iterator),是否是生成器(Generator)。 import collections from collections.abc import Iterable, Iterator, Generator # 字符串 astr = “XiaoMing” print(“字符串:{}”.format(astr)) print(isinstance(astr, Iterable)) print(isinstance(astr, Iterator)) print(isinstance(astr, Generator)) # 列表 alist = [21, 23, 32,19] print(“列表:{}”.format(alist)) print(isinstance(alist, Iterable)) print(isinstance(alist, Iterator)) print(isinstance(alist, Generator)) # […]
Python并发编程之消息队列补充及如何创建线程池(六)
大家好,并发编程 进入第六篇。 在第四章,讲消息通信时,我们学到了Queue消息队列的一些基本使用。昨天我在准备如何创建线程池这一章节的时候,发现对Queue消息队列的讲解有一些遗漏的知识点,而这些知识点,也并不是无关紧要的,所以在今天的章节里,我要先对Queue先做一些补充以防大家对消息队列有一些知识盲区。 再次提醒: 本系列所有的代码均在Python3下编写,也建议大家尽快投入到Python3的怀抱中来。 本文目录 消息队列的先进先出 创建多线程的两种方式 . 消息队列的先进先出 首先,要告诉大家的事,消息队列可不是只有queue.Queue这一个类,除它之外,还有queue.LifoQueue和queue.PriorityQueue这两个类。 从名字上,对于他们之间的区别,你大概也能猜到一二吧。 queue.Queue:先进先出队列 queue.LifoQueue:后进先出队列 queue.PriorityQueue:优先级队列 先来看看,我们的老朋友,queue.Queue。 所谓的先进先出(FIFO,First in First Out),就是先进入队列的消息,将优先被消费。 这和我们日常排队买菜是一样的,先排队的人肯定是先买到菜。 用代码来说明一下 import queue q = queue.Queue() for i in range(5): q.put(i) while not q.empty(): print q.get() 看看输出,符合我们先进先出的预期。存入队列的顺序是01234,被消费的顺序也是01234。 0 1 2 3 4 再来看看Queue.LifoQueue,后进先出,就是后进入消息队列的,将优先被消费。 这和我们羽毛球筒是一样的,最后放进羽毛球筒的球,会被第一个取出使用。 用代码来看下 import queue q = queue.LifoQueue() for i in range(5): […]
Python并发编程之线程中的信息隔离(五)
大家好,并发编程 进入第三篇。 上班第一天,大家应该比较忙吧。小明也是呢,所以今天的内容也很少。只要几分钟就能学完。 昨天我们说,线程与线程之间要通过消息通信来控制程序的执行。 讲完了消息通信,今天就来探讨下线程里的信息隔离是如何做到的。 大家注意: 信息隔离,这并不是官方命名的名词,也不是网上广为流传的名词。是我为了方便理解而自创的,大家知道就好咯。 本文目录 初步认识信息隔离 信息隔离的意义何在 . 初步认识信息隔离 什么是信息隔离? 比如说,咱有两个线程,线程A里的变量,和线程B里的变量值不能共享。这就是信息隔离。 你可能要说,那变量名取不一样不就好啦? 是的,如果所有的线程都不是由一个class实例化出来的同一个对象,确实是可以。这个问题我们暂且挂着,后面我再说明。 那么,如何实现信息隔离呢? 在Python中,其提供了threading.local这个类,可以很方便的控制变量的隔离,即使是同一个变量,在不同的线程中,其值也是不能共享的。 用代码来看下 from threading import local, Thread, currentThread # 定义一个local实例 local_data = local() # 在主线中,存入name这个变量 local_data.name = ‘local_data’ class MyThread(Thread): def run(self): print(“赋值前-子线程:”, currentThread(),local_data.__dict__) # 在子线程中存入name这个变量 local_data.name = self.getName() print(“赋值后-子线程:”,currentThread(), local_data.__dict__) if __name__ == ‘__main__’: print(“开始前-主线程:”,local_data.__dict__) t1 = […]