Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >接触 Python 后的一点感受记录

接触 Python 后的一点感受记录

作者头像
四火
发布于 2022-07-19 06:24:01
发布于 2022-07-19 06:24:01
30300
代码可运行
举报
文章被收录于专栏:四火的唠叨四火的唠叨
运行总次数:0
代码可运行

最近因为工作的关系开始学习 Python 了。以前从不曾正儿八经地学过,如果说工作学习经验带来改变的话,那么编程语言的学习就是个很好的例子。如果在十年前,我要学习 Python 的话大概会买本系统介绍的 Python 教程,然后一页一页慢慢看,估计能够啃完大半本,跳过一些自认为次要的特性。等到在项目中使用已经得是一两个月之后了吧。但是如今我显然不太会做一样的事情,我现在会拿着我那些熟悉的编程语言来比较,不同的特性上面,Python 是怎样的,是先进还是落后,适合解决什么问题,在哪些领域可以大行其道,但在遇到哪些问题的时候事倍功半。

想起以前接触过的编程语言里,事实上有一半都不能算系统地学过,大致上只是零散地入了门,就开始在项目中使用了。自然,也不可能花很多时间琢磨透了再使用,靠的是时间和经历一点点地积累。这个世界变化太快,已经没有时间把每一步都踩扎实。这就是现实,有时候也未必是件坏事。很多人觉得大学里对编程语言的学习不值一提,因为象牙塔和工业界完全是不同的概念。但是我倒觉得,如果只考虑同等长度的时间范畴,大学里的学习经历,才是更有影响力的那一个。工作快十年了,变化的东西太多,不变的也不少——看到一群程序员聚在一起进行语言的圣战,在几年前我可能会表达 “不同的工具有不同的应用场景” 这样看起来中立而不带无脑倾向的废话。不过现在我可能什么都不会说,但是饶有兴致地驻足观看这样的圣战,有时候是骂战。

首先,拿 Python 和以前学过的语言比较来看。我觉得和 Groovy 比较接近,特别是语言的动态性。我确信它的学习曲线也是比较简单的。在 Linux 平台上作为脚本语言很容易使用,往往不需要准备什么预装什么,这和其他脚本语言比起来,便有着不可替代的优势。单纯就语言层面上,Python 和 Bash 比起来它的代码组织性更好,和 Perl 比起来则没有那么多啰嗦的语法,代码更容易理解。仅由目前所掌握的这一点点知识来看,特别喜欢其中 yield 关键字的设计,让一些本来需要反复在不同方法上下文中切换的面条代码变得清晰和优雅,这也是我在其它语言中没有见过的。

下面的内容是作为一个初学者的一点点记录,觉得 Python 中有趣的几点,以及项目中使用的一些感受。

首先,关于缩进。这大概是第一个缩进具备实际意义的编程语言了,缩进不仅仅是用于帮助理解和美观需要了。对于痛恨满天遍地括号的程序员来说,似乎是一种解脱。

Tuple。Tuple 的最直接好处是不可变,它时常也被作为容器不同格式之间转换和过渡的媒介,再一个,正因为有了 Tuple,让函数 “看起来” 具备多个返回值也就变成了可能,以前在 Scala 中也使用过。印象中传统语言里面没有这样原生的东西,比如 Java 的 final 关键字除了不可变以外并不具备 Tuple 其它的特性。

可变参数:在 Java 中可变参数其实就是一个数组的语法糖,二者本质上没有什么区别。所以可以传一个数组给变参方法,数组会被准确解析成变参;反过来转换也一样——在变参方法中,变参一拿到手就已经是一个数组了,Python 为了变参更舒服地调用而设计了展开符号——*。**则是关键字参数,和*被解析成 [] 不同的是,**被解析成 {},这个我在别的语言里面似乎没有见到类似的。如果不是说方法定义,而是说方法调用,那么它似乎和 JavaScript ECMA 6 中的…类似,可以传递若干键值对(命名参数)。

尾递归优化(Tail Recursion Elimination, TRE)。这其实可以作为语言分类上的一个重要特性,Python 不支持尾递归优化,后续有机会再单写一篇来详细谈谈。

List Comprehension。我第一次接触它是在 Haskell 里(曾经写过一点点东西涉及到它)。它让代码的简洁程度到达一个新的级别,比如下面这样的两个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[x * x for x in range(1, 100) if x % 2 == 1]
[m + n for m in123' for n in 'abc']

从 yield 到 generator。yield 这个关键字不仅仅可以让函数多次返回,虽说这已经是一个颇为有趣的事情了,我在其他语言中我没有见到过。它还可以让函数变成 generator——其中一种简单的定义方法是,如果函数定义中包含 yield,那么它就成为了一个 generator,用于不断生成结果并返回。函数是顺序执行,遇到 return 语句或者最后一行函数语句就返回。而变成 generator 的函数,在每次调用 next() 的时候执行,遇到 yield 语句返回,再次执行时从上次返回的 yield 语句处继续执行。看这个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def _odd_iter():
    n = 1
    while True:
        n = n + 2
        yield n

def m_of_three():
    iter = _odd_iter()
    while True:
        n = next(iter)
        if n%3 == 0:
            yield n

for n in m_of_three():
    if n < 100:
        print(n)
    else:
        break

例子中第一个 generator _odd_iter 用来返回从 1 开始的所有奇数,而 m_of_three 生成器用来过滤并返回其中 3 的倍数,最后一部分则是打印逻辑,打印 100 以内的结果。这个例子体现了 generator 的使用,也体现了它对无限序列的支持。

模块的灵活性和自解释能力。这也是我相当喜欢的一个特性。在 Python 中有这样的规约,一个下划线开头表示私有变量,两个下划线开头表示 Python 自身预定义的一些变量,这样的规约即保留了违背规约访问和使用这些变量的灵活性,也提供了很多预定义变量的可能。其中一个是模块的__init__.py,类似于 Java 的 package.java,但是提供了更多的特性,用以模块的自解释,比如标准注释、依赖、编码、文档注释和立即执行的 main 方法等等。

而实际开发的时候,借助 pip 和 virtualenv,可以说依赖和环境准备比多数语言都简单多了。

最后是 decorator,这个其实最早我实在 Groovy 中见到的,现在很多语言都支持注解,但是原生来看似乎 Python 是使用它支持特性最丰富的,这里不展开了。

在新的团队中,我们的项目比较特别,大部分的服务端代码都是用 Python 写的。我可以看到 Python 在开发效率上和环境搭建上的优势,从开发、测试、部署到调试,Python 都很易于使用,Linux 和命令行亲和力高,不需要很多额外的工具。总体来说,这一点在快速开发的场景下很吸引人。另一方面,Python 灵活和强调规约的特性,以及提供的元编程上丰富的支持,我以及好多次感到,在写代码的时候,可以用很简洁的代码,写出看起来有点复杂的特性。现在我接触的 Python 开源库还不多,随着学习的深入后续再慢慢研究和记录,但是有了 pip 等等通用的统一的包管理工具,这一切看起来似乎要比传统的 Java 和 C++要简单很多。

不过,Python 代码容易产生的问题不可谓不少。老实说,随着代码规模的增加,我更倾向于一个约束更强,类型系统严谨并且代码代码模板清楚统一的编程语言。Python 有些 “太过灵活”,无论是易读性还是分层/模块化,我都看到代码中有很多需要改善的地方。最常见的一个模式是,用 Python 写一堆有关联的类和方法,放在一个 py 文件里面,在开始的时候很不错,也避免了过度臃肿的类文件,但是很快,随着代码规模的增加,这个文件需要不断被拆分和重构,但是重构这件事情却不是那么容易推动的。程序员都知道,当我们说 “未来再扩展” 或者 “以后再改进” 的时候,这件事情多半是不会发生了——于是代码过度耦合就变成了一个问题。以往使用 Java 写代码的时候,项目组仿佛有约定俗成的理念,无论是分层还是类文件设计,往往在开始的时候都显得有些 “过度”,多层次的包、类设计,看起来似乎有些臃肿,但是随着代码规模的增加,好处就体现出来了,代码的单一职责这一要求维护得明显更好,在做某些修改的时候,需要评估的调查范围就小,代码修改也更清楚和易于评审者理解,修改者心里也更有谱。

显然这不能说孰好孰坏的问题,但是我对 Python 在中大规模项目(50 万行+)上的使用是有疑虑的。当然也许随着经验的积累我会有不同的看法。

文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接 《四火的唠叨》

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
记录我的Python学习笔记
不想再像以前那样,什么都从头开始学习语法、总结语法,这样反而会过分纠结于语法,耽误了开发,毕竟语言的主要属性是工具,次要的属性是语言本身。
py3study
2020/01/08
8250
Python学习笔记(三)·高级特性
掌握了 Python 的数据类型、语句和函数,基本上就可以编写出很多有用的程序了。
公爵
2022/09/28
6900
Python学习笔记(三)·高级特性
python学习笔记
原因:2017年2月4日 星期六 随笔记录。 说明:本文主要记录学习python的过程,需求不大,轻度使用,所以进行简单的认识性学习。 状态:Updating to 2.14
ZHaos
2019/02/27
2.8K0
Python进阶笔记
列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。一般是利用原有的数据结构来生成新的列表。
py3study
2020/01/03
1.1K0
20分钟搞定Python 函数基础知识
简单地说,一个函数就是一组Python语句的组合,它们可以在程序中运行一次或多次运行。Python中的函数在其他语言中也叫做过程或子例程,那么这些被包装起来的语句通过一个函数名称来调用。
一墨编程学习
2018/12/13
6900
Python学习 Day 4 函数 切片 迭代 列表生成式 生成器
TypeError: my_abs() takes exactly 1argument (2 given)#参数个数不对
Ai学习的老章
2019/04/10
4110
7-函数
当存在多个默认参数的时候,调用的时候,既可以按顺序提供默认参数,比如调用enroll('Bob', 'M', 7),意思是,除了name,gender这两个参数外,最后1个参数应用在参数age上,city参数由于没有提供,仍然使用默认值。
用户3106371
2019/03/11
7720
7-函数
Python基础(一)
以#开头的语句是注释,解释器会忽略掉注释。其他每一行都是一个语句,当语句以冒号:结尾时,缩进的语句视为代码块。
haifeiWu
2018/09/11
6840
Python基础(一)
由于煮波已经学过了C和C++,而且了解过java的语法,已经建立了语言的整体框架,所以学习python语法就不像学C++一样系统的一点一点的学习了,学习python语法,我就根据日常代码中遇到的或者是从C++代码中想到了在python中应该是什么场景来探讨python的相应知识;
啊QQQQQ
2025/04/10
420
从素数生成看Haskell的简洁性
最近有空就在看Haskell,真是越看越觉得这个语言有意思。在知乎(原回答@阅千人而惜知己的)找到了一份很有意思的求素数代码,非常简洁,我觉得很能体现这个语言的特点。
KAAAsS
2022/01/14
4230
懂一点Python系列——快速入门
Python 英文原意为 “蟒蛇”,直到 1989 年荷兰人 Guido van Rossum (简称 Guido)发明了一种 面向对象 的 解释型 编程语言,并将其命名为 Python,才赋予了它表示一门编程语言的含义。
我没有三颗心脏
2020/03/26
5490
python 函数式编程 filter
和map()类似,filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。
葫芦
2019/04/17
5070
Python学习笔记 面向对象编程
乐百川
2018/01/08
8050
一文搞懂 Python 中的 yield
yield 可以实现生成器,可以实现协程。什么是生成器,什么是协程,如果还不了解,可以继续往下看,概念可以不懂,只要理解它的作用和效果也是可以的。
somenzz
2020/11/25
7970
Python入门知识点汇总
Python的设计目标之一是让代码具备高度的可阅读性。它设计时尽量使用其它语言经常使用的标点符号和英文单字,让代码看起来整洁美观。它不像其他的静态语言如C、Pascal那样需要重复书写声明语句,也不像它们的语法那样经常有特殊情况和意外。
py3study
2020/01/15
1.1K0
[Python] 函数基本
使用def 函数名(): 来定义一个函数,函数体一缩进块的形式写,返回结果是return xx
唯一Chat
2019/09/10
4230
对Python老司机99%有帮助的简明语法总结乱编
本文由马哥教育Python实战开发班6期学员推荐,转载自互联网,作者为赖笔小新,感谢作者的辛苦付出和贡献。 最近发现进入python群的朋友都在你是如何自学python语法的,每当被问到这个问题时,我内心是坦荡的,因为我不知道到底我接下来说的这些话会给看到的各位带来什么? 虽然大家已经对Python已经有了一个初步认识 了,但是我还不得不说关于Python语法的一些事,以便于我这个装逼的过程顺利的完成。 ————!!! 只针对有经验开发人员 ---- 简单输入输出 ---- 输出 print 10
小小科
2018/05/03
1.4K0
对Python老司机99%有帮助的简明语法总结乱编
Python教程第5章 | Python迭代器和生成器
比如在 Java 中,我们通过 List 集合的下标来遍历 List 集合中的元素,在 Python 中,给定一个 list 或 tuple,我们可以通过 for 循环来遍历这个 list 或 tuple ,这种遍历就是迭代。
仲君Johnny
2024/01/24
2550
Python教程第5章 | Python迭代器和生成器
【AICAMP —— Python】入门系列!(3. Python函数编程)
Python与其它编程语言一样,可以直接调用我们写好的函数,或者已经实现的函数。如我们可以使用系统自带的函数,求一个数的绝对值,使用abs函数,对其传入参数,得到输出。
灿视学长
2021/05/28
5250
【Python环境】如何使用正确的姿势进行高效Python函数式编程?
关于函数式编程 有哪些函数式语言? 其实函数是语言很早就出现了,上世纪30年代出现的Lambda和50年代的LISP,比面向过程和对象的语言出现的更早,现代的Clojure,Erlang,Haskee
陆勤_数据人网
2018/02/26
1.6K0
【Python环境】如何使用正确的姿势进行高效Python函数式编程?
相关推荐
记录我的Python学习笔记
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验