1.判断、循环

对于Python的循环及判断主要包括这些关键字:

if elif else for while break continue and or is not in

1.1 if 语法

if语法与C语言、shell脚本之下的非常类似,最大的区别就是冒号以及严格的缩进,当然这两点也是Python区别于其他语言的地方:

if condition1:

do something

elif condition2:

do another thing

else:

also do something

 

1.2 while 语法

Python的while语法区别于C、shell下的while除了冒号及缩进之外,还有一点就是while可以携带一个可选的else语句:

while condition:

do something

else:

do something

注:else语句是可选的,但是使用while语句时一定要注意判断语句可以跳出!

 

1.3 for 语法

与while类似,Python的for循环也包括一个可选的else语句(跳出for循环时执行,但是如果是从break语句跳出则不执行else语句块中的代码!),而且for 加上 关键字in就组成了最常见的列表解析用法。

下面是for的一般用法:

for i in range(1,10,2):

do something

if condition:

break

else:

do something

for的列表解析用法:

for items in list:

print items

 

1.4 and...or 语法

Python的and/or操作与其他语言不同的是它的返回值是参与判断的两个值之一,所以我们可以通过这个特性来实现Python下的 a ? b : c !

有C语言基础的知道 “ a ? b : c ! ” 语法是判断 a,如果正确则执行b,否则执行 c!

而Python下我们可以这么用:“ a and b or c ”(此方法中必须保证b必须是True值),python自左向右执行此句,先判断a and b :如果a是True值,a and b语句仍需要执行b,而此时b是True值!所以a and b的值是b,而此时a and b or c就变成了b or c,因b是True值,所以b or c的结果也是b;如果a是False值,a and b语句的结果就是a,此时 a and b or c就转化为a or c,因为此时a是 False值,所以不管c是True 还是Flase,a or c的结果就是c!!!捋通逻辑的话,a and b or c 是不是就是Python下的a ? b : c ! 用法?

 

1.5 is ,not

is 和 is not 是Python下判断同一性的关键字,通常用来判断 是 True 、False或者None(Python下的NULL)!

比如 if alue is True : ...

 

2.函数、模块、类

 

对于Python的函数及模块主要包括这些关键字:

from import as def pass lambda return class 

 

2.1 模块

Python的编程通常大量使用标准库中的模块,使用方法就是使用import 、from以及as 关键字。

比如: import sys # 导入sys模块

from sys import argv # 从sys模块中导入argv ,这个在前面介绍脚本传参数时使用到

import cPickle as p # 将cPickle模块导入并在此将它简单命名为p,此后直接可以使用p替代cPickle模块原名

 

2.2 函数

Python中定义函数时使用到def关键字,如果你当前不想写入真实的函数操作,可以使用pass关键字指代不做任何操作:

def JustAFunction:

pass

当然,在需要给函数返回值时就用到了return关键字,这里简单提一下Python下的函数返回值可以是多个(接收返回值时用相应数量的变量接收!)!

此外Python下有个神奇的Lambda函数,它允许你定义单行的最小函数,这是从Lisp中借用来的,可以用在任何需要函数的地方。比如:

g = lambda x : x*2 # 定义一个Lambda函数用来计算参数的2倍并返回!

print g(2) # 使用时使用lambda函数返回的变量作为这个函数的函数名,括号中带入相应参数即可!

 

3.异常

 

对于Python的异常主要包括这些关键字:

try except finally raise 

异常这一节还是比较简单的,将可能出现的异常放在 try: 后面的语句块中,使用except关键字捕获一定的异常并在接下来的语句块中做相应操作,而finally中接的是无论出现什么异常总在执行最后做finally: 后面的语句块(比如关闭文件等必要的操作!)

raise关键字是在一定的情况下引发异常,通常结合自定义的异常类型使用。

 

4.其他

 

上面的三类过后,还剩下这些关键字:

print del global with assert yield exec

首先print比较熟悉的,此处就不多介绍了!

del 关键字,比如删除列表中的某项,我们使用 “ del mylist[0] ”

可能这些剩下来的关键字你比较陌生,所以下面来介绍一下:

 

4.1.global 关键字

当你在函数定义内声明变量的时候,它们与函数外具有相同名称的其他变量没有任何关系,即变量名称对于函数来说是 局部 的。这称为变量的 作用域 。所有变量的作用域是它们被定义的块,从它们的名称被定义的那点开始。

eg.

#!/usr/bin/python         


          # Filename: func_local.py         


                    


          def func(x):         


                    print           'x is'          , x         


                    x =           2         


                    print           'Changed local x to'          , x         


                    


          x =           50         


          func(x)         


          print           'x is still'          , x




运行的结果是这样的:

$ python func_local.py         


          x is           50                              # 运行func函数时,先打印x的值,此时带的值是作为参数带入的外部定义的          50          ,所以能正常打印 x=          50         


          Changed local x to           2                 # 在func函数中将x赋          2          ,并打印         


          x is still           50                        # 运行完func函数,打印x的值,此时x的值仍然是之前赋给的          50          ,而不是func函数中修改过的          2          ,因为在函数中修改的只是函数内的局部变量


那么为什么我们要在这提到局部变量呢?bingo,聪明的你一下就猜到这个global就是用来定义全局变量的。也就是说如果你想要为一个在函数外定义的变量赋值,那么你就得告诉Python这个变量名不是局部的,而是 全局 的。我们使用global语句完成这一功能。没有global语句,是不可能为定义在函数外的变量赋值的。
eg.

#!/usr/bin/python         


          # Filename: func_global.py         


                    


          def func():         


                    global x         


                    print           'x is'          , x         


                    x =           2         


                    print           'Changed local x to'          , x         


                    


          x =           50         


          func()         


          print           'Value of x is'          , x





运行的结果是这样的:

$ python func_global.py         


          x is           50         


          Changed global x to           2         


          Value of x is           2                      # global语句被用来声明x是全局的——因此,当我们在函数内把值赋给x的时候,这个变化也反映在我们在主块中使用x的值的时候。


你可以使用同一个global语句指定多个全局变量。例如global x, y, z。

 

4.2.with 关键字

有一些任务,可能事先需要设置,事后做清理工作。对于这种场景,Python的with语句提供了一种非常方便的处理方式。一个很好的例子是文件处理,你需要获取一个文件句柄,从文件中读取数据,然后关闭文件句柄。
如果不用with语句,打开一个文件并读文件的代码如下:

file = open(          "/tmp/foo.txt"          )         


          data = file.read()         


          file.close()


当然这样直接打开有两个问题:一是可能忘记关闭文件句柄;二是文件读取数据发生异常,没有进行任何处理。下面是添加上异常处理的版本:

file = open(          "/tmp/foo.txt"          )         


          try          :         


                    data = file.read()         


          finally          :         


                    file.close()


虽然这段代码运行良好,但是太冗余了。这时候就是with一展身手的时候了。除了有更优雅的语法,with还可以很好的处理上下文环境产生的异常。下面是with版本的代码:

with open(          "/tmp/foo.txt"          ) as file:         


                    data = file.read()


这看起来充满魔法,但不仅仅是魔法,Python对with的处理还很聪明。基本思想是with所求值的对象必须有一个__enter__()方法,一个__exit__()方法。

 

with语句的执行逻辑如下:紧跟with后面的语句被求值后,返回对象的__enter__()方法被调用,这个方法的返回值将被赋值给as后面的变量。当with后面的代码块全部被执行完之后,将调用前面返回对象的__exit__()方法。


下面例子可以具体说明with如何工作:

#!/usr/bin/python         


          # with_example01.py         


                    


          class          Sample:         


                    def __enter__(self):         


                    print           "In __enter__()"         


                    return          "Foo"         


                    


                    def __exit__(self, type, value, trace):         


                    print           "In __exit__()"         


                    


          def get_sample():         


                    return          Sample()         


                    


          with get_sample() as sample:         


                    print           "sample:"          , sample


运行代码,输出如下

$python with_example01.py            


          In __enter__()           # __enter__()方法被执行         


          sample: Foo              # __enter__()方法返回的值 - 这个例子中是          "Foo"          ,赋值给变量          'sample'          ,执行代码块,打印变量          "sample"          的值为           "Foo"         


          In __exit__()            # __exit__()方法被调用

 

4.3.assert 关键字

assert语句是一种插入调试断点到程序的一种便捷的方式。assert语句用来声明某个条件是真的,当assert语句失败的时候,会引发一AssertionError,所以结合try...except我们就可以处理这样的异常。
eg. 
>>> mylist # 此时mylist是有三个元素的列表
['a', 'b', 'c']
>>> assert len(mylist) is not None # 用assert判断列表不为空,正确无返回
>>> assert len(mylist) is None # 用assert判断列表为空
Traceback (most recent call last): 
File "", line 1, in 
AssertionError # 引发AssertionError异常

 

4.4.yield 关键字

我们先看一个示例:

def fab(max):          


                    n, a, b =           0          ,           0          ,           1         


                    while          n < max:          


                    yield b          


                    # print b          


                    a, b = b, a + b          


                    n = n +           1         


          ''          '


使用这个函数:

>>>           for          n in fab(          5          ):          


          ...     print n          


          ...          


          1         


          1         


          2         


          3         


          5


简单地讲,yield 的作用就是把一个函数变成一个 generator(生成器),带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,调用 fab(5) 不会执行 fab 函数,而是返回一个 iterable(可迭代的)对象!在 for 循环执行时,每次循环都会执行 fab 函数内部的代码,执行到 yield b 时,fab 函数就返回一个迭代值,下次迭代时,代码从 yield b 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。
也可以手动调用 fab(5) 的 next() 方法(因为 fab(5) 是一个 generator 对象,该对象具有 next() 方法),这样我们就可以更清楚地看到 fab 的执行流程:

>>> f = fab(          5          )          


                    >>> f.next()          


                    1         


                    >>> f.next()          


                    1         


                    >>> f.next()          


                    2         


                    >>> f.next()          


                    3         


                    >>> f.next()          


                    5         


                    >>> f.next()          


                    Traceback (most recent call last):          


                    File           "<stdin>"          , line           1          , in <module>          


                    StopIteration</module></stdin>


当函数执行结束时,generator 自动抛出 StopIteration 异常,表示迭代完成。在 for 循环里,无需处理 StopIteration 异常,循环会正常结束。

 

我们可以得出以下结论:
一个带有 yield 的函数就是一个 generator,它和普通函数不同,生成一个 generator 看起来像函数调用,但不会执行任何函数代码,直到对其调用 next()(在 for 循环中会自动调用 next())才开始执行。虽然执行流程仍按函数的流程执行,但每执行到一个 yield 语句就会中断,并返回一个迭代值,下次执行时从 yield 的下一个语句继续执行。看起来就好像一个函数在正常执行的过程中被 yield 中断了数次,每次中断都会通过 yield 返回当前的迭代值。

yield 的好处是显而易见的,把一个函数改写为一个 generator 就获得了迭代能力,比起用类的实例保存状态来计算下一个 next() 的值,不仅代码简洁,而且执行流程异常清晰。

 

注:如果看完此段你还未明白yield,没问题,因为yield是初学者的一个难点,那么你下一步需要做的就是……看一看下面参考资料中给的关于yield的博文!

 

4.5.exec 关键字

官方文档对于exec的解释: "This statement supports dynamic execution of Python code."也就是说使用exec可以动态执行Python代码(也可以是文件)。

>>> longer =           "print \"Hello World ,my name is longer\""              # 比如说我们定义了一个字符串         


          >>> longer         


          'print "Hello World ,my name is longer"'         


          >>> exec(longer)                                            # 使用exec 动态执行字符串中的代码         


          Hello World ,my name is longer         


          >>> exec(sayhi)                                             # 使用exec直接打开文件名(指定sayhi,sayhi.py以及          "sayhi.py"          都会报一定的错,但是我觉得直接带sayhi报错非常典型)         


          Traceback (most recent call last):         


                    File           "<stdin>"          , line           1          , in <module>         


          TypeError: exec: arg           1          must be a string, file, or code object   # python IDE报错,提示exec的第一个参         


          数必须是一个字符串、文件或者一个代码对象         


          >>> f = file(          "sayhi.py"          )                                    # 使用file打开sayhi.py并创建f实例         


          >>> exec(f)                     # 使用exec直接运行文件描述符f,运行正常!!         


          Hi,           this          is [          ''          ] script</module></stdin>



上述给的例子比较简单,注意例子中exec语句的用法和eval_r(), execfile()是不一样的. exec是一个关键字(要不然我怎么会在这里介绍呢~~~), 而eval_r()和execfile()则是内建函数。更多关于exec的使用请详看引用资料或者Google之。

 

================================================

参考资料:

global 参考:《Python简明教程》第七章 函数 - 局部函数

assert 参考:https://www.idefs.com/studying-python-knowledge-assert.html

with 参考:https://python.42qu.com/11155501 

yield 参考:https://pyzh.readthedocs.org/en/latest/the-python-yield-keyword-explained.html

https://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/

exec参考:https://www.mojidong.com/python/2013/05/10/python-exec-eval/