首页 > 代码库 > Python语言的其他特性(第四章:不常用的特性)

Python语言的其他特性(第四章:不常用的特性)

如何使用lambda和filter函数

如何使用map来避免循环

字符串替换

getopt模块

4.1 lambda和filter:简单的匿名函数

4.2Map短路循环

4.3在列表中做出决策——列表解析

4.4为循环生成迭代器

4.5使用字典的特殊字符串替换

4.6重要模块

4.6.1getopt从命令行中得到选项

 在unix系统中指定一个程序的运行方式,最常用方法是在程序的命令行中加入参数。例如,你可能已经看到了能够在运行很多程序时可以使他们提供关于其运行方式的基本信息。在python中使用-h来实现的

 以前在不同的unix平台上采用不同的方式来指定这些选项,而这在很大很大程度上导致了大部分项目采用了两种选项形式:简易形式和长形式。

使用者两种选项是很有意义的,理想情况下,我们希望同时提供一个简易的和长的命令形式,并且允许随意地指定其中的一个,所以如果想要编写一个具有用户可以制定的配置文件的程序,可能要唯有经验的用户提供-c这样的一个简易选项,还有-config-file这样的长的选项,在任何一种情况下,都希望他们在程序中具有相同的功能已节省时间,同时允许用户自由地使用这些选项。

getopt模块为了是这个标准的约定易用提供了两个函数:getopt.getopt和getopt.gnugetopt,他们基本上是相同的,基本的getopt一直运行到遇到第一个非选项,其余的不检查。

为了让getopt更有用,必须知道想让用户使用什么选项,通常情况下,编写的城市最少要为用户提供关于如何运行程序的信息,就像python的-h打印信息一样。

还有具有一个配置文件通常非常有用,将这些想法作为出发点,可以开始编写新程序,使得-h和--help都能产生关于程序如何使用的最少信息。

当使用长选项并要求一个参数(像其那面例子中的--config)时,必须使用等号连接选项和参数的值。然而,当使用简易选项时,可以用一个或多个空格或制表符分割选项和它对应的值。

前面的代码片段如果在一个使用参数-c test -h -config=secondtest的程序中运行,将产生下面的输出:

注意配置文件的第二个实例是默认接受的,当他出现时,重新访问设置config文件的相同代码,以使得能够第二个实例。

第二个列表是一个空的列表,这里因为命令行中提供给程序的所有选项都是有效的选项,或者选项的有有效参数,如果在选项中间插入其他的字符串,标准的getopt会有不同的行为,如果将参数替换

4.6.2使用一个以上的进程

在unix和类unix的操作系统中,执行某种类型的子任务的主要方式是运行一个新的程序已建立一个新的进程。在unix系统中,这个使用一个系统调用完成的,在python中,额可以使用os.fork进行系统调用,计算机会复制一个当前信息到新创建的进程中,唯一不同的是新创建的进程(子进程)中os.fork的返回值是0,而这个返回值是新创建的进程在原始进程(父进程)中的进程ID(PID)。

父进程能够在子进程运行中等待一个事件,反之亦然,代码简单实用,但是只能工作在nuix和类unix系统上。

调用os.fork之后最常用的一件事情是立即调用os.execl以运行其他程序。os.execl是一个新程序代替正在运行程序的指令,所以它使得调用程序终止,并且一个新的程序出现在他的位置

os.wait函数通知pyt让父进程什么都不做。

4.6.3线程-在相同的进程中完成多个工作

使用fork和spawn创建一个新的进程有时可能需要付出很大的代价,又不能提供足够多的好处,fork不足之处在于,当有时需要程序同时做很多工作时,一些工作可能需要等待其他工作处理完成,发生这样的情况时,可能想要所有不同的组件将它们需要传递到程序的其他部分。

因为子进程最初是使用父进程的数据创建的,所以这些进程间共享很多信息,然而他们是完全不同的实体,因此,使两个进程协同工作需要使用很多技巧。

为了应付不适用子进程的复杂情况,用到了线程的概念。

程序执行时,很多合作的线程比使用单独的进程要方便得多,注意下面的例子使用了子类。

很多情况下,例如网络服务器或者图形用户界面,线程具有更重要的意义,因为他们只需要程序员做很少的工作,并且需要系统资源很少。

 

Python语言的其他特性(第四章:不常用的特性)