2014-05-21

# 条件、循环、其它语句

## print和import

### 使用逗号输出

>>> print "age:",28

age: 28

print "Hello,",

print "World!"

Hello, World!

### 把某件事作为另一件事导入

import somemodule

from somemodule import somefunction

from sommodule import somefunction,anotherfunction,yetanotherfunction

from somemodule import *

module1.open(...)

module2.open(...)

>>> import math as foobar

>>> foobar.sqrt(4)

2.0

>>> from math import sqrt as foobar

>>> foobar(4)

2.0

from module1 import open as open1

from module2 import open as open2

## 赋&#20540;魔法

### 序列解包

>>> x,y,z=1,23,456

>>> print x,y,z

1 23 456

>>> x,y=y,x

>>> print x,y

23 1

>>> x,y,z=y,z,x

>>> print x,y,z

1 456 23

>>> values=1,2,3

>>> values

(1, 2, 3)

>>> x,y,z=values

>>> print x,y,z

1 2 3

>>> people={'name':'signjing','age':'28','weight':'72'}

>>> x,y=people.popitem()

>>> print x,y

age 28

>>> x,y=people.popitem()

>>> print x,y

name signjing

>>> x,y=people.popitem()

>>> print x,y

weight 72

>>> x,y=1,3,4

Traceback (most recent call last):

File "", line 1, in

x,y=1,3,4

ValueError: too many values to unpack

>>> x,y,z=2,9

Traceback (most recent call last):

File "", line 1, in

x,y,z=2,9

ValueError: need more than 2 values to unpack

### 链式赋&#20540;

x=y=somefunction()

y=somefunction()

x=y

x=somefunction()

y=somefunction()

### 增量赋&#20540;

>>> x=5

>>> x&#43;=3

>>> x*=2

>>> x/=4

>>> x

4

>>> s='too'

>>> s&#43;='many'

>>> s*=2

>>> s

'toomanytoomany'

## 条件和条件语句

### 布尔变量

False None 0 “” () [] {}

>>> True

True

>>> False

False

>>> True==0

False

>>> True==1

True

>>> False==0

True

>>> False==1

False

>>> False&#43;True&#43;23

24

>>> bool('I think ,therefore I am')

True

>>> bool(42)

True

>>> bool(0)

False

>>> bool('')

False

>>> bool(False)

False

>>> bool(())

False

>>> bool({})

False

>>> bool([])

False

### 条件执行和if语句

if语句可以实现条件执行，如果条件判定为真，则后面的语句块执行，如果条件为假，语句块就不会被执行。

if name.endswith("Bob"):

print "Hello,Bob!"

### else语句

else子句（之所以叫子句，是因为它不是独立的语句，而只能作为if语句的一部分）可以增加一种选择。

if name.endswith("signjing"):

print "Hello,signjing!"

else:

print "Hello,someone!"

if num>0:

print "num > 0"

elif num<0:

print "num < 0"

else:

print "num = 0"

### 嵌套代码块

if语句里可以嵌套使用if语句：

num = input("Please input a num: ")

if num > 0:

if num >5:

print "num > 5"

elif num > 3:

print "num >3 and num <= 5"

else:

print "num <= 3 and num > 0"

elif num < 0:

if num < -10:

print "num < -10"

elif num < -4:

print "num < -4 and num >= -10"

else:

print "num >= -4 and num < 0"

else:

print "num = 0"

### 更复杂的条件

#### 比较运算符

x==y x等于y

x

x>y x大于y

x>=y x大于等于y

x<=y x小于等于y

x!=y x不等于y

x is y x和y是同一个对象

x is not y x和y是不同的对象

x in y x是y容器的成员

x not in y x不是y容器的成员

>>> a=5

>>> 0

True

>>> 0

False

>>> 03

True

>>> "abc"=="abc"

True

>>> "abc"=="Abc"

False

#### is：同一性运算符

>>> x=y=[1,2,3]

>>> z=[1,2,3]

>>> x==y

True

>>> x is y

True

>>> x == z

True

>>> x is z

False

x和z相等却不等同，因为is运算符是判定同一性而不是相等性。

x和y被绑定到同一个列表上，而变量z被绑定在另外一个具有相同数&#20540;和顺序的列表上。它们的&#20540;可能相等，但却不是一个对象。

#### 字符串和序列比较

>>> "a" < "b"

True

>>> "abc" < "ab"

False

>>> [1,2,4]>[1,2,3]

True

>>> [1,2,[2,'a']]<[1,2,[3,4]]

True

#### 布尔运算符

and运算符，连接两个布尔&#20540;，且在两者都为真时返回真，否则返回假。

or运算符，连接两个布尔&#20540;，且在两者都为假时返回假，否则返回真。

not运算符，连接一个布尔&#20540;，当连接的布尔&#20540;为真时返回假，为假时返回真。

#### 短路逻辑

x and y需要两个变量都为真时才为真，如果x为假，则x and y立即返回false，而不需计算y的&#20540;。同理，x or y只要有一个为真则为真，如果x为真，则x or y直接返回True，而不需计算y的&#20540;。这样，避免了无用地执行代码，可以作为一种技巧使用。

### 断言

if语句有个非常有用的近亲，其工作方式多少有点像下面这样（伪代码）：

if not condition:

crash program

>>> age=10

>>> assert 0

>>> age=-2

>>> assert 0

Traceback (most recent call last):

File "", line 1, in

assert 0

AssertionError

>>> assert 0

Traceback (most recent call last):

File "", line 1, in

assert 0

AssertionError: make age right

## 循环

i=5

while i>0:

print i

i-=1

5

4

3

2

1

### for循环

list1=list('signjing')

for l in list1:

print l

s

i

g

n

j

i

n

g

numbers=[1,2,3,4]

for n in numbers:

print n

1

2

3

4

for n in range(1,5):

print n

1

2

3

4

range函数的工作方式类&#20284;于分片，包含下限，不包含上限，如果希望下限为0，则可以只提供上限。

### 循环遍历字典元素

d={'x':1,'y':2,'z':3}

for key in d:

print key,d[key]

y 2

x 1

z 3

for循环的一大好处就是可以在循环中使用序列解包：

d={'x':1,'y':2,'z':3}

for key,value in d.items():

print key,value

y 2

x 1

z 3

### 一些迭代工具

#### 并行迭代

names=['anne','beth','damon']

ages=[13,19,21]

for i in range(len(names)):

print names[i],'is',ages[i],'years old.'

anne is 13 years old.

beth is 19 years old.

damon is 21 years old.

names=['anne','beth','damon']

ages=[13,19,21]

for name,age in zip(names,ages):

print name,"is",age,"years old."

anne is 13 years old.

beth is 19 years old.

damon is 21 years old.

zip函数可以作用于任意多的序列。关于它很重要的一点是zip可以应付不等长的序列：当最短的序列“用完”的时候就会停止：

>>> zip(range(5),xrange(100))

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

>>> zip(range(5),xrange(2))

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

#### 翻转和排序迭代

reversed和sorted，同列表的reverse和sort方法类&#20284;，但作用于任何序列或可迭代对象上，不是原地修改对象，而是返回翻转或排序后的版本：

>>> sorted([4,3,6,8,3])

[3, 3, 4, 6, 8]

>>> sorted('hello,world!')

['!', ',', 'd', 'e', 'h', 'l', 'l', 'l', 'o', 'o', 'r', 'w']

>>> list(reversed('hello,world!'))

['!', 'd', 'l', 'r', 'o', 'w', ',', 'o', 'l', 'l', 'e', 'h']

>>> ''.join(reversed('hello,world'))

'dlrow,olleh'

### 跳出循环

#### break

for i in range(5):

print i

if i > 2:

break

print "--"

0

--

1

--

2

--

3

#### continue

continue语句用的要少很多，它让当前的迭代结束，“跳”到下一轮循环的开始。基本意思是：跳过剩余的循环体，但不结束循环。当循环体很大而且很复杂时，会很有用。

for i in range(5):

print i

if i > 2:

continue

print "--"

0

--

1

--

2

--

3

4

#### while True/break习语

while True实现了一个永远不会自己停止的循环，但在循环体内部的if语句中加入条件，在条件满足时调用break语句。这样，就可以在循环内部任何地方而不是只在开头终止循环。

### 循环中的else子句

for i in range(5):

print i

if i > 6:

break

print "--"

else:

print "I'm here"

0

--

1

--

2

--

3

--

4

--

I'm here

for和while循环中都可以使用continue、break语句和else子句。

## 列表推导式——轻量级循环

>>> [x*x for x in range(1,6)]

[1, 4, 9, 16, 25]

>>> [x*x for x in range(1,6) if x%2==0 ]

[4, 16]

>>> [x*y for x in range(1,3) for y in (2,5)]

[2, 5, 4, 10]

>>> [x*y for x in range(1,11) for y in range(1,9) if x%3==0 if y%4==0 ]

[12, 24, 24, 48, 36, 72]

## 三人行

### 什么都没发生

>>> pass

>>>

if name == 'signjing':

print "I'm signjing"

elif name == 'sj':

pass

else:

print "unknown"

I'm signjing

if name == 'signjing':

print "I'm signjing"

elif name == 'sj':

#pass

else:

print "unknown"

File "pass.py", line 6

else:

^

IndentationError: expected an indented block

### 使用del删除

>>> x=['hello','world']

>>> y=x

>>> y[1]='python'

>>> x

['hello', 'python']

>>> del x

>>> y

['hello', 'python']

### 使用exec和eval执行和求&#20540;字符串

#### exec

>>> exec "print 'hello'"

hello

>>> from math import sqrt

>>> exec "sqrt = 1"

>>> sqrt(4)

Traceback (most recent call last):

File "", line 1, in

sqrt(4)

TypeError: 'int' object is not callable

>>> from math import sqrt

>>> scope={}

>>> exec "sqrt = 1" in scope

>>> sqrt(4)

2.0

>>> scope['sqrt']

1

>>> len(scope)

2

>>> scope.keys()

['__builtins__', 'sqrt']

#### eval

eval（用于“求&#20540;”）是类&#20284;于exec的内建函数。

exec语句会执行一系列的python语句，而eval会计算python表达式，并返回结果&#20540;。

exec语句并不返回任何对象，因为它本身就是语句。

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

Enter an arithmetic expression: 2*6&#43;8

20