你正在学习 Python 吗?这是一门很棒的学习语言,但与任何语言一样,它确实带来了有时看起来势不可挡的挑战,尤其是在你自学的时候。
鉴于在 Python 中做事的所有不同方式,我们决定编制一份有用的列表,列出初学者经常面临的问题——以及他们的解决方案。
1、从终端读取
如果您在终端上运行程序并且需要用户输入,则可能需要通过终端本身来获取它。(其他替代方法包括读取文件以获取输入。)
在 Python 中,该raw_input函数有助于实现这一点。该函数采用的唯一参数是提示。我们来看一个小程序看看结果:
name = raw_input('Type your name and press enter: ')
print 'Hi ' + name
如果将这些行保存在一个文件中(带有.py扩展名)并执行它,您会得到以下结果:
Type your name and press enter: Shaumik
Hi Shaumik
这里要注意的一件重要事情是变量是一个字符串,您需要对其进行过滤和转换以以不同的形式使用它(例如迭代次数或矩阵长度的输入):
name = raw_input('Type your name and press enter: ')
print 'Hi ' + name
num = raw_input('How many times do you want to print your name: ')
for i in range(int(num)):
print name
2、在 Python 中枚举
Python 经常提供与其他流行的编程语言(如 C++ 和 Java)不同的做事方式。当你遍历其他语言的数组时,你会从数组中增加一个整数0并访问数组的相应元素。下面显示了一个粗略的方法:
for (int i = 0; i < array_length; ++i)
cout << array[i];
但是,在 Python 中,您可以简单地遍历数组的每个元素而不使用索引:
for item in array:
print item
如果还需要访问索引怎么办?该enumerate功能可帮助您做到这一点。枚举数组(或 Python 中已知的list)会在数组中创建成对的项及其索引。同样可以证明如下:
>>> x = [10, 11, 12, 13, 14]
>>> for item in enumerate(x):
... print item
...
(0, 10)
(1, 11)
(2, 12)
(3, 13)
(4, 14)
想象一下您需要打印数组中的每个备用项的情况。一种方法如下:
>>> for index, item in enumerate(x):
... if index % 2 == 0:
... print item
...
10
12
14
3、通过 Python 执行外部命令
在某些时候,您可能需要在 Python 脚本中执行终端命令。这可以通过模块call下的函数来实现。subprocess有很多方法可以做到这一点,其中一种如下所示:
>>> from subprocess import call
>>> call('cal')
March 2016
Su Mo Tu We Th Fr Sa
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
0
输出中的最后一个零表明我们在脚本中创建的子进程正常结束。换句话说,运行命令没有问题。
如果您需要为命令使用参数,则需要将它们作为列表附加到主命令。例如,要运行 command ls -l,需要执行以下操作:
>>> from subprocess import call
>>> call(['ls', '-l'])
total 16
-rw-------@ 1 donny staff 439 Oct 21 16:06 chess.csv
-rw-r--r-- 1 donny staff 72 Mar 1 17:28 read.py
0
要检查发生0错误时会发生什么,我们可以在非 git 存储库中运行 git 命令:
>>> from subprocess import call
>>> call(['git', 'status'])
fatal: Not a git repository (or any of the parent directories): .git
128
在输出中,第二行是命令的输出,而是128退出代码。
4、处理异常
Python 是一种解释型语言,这意味着代码是逐行执行的。如果在一行中遇到错误,则代码的进一步执行将停止。但是,您可以使用 try-except 块处理Python 中的已知异常。让我们看一个简单的例子,通过生成除以的运行时错误0:
>>> x = 1/0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
当解释器到达这一行时,您的程序执行将完全停止!但是,使用 try-except 块可以帮助避免这种情况。
>>> try:
... x = 1/0
... except:
... print "Some error occurred"
...
Some error occurred
当try块中发生这样的错误时,解释器只执行except块。通过捕获单个错误可以进一步扩展except块:
>>> try:
... x = 1/0
... except ZeroDivisionError:
... print "You tried to divide by zero"
... except:
... print "Some unknown error occurred"
...
You tried to divide by zero
您可以提前一步,通过修改except块来捕获异常并进一步处理它(例如在某处记录错误):
>>> try:
... x = 1/0
... except Exception as e:
... print "Exception occurred: " + str(e)
...
Exception occurred: integer division or modulo by zero
5、使用模块
在看别人的代码时,经常会遇到这样一段代码:
def some_function():
...
if __name__ == '__main__':
...
当您在 Python 中创建模块时,这经常使用。理想情况下,最后一个块中的代码通常演示了上述函数的一些基本用法。当您在终端中运行该文件时,将执行此代码。但是,如果您在不同的文件中使用此模块以使用该功能,则不会执行此块。令人困惑?让我们通过一个例子更好地理解这一点:
# File print.py
def print_me():
print "me"
# demonstrating use of print_me
print_me()
现在,如果我导入此文件以在新文件中使用该函数,请注意会发生什么:
>>> import print
me
>>>
导入文件后,该函数就会立即执行。为了避免这种情况,我们将函数放在一个if name == 'main':块下:
# File print.py
def print_me():
print "me"
if __name__ == '__main__':
# demonstrating use of print_me
print_me()
当我们修改代码时,该print_me()函数只有在作为文件运行时才会执行,而不是在作为模块导入时执行:
>>> import print
>>>
最后
如果 Python 不是您的第一种编程语言,那么需要一些时间来适应它的做事方式。