Python编程者共性错误

简介: 引言本篇博客为译文,翻译自Learning Python一书作者总结的Python编程者共性错误一文,原文英文网址为 http://www.onlamp.com/pub/a/python/2004/02/05/learn_python.html第一次翻译这种技术博客,有错误之处请及时指出。

引言

本篇博客为译文,翻译自Learning Python一书作者总结的Python编程者共性错误一文,原文英文网址为

http://www.onlamp.com/pub/a/python/2004/02/05/learn_python.html

第一次翻译这种技术博客,有错误之处请及时指出。

注意:不是按照原文一字一句翻译的,意译,因此只要保证技术细节对就行。


程序运行错误(Progmatic Mistakes)

在具体到具体程序语法之前,初学者可能遇到的错误,主要集中在运行程序可能会犯的一些错误。

在交互命令行输入python代码

区别系统命令行与python交互命令行的区别,在windows或linux系统命令行中输入“python”,回车后进入python 交互命令行(interactive prompt),此时命令行以“>>>”开头,可以输入python代码,不可以直接输入ls,emac,vim等系统命令,当然此时也可以调用这些命令,但不能直接调用,要是用python的package,“import os.system”,之后才能调用;在python交互命令行也不能直接运行python文件,在系统命令行可以,“python filename”即可,而在python交互命令行下,需要使用“import file”命令才能使用。

在文件中必须使用print语句

在交互命令行自动打印变量或表达式结果,但是在以文件形式运行python程序时(程序写在代码文件里),必须输入print语句才能打印结果。

在Windows系统中注意自动扩展名

在Windows系统中使用记事本等编辑文件中,默认保存为txt文件,此时使python解释器无法运行python代码,注意选择保存格式为all files,然后手动敲入文件名加文件扩展名,如“filename.py”,也可以使用特定的代码编辑软甲或集成开发环境。

Windows系统直接点击运行代码文件

Windows系统中双击运行代码文件,如果没有input()等语句,则程序运行时会一闪而过,基本无法看到运行结果,此时,要在系统命令行下python filename.py或import module或在集成开发环境中运行程序。

import只在第一次起作用

import语句用于导入其他模块,但如果你一直在输入程序,而没有关闭交互命令行,此前import的模块一直驻留在内存中,你对其他模块的更改不会作用到当前输入的程序中,需要重新载入(reload)模块,具体调用reload函数,如“ reload(module)”

在交互命令行中空白行有意义

在文件中,空白行没有任何意义,被解释器忽略,但是在交互命令行中,为了区分代码块是否完结,需要空白行来间隔其他代码来表示,因此对于for,while,等代码块结束时,需要额外输入至少一行空白行表示该代码块结束。

编码错误(Coding Mistakes)

不要忘记冒号

if、while、for等复合语句需要加冒号。

初始化变量

在python中,只有给一个变量指定一个值,才能在表达式中调用它,防止变量歧义问题,如默认赋值到底该赋值什么0,None,“”,[] ?,这是因为python是非强类型语言,必须通过赋值确定变量如何分配内存。

从第一列开始

顶层代码,都从最左侧第一列开始。

缩进一致

避免空格与Tab混合进行缩进。

调用函数总是使用括号语法

调用函数,为函数名加括号。

在import时不要加扩展名或路径

import时会在环境变量指定的路径下查找,因此不需要指定路径;import时不需要加文件扩展名。

不要在python中输入C代码

  • if,for,while 语句中不要加括号。
  • 不要以分号结束语句
  • 在while循环测试中,不能出现赋值语句

编程错误(Programming mistakes)

这部分设计数据类型、函数、模块、类等错误。

文件打开不调用模块搜索路径

使用文件打开函数时,不使用模块搜索的路径,而是参数给出的绝对当前目录相对路径。

方法是类型特定的

list的方法不能用于strings类型数据;len函数可以通用于任何带长度对象。

不可变类型不能原地改变

不可变类型如元祖、字符串不能原地改变。如

T = (1, 2, 3)
T[2] = 4 # Error

使用简单for循环代替while或range

当需要遍历序列对象是,直接使用for循环,而不是使用基于while或range的循环,避免使用range函数,除非必要,让python自己处理索引,如

S = 'lumberjack'

for c in S: # simplest
    print(c)

for i in range(len(S)): # too much
    print(S[i])

i = 0
while i < len(S): # too much
    print(S[i])
    i += 1

不要指望来自函数的结果改变对象

原地改变操作如list.append()和list.sort()改变对象,但是没有返回被修改的对象;如

mylist = mylist.append(X)

mylist将会被赋值为None而不是给修改的list。

D = {1:'a', 2:'b'}
for k in D.keys().sort():
    print(D[k])

上面代码出错,因为sort()函数返回None,不是序列变量不能进行循环遍历,正确的为

Ks = D.keys()
Ks.sort()
for k in Ks:
    print(D[k])

转换只发生在数字类型之间

默认自动转换只发生在数字类型之间,如果在数字类型与字符串类型则不能转换,这是因为非数字类型之间转换无法确定转为哪一种类型。

Cyclic数据结构可导致循环

集合对象包含对自身的引用称为cyclic object,python会打印为[ … ]当它发现对象存在循环时,而不是陷入无限循环。

赋值产生引用,不是拷贝

这个python的核心概念。

L = [1, 2, 3]
M = ['M', L, 'Y']
print(M) # ['X', [1, 2, 3], 'Y']
L[1] = 0
print(M) # ['X', [1, 0, 3], 'Y']

可以拷贝避免共享对象。

L = [1, 2, 3]
M = ['M', L[:], 'Y']
print(M) # ['X', [1, 2, 3], 'Y']
L[1] = 0
print(L) # [1, 0, 3]
print(M) # ['X', [1, 2, 3], 'Y']

局部变量被静态发现

python将函数内部赋值的变量默认为局部变量,存在于函数范围内,只在函数运行时。python静态发现局部变量。

X = 99
def func():
    print(X) # Does not yet exit
    X = 88   # Make X local in entire def

func() # Error!

会报错,编译这段代码时,python发现赋值语句,X在函数内部局部变量,实际函数运行时,赋值语句还没执行,python产生未定义名称错误(undefined name error)。
上述代码是歧义的:你是要打印全局变量X,然后创建一个局部变量X,还是这是一个编程错误?如果你要打印全局变量X,应该用global声明或通过模块名调用。

默认或可变对象

默认参数被存储一次,当def语句运行时,而不是每次调用,在改变可变对象时必须小心,如

def saver(x=[]):
    x.append(1)
    print(x)
saver([2]) # [2, 1], Default not used
saver() # [1], Default used
saver() # [1, 1], Grows on each call!
saver() # [1, 1, 1]

改变上述行为,可以通过在函数开始处拷贝默认值或移动默认值表达式到函数体中,只要保证赋值代码每次函数调用时执行即可。

def saver(x=None):
    if x is None: # No arg passed?
        x = []    # Changes new list
    x.append(1)
    print(x)
saver([2]) # [2, 1], Default not used
saver() # [1], Default used
saver() # [1], Doesn't grows now
saver() # [1]

其他错误

  • 文件从上到下读取,因此非递归代码调用在定义之下
  • reload不作用于from语句
  • 多继承时从左至右,最左类继承如果后面还有同名出现
  • 空except语句捕获所有类型异常
  • Bunnies can be more dangerous than they seem(不知道如何翻译)
目录
相关文章
|
1月前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
1月前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
1月前
|
Unix Linux 程序员
[oeasy]python053_学编程为什么从hello_world_开始
视频介绍了“Hello World”程序的由来及其在编程中的重要性。从贝尔实验室诞生的Unix系统和C语言说起,讲述了“Hello World”作为经典示例的起源和流传过程。文章还探讨了C语言对其他编程语言的影响,以及它在系统编程中的地位。最后总结了“Hello World”、print、小括号和双引号等编程概念的来源。
114 80
|
2月前
|
存储 索引 Python
Python编程数据结构的深入理解
深入理解 Python 中的数据结构是提高编程能力的重要途径。通过合理选择和使用数据结构,可以提高程序的效率和质量
161 59
|
21天前
|
Python
[oeasy]python055_python编程_容易出现的问题_函数名的重新赋值_print_int
本文介绍了Python编程中容易出现的问题,特别是函数名、类名和模块名的重新赋值。通过具体示例展示了将内建函数(如`print`、`int`、`max`)或模块名(如`os`)重新赋值为其他类型后,会导致原有功能失效。例如,将`print`赋值为整数后,无法再用其输出内容;将`int`赋值为整数后,无法再进行类型转换。重新赋值后,这些名称失去了原有的功能,可能导致程序错误。总结指出,已有的函数名、类名和模块名不适合覆盖赋新值,否则会失去原有功能。如果需要使用类似的变量名,建议采用其他命名方式以避免冲突。
38 14
|
1月前
|
分布式计算 大数据 数据处理
技术评测:MaxCompute MaxFrame——阿里云自研分布式计算框架的Python编程接口
随着大数据和人工智能技术的发展,数据处理的需求日益增长。阿里云推出的MaxCompute MaxFrame(简称“MaxFrame”)是一个专为Python开发者设计的分布式计算框架,它不仅支持Python编程接口,还能直接利用MaxCompute的云原生大数据计算资源和服务。本文将通过一系列最佳实践测评,探讨MaxFrame在分布式Pandas处理以及大语言模型数据处理场景中的表现,并分析其在实际工作中的应用潜力。
81 2
|
1月前
|
小程序 开发者 Python
探索Python编程:从基础到实战
本文将引导你走进Python编程的世界,从基础语法开始,逐步深入到实战项目。我们将一起探讨如何在编程中发挥创意,解决问题,并分享一些实用的技巧和心得。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的参考。让我们一起开启Python编程的探索之旅吧!
55 10
|
1月前
|
机器学习/深度学习 人工智能 Java
Python 语言:强大、灵活与高效的编程之选
本文全面介绍了 Python 编程语言,涵盖其历史、特点、应用领域及核心概念。从 1989 年由 Guido van Rossum 创立至今,Python 凭借简洁的语法和强大的功能,成为数据科学、AI、Web 开发等领域的首选语言。文章还详细探讨了 Python 的语法基础、数据结构、面向对象编程等内容,旨在帮助读者深入了解并有效利用 Python 进行编程。
|
1月前
|
机器学习/深度学习 人工智能 数据挖掘
探索Python编程的奥秘
在数字世界的海洋中,Python如同一艘灵活的帆船,引领着无数探险者穿梭于数据的波涛之中。本文将带你领略Python编程的魅力,从基础语法到实际应用,一步步揭开Python的神秘面纱。
48 12
|
1月前
|
IDE 程序员 开发工具
Python编程入门:打造你的第一个程序
迈出编程的第一步,就像在未知的海洋中航行。本文是你启航的指南针,带你了解Python这门语言的魅力所在,并手把手教你构建第一个属于自己的程序。从安装环境到编写代码,我们将一步步走过这段旅程。准备好了吗?让我们开始吧!