4、Python-条件、循环

1、扩展print和import

1.1 使用逗号输

在打印多个表达式时,可以用逗号隔开;

print "a", "b"

如果在打印语句的结尾加上逗号,接下来的打印语句会和前一条打印语句在同一行输出;

print 'a',

pring 'b'

1.2 模块的导入

导入某个模块 import somemodule

导入模块中的某个函数 from somemodule import somefunction

导入模块中的所有函数 from somemodule import *

2、赋值

2.1 序列解包

序列解包(sequence unpacking)又叫做可迭代解包:将多个值的序列解开,然后放到变量的序列中。

x = [1,2,3]
a,b,c = x

2.2 链式赋值

链式赋值(chained assignment)是将同一个值赋给多个变量的捷径。

x = y = 'abc'

2.3 增量赋值

x += value相当于x = x + value,对于-、*、/、%都适用。

3、 语句块,缩排

语句块:它是在条件为真时执行或执行多次的一组语句。通过在代码前放置空格来缩进语句,从而创建语句块。

4、条件语句

4.1 下面的值在作为布尔表达式的时候会被解释器看作是False

False、None、0、""、()、[]、{}

4.2 if语句

if():

elif():

  if():  #嵌套语句

  else:

else:

4.3 is运算符

x = y = [1,2,3]

z = [1,2,3]

x == y True

x==z True

x is y True

x is z False

is运算符是判断同一性而不是相等性的。变量x和y都被绑定到同一个列表上,而变量z被绑定到另一个具有相同数值的列表上。它们的值相等,但却不似同一个对象。

所以,使用"=="运算符来判定两个对象是否相等,使用is判定两者是否等同(同一个对象)。

4.4 布尔运算符

and、or、not

4.5 断言 assert

断言和if语句在语义上有些相近,使用它的目的是与其让程序在晚些时候崩溃,不如在错误的条件下直接崩溃。一般用在检查函数的属性,或者做为初期测试和调试过程中的辅助条件。

assert语句用来在程序中置入检查点,条件后可以添加字符串来解释断言。

age = -1

assert 0 < age <100, 'The age must be realistic'

上面语句会报错。

5、循环

5.1 while循环

5.2 for循环

注意:xrange和range函数功能类似,区别在于range函数一次创建整个循环序列,而xrange一次只创建一个数。当需要迭代一个巨大的序列时xrange会更高效。它们的默认下限都是从零开始。

 5.3 循环遍历字典元素

d = {}

d.keys d.values d.items,用来获取键列表,值列表,键值对元组列表。

5.4 一些迭代工具

  5.4.1 并行迭代

  内建的zip函数可以用来进行并行迭代,可以把两个序列“压缩”为一个元组列表。

  names = ['wang','li']

  ages = [12,13]

  zip(names,ages)   [('wang',12),('li',13)]

  5.4.2 编号迭代

  在迭代序列中对象的时候,获取对象在序列中的一个索引。

  内建的enumerate函数

  for index, string in enumerate(strings):

    if 'xxx' in string:

      string[index] = '[censored]'

  5.4.3 翻转和排序迭代

  reversed和sorted:他们同列表的reverse和sort方法类似,当作用与序列或可迭代对象上是,返回翻转或排序后的版本,而不是原地地进行修改。

6、列表推导式-轻量级循环

列表推导是(list comprehension)是利用其它列表创建新列表的一种方式,工作方式类似于嵌套for循环。

>>>[x*x for x in rang(10)]

[0,1,4,9,16,25,36,49,64,81]

>>>[x*x for x in rang(10) if x%3==0]

[0,9,36,81]

>>>[(x,y) for x in rang(3) for y in rang(3)]

[(0,0),(0,1),(0,2),(1,0),(1,1),(1,2),(2,0),(2,1),(2,2)]

7、pass、del、exec和eval

pass语句什么都不做,可以作为占位符使用。

del语句用来删除变量,或者数据结构的一部分,但不能用来删除值。

View Code
 1 >>> x = 3
 2 >>> y=x
 3 >>> del x
 4 >>> x
 5 
 6 Traceback (most recent call last):
 7   File "<pyshell#3>", line 1, in <module>
 8     x
 9 NameError: name 'x' is not defined
10 >>> y
11 3
12 >>> x = [0,1,2,3,4,5]
13 >>> del x[1]
14 >>> x
15 [0, 2, 3, 4, 5]
16 >>> y = x
17 >>> y
18 [0, 2, 3, 4, 5]
19 >>> del x[0]
20 >>> x
21 [2, 3, 4, 5]
22 >>> y
23 [2, 3, 4, 5]
24 >>> del x
25 >>> y
26 [2, 3, 4, 5]
27 >>> x
28 
29 Traceback (most recent call last):
30   File "<pyshell#15>", line 1, in <module>
31     x
32 NameError: name 'x' is not defined
33 >>> 

x和y都指向同一个列表或对象。但是删除x并不影响y。原因就是删除的只是名称,而不是列表本身(值)。事实上,Python中没有办法直接删除值。(如果某个值不在使用的时候,Python解释器会负责自动的内存回收)

execl可以动态地创造Python代码,然后将其作为语句执行。

exec "print 'test'"

但有些时候提供的变量值与模块中的函数名冲突,所以,为了安全起见,可以增加一个字典,起到命名空间的作用。

注意:命名空间的概念称为作用域(scope),是非常重要的知识。可以把它当做保存变量的地方。所以在程序执行x=1这类赋值语句时,可以将键x和值1放在当前的命名空间内,命名空间一般来说都是全局的命名空间。

通过增加in <scope>来实现,<scope>就起到放置代码字符串命名空间作用的字典。

>>>from math import sqrt

>>>scope = {}

>>>exec 'sqrt = 1' in scope

>>>sqrt(4)

2.0

>>>scope['sqrt']

1

eval可以动态地创造Python代码,然后将其作为表达式执行。

eval会计算Python表达式(以字符串形式书写),并且返回结果值,而exec语句并不返回任何对象,因为它本身就是语句。

eval创建一个Python计算机:

>>> eval(raw_input("Enter an arithmetic expression:"))

Enter an arithmetic expression:1+1*2

3

给exec或eval语句提供命名空间时,可以在真正使用命名空间前放置一些值进去:

>>>scope = {}

>>>scope['x'] = 2

>>>scope['y'] = 3

>>>eval('x*y', scope)

6

>>>exec 'x = 4 in scope

>>>eval('x*x', scope)

16

 

posted @ 2013-03-19 23:09  Hala  阅读(324)  评论(0编辑  收藏  举报