IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

标签:Python

共 183 篇相关文章

IT 累计浏览 2,683

Python修饰器的函数式编程

这篇文章从Python装饰器的英文名“Decorator”切入,厘清了它与面向对象设计模式中的装饰器模式以及Java/C#注解的本质区别。作者指出,OO的装饰器模式往往陷入复杂的类层次,而Python的装饰器则是一种优雅的函数式编程技巧,它直接利用了语言层面的高阶函数和闭包,无需引入额外的复杂概念。 文章从一个经典的“Hello World”示例出发,展示了装饰器如何通过闭包和函数回调实现功能增强。接着,它深入解析了`@decorator`语法糖的实质:`func = decorator(func)`,这是一个函数作为参数传入另一个函数并被其返回值替换的过程。理解了这一点,无论是多层装饰器嵌套还是带参数的装饰器(需要返回一个真正的装饰器函数),都变得清晰自然。文中那个用装饰器为字符串添加HTML标签的例子,很好地体现了这种技巧的简洁与灵活。 最后,文章还提到了用类来实现装饰器的方式,通过`__init__`和`__call__`方法来完成同样的功能。整篇文章将Python装饰器从语法糖还原为函数编程的基本范式,帮助读者理解其“描述意图而非实现过程”的优雅本质。

IT 累计浏览 2,029

Python语言的创始人解释为什么Python数组的索引从0开始

Python的创始人自己解释了,为什么Python选择从0开始索引数组,而不是像一些语言那样从1开始。 这个问题源于Twitter上的一次提问。他回顾了对Python有重要影响的几种语言:ABC语言(Python的祖先)使用1-based索引,而C语言使用0-based索引。他自己最早接触的语言如Algol和Fortran等则各有不同。 最终决定采用0-based索引的关键原因,是Python切片语法的优雅性。在0-based索引下,`a[:n]`可以清晰地表示“取前n个元素”,`a[i:i+n]`表示“从第i位开始取n个元素”。而在1-based索引下,要表达同样的“取n个元素”操作,就需要繁琐地写成`a[i:i+n-1]`,或者改用不直观的`起始索引+长度`的表达方式。 这种设计还带来了一个巨大的好处:当进行连续切片时,索引能够自然衔接。例如,要将数组在`i`和`j`两处分割成三部分,可以非常优雅地写为`a[:i]`、`a[i:j]`和`a[j:]`。切片的终点恰好是下一段的起点,无需做任何调整。 这种对语法简洁性的追求,深刻影响了Python日常编码的体验,让数组和列表的操作直观而富有美感。

IT 累计浏览 4,205

用TAB缩进, 用SPACE对齐

这篇讨论聚焦于一个经典争议:编程时到底该用TAB键还是空格键来缩进?作者没有简单地站队,而是提出了一个清晰且实用的区分原则。 他指出,大部分情况下TAB和空格都能正常工作,但关键在于用途。对于代码的**缩进**,即行首的空白,TAB是更优解——只需按一次键就能统一缩进层级,避免了数空格的麻烦,也终结了“用两个空格还是四个”的无谓争论。 然而,文章真正的点睛之笔在于强调“对齐”的场景。为了代码的竖直对齐(比如让等号、注释在列上整齐),**必须使用空格**。作者展示了一段代码,清晰地说明了空格在此处的不可替代性,而这与缩进是两码事。 因此,文章最终给出了一个干脆利落的结论:**用TAB缩进,用SPACE对齐**。这相当于为TAB和空格找到了各自最合适的岗位,各司其职,既提升了编写效率,又保证了代码在需要精确对齐时的美观与可读性。对于被这个小问题困扰过的开发者,这篇文章提供了一个清晰的操作指南。

IT 累计浏览 8,088

学你妹的计算机!

这篇带着情绪的吐槽,实际上指向了一个现实问题:计算机专业的学习与就业市场之间是否存在落差?作者从一则引发讨论的新闻事件出发,汇集了知乎回答、媒体报道和微博信息等多方声音,勾勒出当时部分从业者和学习者的迷茫与自嘲心态。 文章没有进行严谨的数据分析或行业调研,而是通过情绪化的标题和直接引用来传递一种集体感受——对“学计算机”价值的困惑,以及面对就业压力的无奈调侃。这种自嘲背后,其实隐含着对技术学习路径和行业前景的深层思考。 它更像是一次情绪共鸣的记录,而非技术探讨,但恰恰因此真实地反映了特定时期技术社群内的一种普遍心态。对于经历过或正在经历类似阶段的读者来说,或许能从中看到自己或同行的影子。

IT 累计浏览 7,269

Python程序的执行原理

这篇讲的是Python代码从源文件到运行背后的核心机制——字节码与虚拟机如何协同工作。文章从最简单的“Python先把代码编译成字节码”这一概述出发,层层深入,带我们看清了执行过程的每个关键环节。 作者详细拆解了字节码在Python内部的具体形态——PyCodeObject对象,并剖析了其结构体定义,如co_code、co_consts等字段如何承载代码信息。对于开发者日常可能遇到的.pyc文件,文章也理清了它的生成时机(模块import时)与Python的加载更新策略,解开了不少常见疑惑。 文章的精彩之处在于将理论落地到可操作的层面。它展示了如何利用内置的compile函数和dis模块,去实际“解剖”一段代码对应的字节码指令序列,让抽象概念变得可视、可调试。最后,文章将视角拉升到虚拟机执行层面,通过类比X86的栈帧,讲解了Python如何通过PyFrameObject管理函数调用和作用域,完整模拟了一个程序的运行世界。 整篇文章就像一份精心绘制的内部结构蓝图,不仅告诉你Python“怎么做”,更展示了它是“如何做到”的,非常适合希望突破语法层面、理解Python执行本质的开发者。

IT 累计浏览 3,686

进程管理器supervisor的使用(django实例)

这篇讲的是用Supervisor管理多个Django进程的具体实践。作者从Python生产环境中常见的进程管理需求出发,介绍了Supervisor这个由Python实现的工具。 在典型的部署场景里,通常需要用Supervisor同时启动多个Django或Tornado应用,让它们监听不同端口,再由前端的Nginx进行反向代理。文章以Ubuntu环境为例,详细演示了从创建Python虚拟环境、安装Supervisor,到编写配置文件的完整过程。 配置是关键,作者分享了几个核心点:通过`numprocs`参数指定启动的进程数,结合`process_num`变量动态分配不同端口;特别提到了配置Unix socket文件时,权限设置需使用`sockchown`而非`chown`的坑。最终的目标是让一个名为“sayhello”的Django项目成功运行在8000和8001两个端口上。 文章也坦诚地提到,对于这种架构是否算负载均衡,作者尚未深入研究,展现了实践中边做边学的真实状态。整体而言,这是一篇聚焦于具体配置和常见陷阱的实用向导。

IT 累计浏览 3,925

关于进程监控及自动启动

作者从自己将uWSGI更换为Gunicorn的实际经验出发,系统梳理了三种服务器进程监控与自动重启的方法。文章并非纸上谈兵,而是结合了腾讯内部实践与个人小团队部署的考量。 第一种方法是按进程名监控,实现简单直接。作者用Python脚本示例了如何通过`ps`和`grep`检测进程是否存在,并指出了其弊端:比如Gunicorn启动后进程名可能变为`master: [wsgi:app]`,其中的方括号需要转义,实际操作并不舒服。 第二种是按端口监控,作者认为这反而更为靠谱。同样附上了Python代码示例,通过尝试绑定目标端口来判断服务是否存活。作者也讨论了更深入的“黑盒”式连接监控(如模拟HTTP请求),但认为这更偏向监控宝一类的外部服务方案。 第三种方案则是借助Supervisor等外部管理工具。作者比较了Gunicorn文档中提及的Gaffer和更成熟的Supervisor,后者提供Web界面和用户验证,管理便捷。但代价是失去了直接使用`restart.sh`脚本的灵活性,需要适应其特定的命令。文章最终提供了一个Supervisor配置Gunicorn的示例配置片段,并开源了相关监控代码。整体上,作者为不同场景下的运维监控提供了具体可参考的实现对比。

IT 累计浏览 2,927

学习搭建Python2.7.5环境

作者从写PHP多年有些厌倦、想转学Python的角度出发,分享了在CentOS系统上从零搭建Python 2.7.5开发环境的全过程。文章并非枯燥的步骤罗列,而是带着个人学习动机,清晰地讲解了从下载源码、编译安装,到配置包管理工具和隔离环境的一套完整实践。 文中特别指出,原先流行的setuptools已被distribute取代,easy_install也被pip取代,并给出了具体的安装命令。核心环节是介绍virtualenv这个必备工具——它允许创建完全隔离的Python环境,避免不同项目间的依赖冲突。作者也演示了如何创建、激活和退出环境。 文章最后提醒,使用virtualenv管理多环境时,脚本里应使用`#!/usr/bin/env python`而非绝对路径以增强通用性,并推荐了pyenv等工具来管理不同Python版本。结尾以幽默的口吻表达了对“3P伟业”的憧憬,让技术分享多了几分生动。

IT 累计浏览 7,592

Yupoo(又拍网)的系统架构

这篇讲的是国内最大图片服务商Yupoo又拍网的系统架构。文章没有空谈理论,而是直接列出其生产环境中使用到的具体技术栈,为读者提供了一个真实、可参考的大型互联网服务构建蓝图。 核心方案体现在对开源软件的组合运用上。操作系统层采用CentOS、Ubuntu等,服务器由Nginx、Apache、Squid共同处理请求;数据存储与缓存依赖MySQL、Memcached、Redis乃至Riak等多种方案;业务逻辑则由PHP、Python、Erlang等多语言实现。值得注意的是,其架构中还包含了Hadoop、Mogilefs用于分布式存储与计算,RabbitMQ处理消息队列,以及完善的监控(Nagios、Cacti)和任务管理(Redmine)体系。 这种“搭积木”式的架构,其效果在于通过成熟开源组件的高效组合,支撑起海量图片的上传、处理、存储与分发需求。对于技术团队而言,这份清单的价值在于它展示了一个经过实践验证的技术选型思路,而非单一工具的介绍。

IT 累计浏览 5,168

如何计算两个文档的相似度(二)

这篇系列文章的第二部分聚焦于gensim的实战上手。作者从安装这个看似简单的步骤切入,详细记录了在Ubuntu和Mac OS上配置gensim及其依赖库NumPy、SciPy时遇到的典型问题——比如Mac上因缺失Fortran编译器导致的SciPy安装失败,并给出了解决方案(通过Homebrew安装gfortran),这对国内开发者很有参考价值。 在核心的使用演示部分,文章没有照搬官方教程,而是另辟蹊径,使用了“Latent Semantic Indexing (LSI) A Fast Track Tutorial”中的三个简短英文文档作为案例。整个流程清晰展示了从文本预处理(小写化)、构建词袋字典、生成文档向量,到训练TF-IDF模型,最终通过LSI(潜在语义分析)将文档映射到二维主题空间的全过程。作者特别指出了gensim在计算IDF时未对出现频率为100%的词(如介词a, in, of)进行平滑处理导致其权重为零的现象,并以此反向论证了TF-IDF算法在过滤停用词上的有效性。 通过这个从安装到模型输出的完整闭环,文章为读者提供了一份可复现的gensim入门实践指南,为后续在“课程图谱”上的应用打下了基础。

IT 累计浏览 6,708

如何计算两个文档的相似度(一)

作者在构建“课程图谱”网站时,面临课程推荐系统冷启动的难题:缺乏用户行为数据,人工标注标签又耗时。一个可行的思路是直接利用课程文本内容计算相似度,而作者最终选择了基于主题模型的自动化方案。 核心工具是强大的Python库gensim,文章以LSI(浅层语义索引)模型为例,展示了如何将两篇文档映射到主题维度,进而计算其语义相似度。作者用不到百行的代码便实现了这一流程,并给出了以Andrew Ng《机器学习》课为示例的推荐效果图。文章还规划了进一步优化:利用全量英文维基百科语料,在普通笔记本电脑上训练更复杂的LSI和LDA模型,以提升相似度计算效果。 文章整体脉络清晰,分为三个部分:先简要铺垫TF-IDF、SVD等基础知识点并提供参考资料;再详解gensim的安装与具体实现;最后探讨在大规模语料上训练模型的应用。作者并非平铺直叙,而是从实际项目需求出发,分享了从选型到落地的完整思考与实践。

IT 累计浏览 3,024

创业,你真的准备好了吗?

这篇文章从两位创业者的亲身经历出发,探讨了创业的本质与准备。作者“道哥”首先以自己早年运营一个安全论坛的经历为例,指出创业更像一种“感觉”——当你的产品虽不完美,却挡不住用户的热情时,你可能就走在了正确的路上。他后悔没有将那个社区坚持做下去,但也从后续的用户反馈中体会到了创造价值的满足感。 随后,文章引入了创业者周伟的分享。他结合自己创办天勤考研社区和高分笔记三年来的起伏,详细描述了创业者光鲜背后必须承受的孤独、委屈与磨难。周伟以自己曾遭竞品人身攻击、却最终凭借坚持获得成功的案例,强调了不放弃的重要性。他进而提出了创业者需要自省的三个问题:你是否容易放弃?执行力是否够强?创业目的是什么? 此外,文章还提炼了几个关键心得:你的产品需要构建让用户离不开的“护城河”;资源整合能力比个人能力更重要;以及领导者应学会放权,以从容心态解决问题。最后,作者呼吁创业者写下错误而非辉煌,以持续成长。

IT 累计浏览 11,015

使用python/casperjs编写终极爬虫-客户端App的抓取

这篇讲的是在JavaScript动态渲染盛行的今天,如何有效抓取那些传统爬虫无能为力的“客户端App”型网页。作者以自动化获取Google Adwords关键词搜索量为实际案例,详细对比了两种实现路径。 文章首先回顾了经典的Selenium WebDriver方案。它像一位稳重的老兵,功能全面,能操控真实浏览器。作者分享了在无图形界面的服务器上配置它的技巧,并演示了如何通过分析页面结构、模拟登录、处理动态等待(如`implicitly_wait`)来一步步完成任务,最后用XPath提取出结果。方案虽可靠,但步骤相对繁琐。 随后,作者转向更现代的JavaScript Headless方案,重点介绍了CasperJS(基于PhantomJS)。这条路子轻快灵活,执行速度可达Selenium的三倍,代码也更直观——可以直接在浏览器控制台逻辑下编写。作者用它演示了几乎相同的功能,但指出CasperJS在进程间通信(IPC)方面存在局限。 最终,文章提供了一个完整的CasperJS爬虫脚本示例,读者替换账号即可运行。对于需要应对复杂JavaScript渲染的爬虫场景,这篇文章提供了从传统到现代的清晰路线图和实用代码。

IT 累计浏览 4,788

为什么编码规范里要求每行代码不超过80个字符的限制是合理的

这篇探讨了Python编码规范PEP8中备受争议的“每行不超过80字符”限制。作者从实际编码体验出发,为这个看似过时的规定做了辩护。他认为,尽管我们早已摆脱VT100终端的小屏幕,但坚持这个限制能让代码更紧凑、可读性更强。 文章指出,Python语句本身通常只占35到60个字符,过长的行会破坏视觉平衡。通过合理的换行与空格,开发者能更直观地控制嵌套深度——这正是Python代码清晰度的关键。作者对比了两个函数示例:一个行宽无限制,需要横向滚动;另一个遵守80字符规范,结构一目了然。这种“约束”反而促进了代码的整洁。 另一个现实好处是屏幕空间的高效利用。当你在并排对比多个文件或函数时,80字符的宽度能确保所有内容都清晰地呈现在眼前,无需反复调整编辑器或担心自动换行干扰。即便在使用Django等框架时(其方法链调用很长),作者也坚持这一原则,以保证核心逻辑的可读性。 最终,作者强调,这条规范的本质是督促程序员将代码可读性置于首位。它不仅是历史遗留,更是一种有助于写出清晰、紧凑且易于团队协作的代码的实践哲学。

IT 累计浏览 16,691

Chrome和goagent的配置方法,你懂的

这篇教程详细讲解了如何利用Google App Engine与GoAgent,在Chrome浏览器中搭建一个自主可控的代理环境。文章从注册GAE账号、创建应用讲起,一步步指导读者下载并配置GoAgent客户端,包括修改proxy.ini配置文件、运行上传脚本将服务端部署到GAE。 在客户端设置部分,教程重点介绍了Chrome插件Proxy SwitchySharp的安装与配置,特别是通过导入预设的配置文件,并立即更新自动代理规则列表,来简化后续的使用。整个过程配有截图,步骤清晰。最终,作者指出当SwitchySharp运行在自动切换模式且GoAgent客户端启动后,配置即告完成。这为需要管理自身网络访问规则的技术用户提供了一个具体的、可复现的操作方案。

IT 累计浏览 11,456

加州求职记

这篇讲的是一位国内互联网工程师放弃稳定工作,决心通过H1B签证赴美求职,最终却在Google、Amazon、Facebook三家巨头的面试中折戟的全过程复盘。 作者在百度工作四年多,曾带过技术团队并出版译作,离职时信心十足。然而,他很快发现,湾区科技公司的面试核心是扎实的编码能力,要求写出可直接运行的零Bug代码。他坦承自己算法基础薄弱,并非ACM科班出身,最大的失误在于因自满而没有尽早研究目标公司的面试特点,也未及时用最有效的方法弥补短板。 文中详细对比了CareerCup、ZOJ、TopCoder、LeetCode等平台的优劣,指出LeetCode结合了真题与在线评判系统的优点,其难度与实际面试最为接近,是他后期最有效的训练工具。在英语沟通方面,他也分享了通过“自言自语”进行模拟技术讲解的独特练习法。 尽管最终未能成功,但这段经历涵盖了首次英语面试、办理签证等多个“第一次”。作者以诚恳的态度记录下从盲目自信到反思自身不足的心路历程,为同样计划“肉身翻墙”的同行者提供了一份极具参考价值的实战教训与准备路线图。

IT 累计浏览 4,685

VIM插件管理及python开发环境配置

这是一篇作者在公司内部做的技术分享,核心是解决新手面对VIM时无从下手、Python开发环境配置繁琐的痛点。文章没有停留在理论层面,而是直接提供了一套经过实践检验的“抄作业”方案。 作者首先建议备份原有配置,然后详细展示了自己的.vimrc文件配置过程。关键点在于使用Vundle这个插件管理器,通过几行命令即可自动安装和管理如jedi-vim(Python智能补全)、nerdtree(文件树)、ctrlp(模糊文件搜索)等一系列提升编码效率的必备插件。配置中还包含了实用的基本设置,比如用空格代替Tab、配置状态栏显示Git和语法检查状态等。 这套方案的目的很明确:让开发者能快速跳过繁琐的“造轮子”阶段,获得一个开箱即用的高效开发环境。对于希望利用VIM进行Python开发,但又被初始配置劝退的读者来说,这份可直接复用的配置清单和配套PPT提供了清晰的行动路径。

IT 累计浏览 5,365

Sentry: 错误日志集中管理

这篇讲的是如何用Sentry搭建一个集中式的错误日志管理系统。Sentry本身是一个Python编写的开源项目,它能捕获程序运行中的错误详情,并提供一个清晰的Web界面进行查看和分析,支持Python、PHP、Ruby、iOS等多种语言。 文章的核心是手把手介绍如何部署和使用。作者从安装开始讲起,用`pip install sentry`即可启动安装流程,但也提到了实际过程中可能遇到依赖问题,比如Django版本不匹配,可能需要手动处理依赖或使用virtualenv来隔离环境。配置部分展示了如何生成配置文件并调整启动参数,例如设置为daemon模式后台运行。 配置完成后,只需一条`sentry start`命令就能启动服务。文章还以Django项目为例,说明了客户端如何集成——通过安装raven客户端并在配置中加入Sentry的DSN密钥,就能自动将应用异常上报到服务器。对于不想自建服务器的用户,作者也提及可以考虑使用Sentry的官方托管服务。 整个过程体现了Sentry的价值:把分散在各处的错误“一站式”管理起来,降低排查成本。对于团队协作和运维监控来说,是一个很实用的基础设施。

IT 累计浏览 2,984

程序员新年计划

作者从同事一篇关于新年计划的文章受到启发,结合自己近20年的开发经验,提出了几项对程序员职业发展切实可行的反思性目标。 他认为,职业生涯中应避免成为“最聪明的人”,因为那意味着无人可问。为此,他倡导双向的指导关系:一方面主动寻找并请教你尊敬的导师,无论是圈内专家还是圈外长者;另一方面,也应成为他人的导师,通过倾听和陪伴,在对方需要时提供方向指引。 在代码层面,他回归了经典原则。首先是KISS——坚持“保持简单”,因为维护代码的时间远多于编写,故而应花时间重构,让代码短小易读、可被接手。其次是RTFM——认真阅读需求文档,这是项目知识的基石,与其盲目开干,不如多与需求提出者沟通。最后是DRY——杜绝重复,提醒我们不要在多个项目中复制粘贴同一段代码,这无异于为未来埋雷,应善用工具将重复片段重构为方法。 这篇文章并非技术清单,而更像一次职业心态的梳理,提醒程序员们在编码之外,关注协作、沟通与代码的长期生命力。

IT 累计浏览 2,865

豆瓣社区产品简析

这篇讲的是豆瓣如何构建一个以兴趣为纽带的社区。作者将豆瓣的整个生态抽象成一个框架来分析,核心是“成员”、“兴趣”和“圈子”这三个元素的互动。 文章指出,豆瓣的定位是根据用户口味推荐“东西”(包括书影音、小组乃至用户自身),其基础设计是“去中心化”和尊重个体。在这个框架里,成员是绝对中心,拥有强个性;兴趣则是成员与“东西”之间产生的、带有强烈个人色彩的关联,这是连接成员与公共空间的第一条、也是最关键的纽带。它奠定了豆瓣文艺、纯粹的基因。 进一步地,圈子(如小组)则构成了第二条纽带,它通过强共性和成员间的直接互动,将个体关系沉淀和强化。作者通过剖析兴趣的“强个性、强依赖”与圈子的“强依赖、强共性”的本质区别,揭示了豆瓣社区产品背后的核心产品哲学:一切产品都服务于这两条纽带构建的社区关系。这种分析提供了一个清晰的视角,来理解这个看似复杂的产品矩阵。