前言
其实之前断断续续有写过一些笔记发表在cnblog,但因为当时学习不够深入,理解有些偏颇,所以重新整理。
最近因为某些原因开始学习Python,想想我也是个差不多有十年的老程序员了,在大学是学习了C++和JAVA,工作中主要是PHP和Javascript,现在又开始学习Python,也是别有一番唏嘘。
不过如果你有其它编程语言的经验,学一门新的语言不免会多一些对比和感悟,所以我打算开一个Python学习笔记系列,记录一下这些感悟,只能说在学习的路上与诸多码农同道一起共勉。
学习资料的话目前手头有4个:
:面向零基础对编程感兴趣的人群编写的科普入门教程,大略看了一下前几章,怎么说呢,对科普还是很不错的,但刨除严谨枯燥的编程基础概念的同时也意味着根基不牢,有点像吸心大法,我之前有接触过北大青鸟培训出生的外派员工,就有此类问题。
:字如其名,内容简明到离谱,直接就是几句话外加代码,如果有其它编程语言基础,可以快速上手,但也缺点明显,就算跟着过一遍代码也是半懂不懂,甚至有几处解释的还有问题。
:https://www.runoob.com/出的Python教程,这个网站的教程和w3school极为类似,在不罗嗦的情况下尽量做到详尽,但缺点是不成体系,更像是一本分门别类的参考资料而非完整教程。
《Head first Python (第二版)》:实体书,价格50左右,本来是去买第一版的,看到新出了第二版,内容全面面向Python3,果断入手。Head first系列品质保证,如果有编程经验,这本书作为Python入门书还是相当不错的。
《Fluent Python》,中文名称《流畅的Python》,巴西一位专心于Python教学工作的大佬所著,非常不错的Python进阶读物,此书有点厚,600页左右,内容也极为丰富,有难度,阅读起来需要耐心。
好了,废话不多说了,直接进入主题。
变量、常量和对象
几乎所有的编程语言中,变量、常量和对象都是基石一般的存在,毕竟编程的本质就是处理数据,而所有的数据都可以用这三种来包括,最多再提供一些编程语言内部封装的容器,但那也可以算作是对象的扩展。
不仅如此,在很多语言中他们的关系也是一种递进的方式存在,比如在学习过程中我们要先理解何为常量,编译器读取常量后又要怎么申请变量来存放,而变量又是如何像搭积木一样组成一个对象。不严谨的说,无论是学习过程还是组织方式,他们都是一种递进的关系。
但这一切,在你接触到Python之后都会感到怪异,感到一头雾水。
这里举个例子:
a = 1
b = 1
print(id(1))
print(id(a))
print(id(b))
help(id)
# 2404179011888
# 2404179011888
# 2404179011888
# Help on built-in function id in module builtins:
# id(obj, /)
# Return the identity of an object.
# This is guaranteed to be unique among simultaneously existing objects.
# (CPython uses the object's memory address.)
help()
的作用可以让python解析器输出帮助文档,从帮助文档我们可以看出,id()
的作用是提供一个对目前程序中存在的对象进行区分的唯一标识符。
这就很有意思了,这说明两个问题:
-
代码中
1
这个在别的编程语言中被认为是整形常量的存在居然是一个对象,而a和b通常被认为是int型变量也同样是对象。 -
这3个对象是同一个对象,他们有着同样的对象标识符
id()
。
对,Python中就是如此,常量?不存在的,任何常量从出现在代码中的时候就意味着他们会被解释器创建为对象,而接受它们赋值的变量只不过是类似对象引用或者指针的存在,他们只是指向了一个新创建的对象。
而之所以很多人不理解这一点,也没觉得这有什么问题,究其原因只不过是因为这些"常量对象"有点特殊:它们不能被改变。而不能被改变就意味着你根本不用担心你接受的是一个引用还是一个内容拷贝,因为它们在表现形式上是一致的,没有区别,比如:
a = 1
b = a
b = 2
print(a)
print(b)
a = [1, 2, 3]
b = a
b[0] = 2
print(a)
print(b)
# 1
# 2
# [2, 2, 3]
# [2, 2, 3]
可以看到,对于整型来说,b无论赋值成什么,都不会影响a,因为b只是指向了一个新的"整型对象"而已。但是对列表,这种类似于其它语言中的数组来说就变得不一样了,b改变后a同样改变,因为它们指向的是同一个列表对象。
类似的还有类与函数,在Python中,所有的一切:常量、变量、函数、类统统都是对象。
那么问题来了,这到底是一种怎样的语言?
Python是一种什么样的语言
目前我们对高级语言的分类基本上有两种分类方法:
-
编译型语言、解释型语言
-
面向对象语言、面向过程语言
比如JAVA,是面向对象的编译型语言,PHP是面向对象的解释型语言,C++就有些争议,一部分原因是C的遗毒。
但说到Python,它无疑是一个解释型语言,无需编译,但是,它是面向对象语言吗?
似乎又不是,毕竟它的写法相当随意,并非像JAVA那样强制要求所有代码都要封装在类中。
但我们又很难说它不是,毕竟它对待数据相当特别,所有的东西都是对象,在这点上比JAVA还激进。
我觉得《Head first Python》对其定义的相当准确:这是一门基于对象的语言。
好了,以上就是我对Python这么奇特语言的整体认识,如果想更多了解,可以等我的后续笔记,也可以自行阅读上边提到的参考资料。
如果想了解如何安装Python本体和开发环境,可以阅读我这篇blog。
运算符差异
这部分之前的笔记漏说了。除了前边提到的Python的一些特性外,Python在运算符上和其它语言也有一些小差别,如果你是其它语言转过来的开发者,很容易在一开始手滑犯错,这里把一些常见的运算符差异用表格对比的形式列出:
操作 | JAVA | Python |
---|---|---|
逻辑或 | a == 1 || a == 2 | a == 1 or a == 2 |
逻辑与 | a == 1 && a == 2 | a == 1 and a == 2 |
否定 | ! (a==1) | not (a==1) |
自增 | a++ | a+=1 |
自减 | a-- | a-=1 |
如上边列出的,Python中并没有自增和自减运算符,这点只能慢慢习惯了。
如果后续还有其它运算符差异,这里会持续更新。
无论是零基础还是从其他语言转过来的,都强烈建议阅读,这是Python语言的官方编写规范,这里提供的是我翻译的中英对照版本,如果想阅读原文,里边也有链接。这个PEP中涵盖了Python方方面面的编码风格指南,零基础的话有些内容会看不懂,不过无需担心,只要当作一个风格指南放在手边随时查阅即可。
本系列文章的代码都存放在Github项目:
文章评论