python如何改变入参的值_我与python的十年

f56d2a2336e691f35b11b39145fc7a7a.png

从08年刚接触python到现在已经十多年的光景了,始终贯穿着我的工作跟学习,不管出现再多的语言,出现再多的技术我对python总是有一种割舍不掉的感情。

刚开始接触python是因为读书的时候想找到一门与众不懂的语言,显得自己比较厉害,就是那种想在一干同学面前 嘚瑟一下,觉得我比你们厉害,你们就会php java .net 我会一种你们都没玩过的。也并没有想过这门语言有什么与众不同,也没想过它在十年后的今天能登顶语言排行榜,当时学习的时候就是windows下面玩,应该是2.7的版本,下载完之后就去搜索下如何写代码,运行,就照着网上的教程打开了python的interactive环境,那时候根本不知道什么叫交互环境,也不知道什么叫repl。就知道有个窗口能让我写代码,然后试着输入我们学语言的第一课,输出一个helloworld,然后就怯生生的在命令行入了 print(“hello world”) 哈哈里面下面就显示了 ”hello world” 觉得哎挺好啊,不用写main函数就能执行,可以啊,随后就是开始输入 1+2 这种算数表达式之类的东西,马上都能快速的给出执行结果,觉得有点意思,然后试着去写个 if(true) {print(“hello world”)}判断啥的,写完了突然发现执行不了,给我报一堆红的,马上就又去搜索了下哦 发现python的语法不是这么写的,是靠的是缩进来控制结构的不需要花括号,试着缩进了下,发现果然好用,但是突然我想改改我写的if 里面的输出 为 hello world liyang 发现没法改,一着急就把命令行环境给关了,重新打开再写。来来回回这样太累,就在想其他语言我记得都是写代码在文本里面啊,难道python只能这样运行,不应该啊。于是扒拉文档,发现哦原来python还有一种执行模式,运行脚本文件的,是可以把代码写到一个后缀为py的文件当中,然后随时可以修改它,去各种尝试自己的代码执行结果。

然后就开始了各种尝试python代码的折腾,从定义变量,还是它里面内置的数据类list/dict/tuple/queue,到学习它的控制结构 if while这些 还有异常处理 try exception else 到学习定义函数,使用内置的函数,这些个断断续续学了个把月,基本的觉得都掌握了, 就想着我学python能干嘛来着,还是网上找吧,发现python大家都说可以做爬虫,就试着找了网上一些爬虫例子,开始研究发现里面有些代码能看懂有些看不懂,不管了先拿下来跑下看看,结果黏贴下来的并不能用,主要是python的缩进问题,然后硬着头皮把缩进改好,换成自己想爬的网页,跑了一下果真网页下来了,然后就去仔细看了里面的代码,发现里面有些import 语句不懂是干嘛的,一查才知道这个是用来导入你想用的python模块,不错又学会一招,10年就开始工作了工作内容主要是用的.net当时,python也用不上。随后的一两年里面也就是10-11年的时候就是每天瞎看看python 然后找网上的例子去练,这个阶段其实更多的是熟悉python的语法查漏补缺,并没有真正把python用到实际的项目中,这期间我写了一个爬公司网站图片的爬虫,当时在做做电商业务,页面很多鞋子的照片,就想写个简单爬虫爬着玩玩,就把图片爬下来放在磁盘里,爬取得是固定网页的内容,不会整站的爬,没那种思维,这个时期的我基本上不会碰到说那种缩进出现的简单语法问题了,不过时间太久了我已经找不到我的这段代码,庆幸我找到了当时下载百度音乐的一段代码,彼时百度音乐还在。

16fd0d5e86f4164d611020984072d355.png

一晃眼到了12年了,去了一家做公司做bi分析,公司有个需求每天从固定的地方下载日志进行分析入库,我脑子一闪这玩意应该可以用python搞吧,征询了老大的同意,我就网上查资料如何使用python下载ftp文件,就去研究如何使用python去登陆ftp 切换路径 下载文件 解压文件这些操作对应的库函数等。这些都写完了,后续日志需要被一个java写得jar执行,又遇到一个问题python如何执行系统命令呢,当时脑子里想到c里面有execute的系统调用,那python里面应该也有吧,就去找 发现原来也很简单嘛。python的os模块里面的system方法就阔以嘛。于是乎整个都顺了,最后把整个调度的流程用python写了下来,这段代码我也还留着。

bf58d89c2a538da68b56da86b521600b.png

当时也没有python name convention的这种概念,就是先写出来,这中间还学会了自己定义包/模块的,不会说所有代码都写到一个文件里面,比如上面我自己定义了一个模块用于发邮件,就自己定义了一个py的package,写了个sendmail的module,再讲下 python的每个文件是一个module,多个module可以放在一个package也就是一个文件夹下,目的还是用于代码隔离,代码重用这些基本的编程概念,其他语言也都有,下面就是我写得sendmail模块下的sendhtml函数

2844236b6f79a0fa799ad8a6ba0004bf.png

当时写完这个一直跑在线上,也算是我第一个正式用于生产的python项目,还是挺开心的然后觉得学有所用。除了写脚本做一些这种任务之外,我也关注了python如何去写web程序,当时学了很有名的tornado,就按照官网文档自己瞎玩,写Hello world或者写一个表单之类的。13年还是在航班管家,突然有一天公司一个运营的小伙儿需要去注册微信公众账号,需要去搭建一个服务用于微信的验证,老大就让他找了我,接到这个任务时候我就想着直接一个服务器那python就行啊,聊明白他的需求之后,去查了微信的文档然后照着文档在服务器上面来了一个麻雀版的验证服务器,很快就让他注册成功了,这段代码我也保留着。

625873e967e6c326190de6141868b6e8.png

搞了这么三年多基本的python掌握了也算是入了门了,就去考虑把python应用到更多的地方也顺带的提升自己的python能力,促进开发。其实这个阶段我也认真的去看了一本书,中文名 python核心编程,英文名《core python programming》也就是写这篇文章的时候我还在回过头看这本书的英文版,就是下面的这本书 准备再次好好的梳理下自己的python知识,里面介绍python 的知识点很全面,配合官方的manual,你如果坚持读下来应该比我厉害。

78ab71a92d3137b663b3a77ad402c67a.png

14年的时候总觉得只是知道了python怎么简单的去用,应该好好的研究下python的复杂用法了。一般复杂的用法都会出现在优秀的开源框架里面,tornado首当其冲,我就去试着看tornado的代码,刚开始的时候真的看的一脸懵,就看懂了例子这段代码,里面根本进不去。就抱着跟学英语一样的方法,我看一遍不行 就看两遍三遍五遍,我记不住方法名 类名我就自己下来记下来。但是这种方式只能说是静态分析,真正的执行结果是怎样的静态的还是看不到具体的执行,所以就想着怎么能把python调试起来了,之前使用python都是面向log编程,但是针对大型的非自己写的代码这种方式好像行不太通,打点只能看到某一个时间点的某一个执行流,某些变量的运行值,还是比较片面。如果非要全面的看,唯有去动态调试,然后就去翻资料,原来python是提供调试的,pdb库可以做这个事情,然后就去查阅相关的使用方法,单步调试,查看堆栈,打印变量,添加断点这些都搞明白了,就顺便画了一章流程图出来。

62cc73528c93f8adefdc5861db8cbe47.png

13-15年其实都是写几百行的python脚本也就是几个文件的样子,大部分都是一些工具类的拼装代码,觉得没什么长进。然后就开始了一些python虚拟机的学习,泡社区发现了一本书,著名的《python源码剖析》而且经常逛当时很有名的我记得应该是是叫啄木鸟社区华莽用户组,当时作为一个小白就是随便瞎看,觉得里面的大神好厉害啊,比较自卑也就是默默的看大神们的帖子,如饥似渴的汲取知识,看到书就去下载,去看去记录总结,也去参加过一个python的线下的沙龙活动,当时是第一次参加沙龙活动,不太懂里面的套路,但是知道了python里面几个有名的人,具体的就说是谁了,现在都不太活跃了。

ec9312968c9f8b57077218e272dc07bf.png

e88c893a2036f922e6d0af792021023a.png

6ef7bab489b794ce7f96c38803611b5f.png

当我写这篇文章的时候这本书已经绝版多年了,搜索了下孔夫子旧书网都是200+以上的价格,足见这本书的珍贵性,我当时下载的pdf版本,看了放下,过一阵子又拿出来看反反复复,总是没有看的下去,因为功力问题,c语言基础差很多东西不太懂,例如:链表函数指针了,hash都不甚了解,但是当时也做了一些自己的总结,如上图。现在经过了这么多年的熏陶,可以手写大几百行的websocket server,自己照着rust搞一个c++ftp的客户端,手工实现hash算法,看了csapp,看了 《ruby on microcope》学习了基于stack 的virtual machine的一些知识,看起来会顺畅很多,不会觉得里面很多东西都不知道,会有那种柳暗花明又一村的感觉,所以也准备抽时间好好研习一下当年的这本好书,汲取中间的精华,也会给大家做一个自己的理解分享。

16年到18年的这几年其实并没有这几年其实并没有在python上面花费更多的功夫,因为基本的语法都已经ok了,然后对python也属于基本的需求都能很快的写出来,精力可能主要都放在了学习linux kernel 还有看csapp、uninx网络编程这一类的书籍上面,代码上面的技艺的熟悉更多是在学习如何学写c/cpp的上面了。然后这个阶段,因为之前工作需要就用python的tornado还有bottle框架写了一个公司的web服务主要用于连接es搜索,这个阶段的代码能力随着时间的迁移已经有所增强,也比较注重代码的规范性,不像刚开始的时候写出来的变量方法命名都很随意,去阅读了谷歌的python的命名规范,尽可能的去靠拢。还有就是这个阶段,英语也经过学习慢慢的喜欢去看python的官方manual了,比如我去看他的pep的一些章节有了一些不同的体会,比如讲到generator的一些设计原则比如讲到lazy computing,还是是有一些特别体会的,这里就不展开讲了,后续会单独的讲一讲,如何去看python的pep,而且也深入的理解了下python的编码问题,搞清楚了unicode类型与string类型的区别一个是存的对应字符的code point一个存的是对应的具体存储的code point对应的字节(In Python 2, the unicode type represents a real string, whereas the str type is a sequence of bytes),这里就简单的讲下,这个也是可以用整个篇幅去讲的可以推荐一篇文章去读,讲得很透彻https://nedbatchelder.com/text/unipain.html。 当然python3就不存在这种问题了,但是了解下编码很不错的啊,因为每种语言都会有编码。还有就是18-19年这两年我一直尝试写一个自己的server也就是网络编程啦,我写了两个版本,一个是异步单线程链路复用的也就是大家熟知的epoll/kqueue的一种是mutiple thread block的模式,给大家分享下我的代码截图,还没有来得及上传到github上面。

epoll:

17dcf75a0f2883be427b4d24e52ff34a.png

multiple-thread block server:

c51fe8dc67fed020d3fef0a0cc3c7351.png

关于未来怎么使用python呢 我其实还是觉得坚持去做一些python学习推广的事情,因为自己也有一定的python经验,然后也希望去运用自己学习的python去帮助后来的python开发人员少走弯路,快速的掌握到python,解决实际的工程问题。还有就是可能下一个阶段要去看一看cpython的源码了,不然总是停留在python的上层,需要去做深入的理解沉淀,我本人也比较喜欢virtual machine 的实现原理,业余时间也学了一些这方面的知识,稍后可能也会写一篇文章进行浅显总结。

写了这么多,python有什么优点呢?我个人总结啊,第一就是很容易学会,语法简洁,关键字也不多。第二就是类库很多啊,很多时候你想做一个什么功能,大部分时间不用造轮子,python都有,没有你也可以很方便的自己搞,然后提交到pip上方便别人用。第三功能强大,python不仅可以做脚本,写写小任务,也可以做http/tcp服务器(tornado/Django /twisted)也可以做数据分析挖掘(numpy),还可以做游戏(pygame),做ai这个我不太懂啊。第四使用方便,一般的macos linux自带解释器,Windows需要安装,不需要安装编辑器什么eclipse,随便一个文本编辑器就可以写,写完直接python 文件名运行。第五代码量少,不是有句俗语么人生苦短我用大蟒么,比如说你写java/c想写一个输出hello world至少得写main函数,引入库文件吧,python不用,就一行代码print(”hello world“),提供interactive模式让你快速上手,不考虑编译,找ide。

结合我这些年工作学习经历,其实我也总结出来学习一门新的语言的一些关键点。

1 好奇心:要保持好奇心,一门新的语言新的技术你学习中一定会遇到这个技术各种各样不同的技术点,要去查一查看一看这是为什么出现这个点,这个点的出现解决了哪些问题,它都适用于哪些场景。

2 实践: 我一直告诫自己编程是一门实践科学,学到这门语言的技术点,一定要寻找场景不断的练习,巩固思考,比如我上面讲的,我在工作中不断尝试使用python去解决一些问题。

3 坚持:一定要坚持,要掌握一门语言很快,但是能够一直不忘掉这门语言的技能,就是不断坚持去学习它,运用它。

4 开放:保持一个开放的心态,很多人喜欢自己玩自己high其实这是不对的,应该多去参加一些线下或者线上论坛的讨论,开阔自己的眼界,知道别人是如何学习以及如何思考问题的。

5 输出:学习过后一定要总结,不管与同事探讨,网络探讨也好,还是自己写文章记笔记,写代码也好一定要有输出,有输出你才会真正的思考,才能将所学更好的融入到记忆当中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值