- Preface 前言
- 第1章 引论
- 第2章 编程惯用法
- 第3章 基础语法
- 建议19:有节制地使用 from…import 语句
- 建议20:优先使用 absolute import 来导入模块
- 建议21:i+=1 不等于 ++i
- 建议22:使用 with 自动关闭资源
- 建议23:使用 else 子句简化循环(异常处理)
- 建议24:遵循异常处理的几点基本原则
- 建议25:避免 finally 中可能发生的陷阱
- 建议26:深入理解 None 正确判断对象是否为空
- 建议27:连接字符串应优先使用 join 而不是 +
- 建议28:格式化字符串时尽量使用 .format 方式而不是 %
- 建议29:区别对待可变对象和不可变对象
- 建议30:[]、() 和 {}:一致的容器初始化形式
- 建议31:记住函数传参既不是传值也不是传引用
- 建议32:警惕默认参数潜在的问题
- 建议33:慎用变长参数
- 建议34:深入理解 str() 和 repr() 的区别
- 建议35:分清 staticmethod 和 classmethod 的适用场景
- 第4章 库
- 建议36:掌握字符串的基本用法
- 建议37:按需选择 sort() 或者 sorted()
- 建议38:使用 copy 模块深拷贝对象
- 建议39:使用 Counter 进行计数统计
- 建议40:深入掌握 ConfigParser
- 建议41:使用 argparse 处理命令行参数
- 建议42:使用 pandas 处理大型 CSV 文件
- 建议43:一般情况使用 ElementTree 解析 XML
- 建议44:理解模块 pickle 优劣
- 建议45:序列化的另一个不错的选择 JSON
- 建议46:使用 traceback 获取栈信息
- 建议47:使用 logging 记录日志信息
- 建议48:使用 threading 模块编写多线程程序
- 建议49:使用 Queue 使多线程编程更安全
- 第5章 设计模式
- 第6章 内部机制
- 建议54:理解 built-in objects
- 建议55:init() 不是构造方法
- 建议56:理解名字查找机制
- 建议57:为什么需要 self 参数
- 建议58:理解 MRO 与多继承
- 建议59:理解描述符机制
- 建议60:区别 getattr() 和 getattribute() 方法
- 建议61:使用更为安全的 property
- 建议62:掌握 metaclass
- 建议63:熟悉 Python 对象协议
- 建议64:利用操作符重载实现中缀语法
- 建议65:熟悉 Python 的迭代器协议
- 建议66:熟悉 Python 的生成器
- 建议67:基于生成器的协程及 greenlet
- 建议68:理解 GIL 的局限性
- 建议69:对象的管理与垃圾回收
- 第7章 使用工具辅助项目开发
- 第8章 性能剖析与优化
建议3:理解 Python 与 C 语言的不同之处
我们都知道,Python底层是用C语言实现的,但切忌用C语言的思维和风格来编写Python代码。对于那些在学习Python之前有其他编程语言(如Java、C#等)经验的程序员来说,尤其重要的是:不要使用之前的编程思想。Python与它们有很多不同,以下从语法方面来进行简单分析。
(1)“缩进”与“{}”
与C、C++、Java等语言使用花括号{}来分隔代码段不同,Python中使用严格的代码缩进方式分隔代码块,空格或者Tab键不再是你心血来潮的时候可以随便敲敲解闷的了,对于Python解释器而言,它们直接关乎代码的语法和逻辑,一不小心就会出现unexpected indent错误。Python的这一特点也曾引起不少争议,强制代码缩进就像一把双刃剑,有利有弊。对于从其他编程语言转过来学习Python的人来说,也许需要一段时间去适应。但不可否认,严格的缩进确实能让代码更加规范、整齐,可读性和可维护性都会更高。避免缩进带来的困扰的方法之一就是养成良好的习惯,统一缩进风格,不要混用Tab键和空格。
(2)'与"
C语言中单引号(')与双引号(")有严格的区别,单引号代表一个字符,它实际对应于编译器所采用的字符集中的一个整数值。例如在ASCII码中,'a'与97相对应。而双引号则表示字符串,默认以'\0'结尾。但在Python中,单引号与双引号没有明显区别,仅仅在输入字符串内容不同时,在使用上存在微小差异。
>>> string1 = "He said, \"Hello\"" # 字符串中本身的双引号需要转义 >>> string1 'He said, "Hello"' >>> string2 = 'He said,"Hello"' # 字符串本身的双引号不需要转义 >>> string2 'He said,"Hello"'
(3)三元操作符“?:”
三元操作符是if...else的简写方法,语法形式为C ? X: Y,它表示当条件C为True的时候取值X,C为False的时候取值为Y。其简洁的表达形式一直很受欢迎。但在Python 2.5之前并不支持三元操作符。为此,人们想出了不少替代方式,但在特殊情形下存在一些问题,因此很多人对Python语言本身加入该特征也提出了不少建议,最终PEP308被接受,根据提议采用if...else...形式实现条件表达式。C ? X: Y在Python中等价的形式为X if C else Y,即:
>>> X=0 >>> Y=-2 >>> print X if X<Y else Y -2
(4)switch...case
Python中没有像C语言那样的switch...case分支语句,不过这不是什么难事,Python中有很多替代的解决方法。假设,用C语言实现的switch...case语句如下:
switch(n) { case 0: printf("You typed zero.\n"); break; case 1: printf("You are in top.\n"); break; case 2: printf("n is an even number\n"); default: printf("Only single-digit numbers are allowed\n"); break; }
与以上C语言中switch...case对应的Python实现如下:
if n == 0: print "You typed zero.\n" elif n== 1: print "You are in top.\n" elif n == 2: print "n is an even number\n" else: print "Only single-digit numbers are allowed\n"
或者使用以下跳转表来实现:
def f(x): return { 0: "You typed zero.\n", 1: "You are in top.\n", 2: "n is an even number\n" }.get(n, "Only single-digit numbers are allowed\n")
以上只是简单列举了几个Python和其他语言的不同点,事实上,其差异性远远不止这些。但总归一句话:不要被其他语言的思维和习惯困扰,掌握Python的哲学和思维方式才是硬道理。正如前面所说,要舍得抛弃具有自我风格的代码,尽量遵循Pythonic代码的编码规范和风格。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论