# python之条件-循环和其他语句

+关注继续查看

5.1.1 使用逗号输出

>>> print 'age:' , 42

age: 42

>>>

>>> print 1,2,3

1 2 3

>>> 1,2,3

(1, 2, 3)

>>> print (1,2,3)

(1, 2, 3)

>>>

>>> name = 'Gumby'

>>> salutation = 'Mr'

>>> greeting = 'Hello'

>>> print greeting,salutation,name

Hello Mr Gumby

>>>

print greeting，','，salutation,name

print greeting + ',',salutation,name

print 'Hello，'，

print 'world！'

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

import somemodule

from somemodule import somefunction

from somemodule 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 modulel import open as open2

5.2 赋值魔法

5.2.1 序列解包

>>> x,y,z = 1,2,3

>>> print x,y,z

1 2 3

>>>

>>> x,y = y,x

>>> print x,y,z

2 1 3

>>>

>>> values = 1,2,3

>>> values

(1, 2, 3)

>>> x,y,z = values

>>> x

1

>>>

>>> scoundrel = {'name':'Robin','girlfriend':'Marion'}

>>> key,value = scoundrel.popitem()

>>> key

'girlfriend'

>>> value

'Marion'

>>>

>>> x,y,z = 1,2

Traceback (most recent call last):

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

ValueError: need more than 2 values to unpack

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

Traceback (most recent call last):

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

ValueError: too many values to unpack

>>>

python3.0中有另外一个解包的特性:可以像在函数的参数列表中一样使用星号运算符。

5.2.2 链式赋值

x = y = somefunction()

y = somefunction()

x = y

x = somefunction()

y = somefunction()

5.2.3 增量赋值

>>> x = 2

>>> x += 1

>>> x *= 2

>>> x

6

>>>

>>> fnord = 'foo'

>>> fnord += 'bar'

>>> fnord *= 2

>>> fnord

'foobarfoobar'

>>>

5.3 语句块:缩排的乐趣

this is a line

this is another line:

this is another block

continuing the same block

the last line of this block

phew.there we escaped the inner block

5.4 条件和条件语句

5.4.1 这就是布尔变量的作用

>>> true

Traceback (most recent call last):

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

NameError: name 'true' is not defined

>>> True

True

>>> False

False

>>> True == 1

True

>>> False == 0

True

>>> True + False + 43

44

>>>

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

True

>>> bool(42)

True

>>> bool('')

False

>>> bool(0)

False

>>>

False None 0 “” （） [] {}

5.4.2 条件执行和if 语句

#!/usr/bin/env python

name = raw_input('What is your name?')

if name.endswith('Gumby'):

print 'Hello,Mr.Gumby'

[root@pankuo ~]# ./python.py

[root@pankuo ~]# ./python.py

Hello,Mr.Gumby

5.4.3 else子句

#!/usr/bin/env python

name = raw_input('What is your name?')

if name.endswith('Gumby'):

print 'Hello,Mr.Gumby'

else:

print 'Hello. stranger'

[root@pankuo ~]# ./python.py

Hello. stranger

5.4.4 elif子句

#!/usr/bin/env python

num = input('Enter a number:')

if num > 0 :

print 'The number is positive'

elif num < 0:

print 'The number is negative'

else:

print 'The number is zer0'

[root@pankuo ~]# ./python.py

Enter a number:5

The number is positive

[root@pankuo ~]# ./python.py

Enter a number:0

The number is zer0

5.4.5 嵌套代码块

if name.endswith('Gumby'):

if name.startswith('Mr.'):

print 'hello,Mr.Gumby'

elif name.startswith('Mrs.'):

print 'hello.Mrs.Gumby'

else:

print 'hello.Gumby'

else:

print 'hello.stranger'

5.4.6 更复杂的条件

1.比较运算符

x==y

x〈y

x is y

x is not y

x in y   x是y容器（例如：序列）的成员

x not in y    x不是y容器（例如：序列）的成员

0<age<100

2.相等运算符

〉〉〉“foo”==“foo”

True

〉〉〉“foo”==“bar”

False

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判断两者是否等同  is运算符是判定同一性而不是相等性

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

>>>y=[2,4]

>>>x is not y

True

>>>del x[2]

>>>y[1]=1

>>>y.reverse()

4.in：成员资格运算符

#!/usr/bin/env python

if 's' in name:

print 'your name contains the letter "s".'

else:

print 'your name does not contain the letter "s".'

5.字符串和序列比较

>>> "alpha" < "beta"

True

>>> "a" < "b"

True

>>> "b" < "a"

False

>>>

>>> 'FnOrD'.lower() == 'Fnord'.lower()

True

>>>

>>> [1,2]<[2,1]

True

>>>

>>> [2,[1,4]]<[2,[1,5]]

True

>>>

6.布尔运算符

#!/usr/bin/env python

number=input('Enter a number between 1 and 10: ')

if number <= 10:

if number >=1:

print 'Great!'

else:

print 'wrong!'

else:

print 'Wrong'

#!/usr/bin/env python

number=input('Enter a number between 1 and 10: ')

if number <= 10 and number >=1:

print 'Great!'

else:

print 'Wrong!'

and运算符就是所谓的布尔运算符。它连接两个布尔值，并且在两者都为真时返回真，否则返回假。与它同样的还有两个运算符，or和not。使用这3个运算符就可以随意结合其值。

if ((cash > price) or customer_has_good_credit) and not out_of_stock:

give_goods()

a if b else c 如果b为真，返回a，否则，返回c

5.4.7 断言

>>> age=10

>>> assert 0 < age < 100

>>> age = -1

>>> assert 0 < age < 100

Traceback (most recent call last):

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

AssertionError

>>>

>>> age = -1

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

Traceback (most recent call last):

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

AssertionError: The age must be realistic

>>>

5.5 循环

5.5.1 while循环

x = 1

while x<=100:

print x

x += 1

那么python里面应该如何呢？

name =  ''

while not name:

print 'Hello,%s!' % name    替换name

[root@pankuo ~]# python p.py

Hello,hah!

5.5.2 for循环

while语句非常灵活。它可以用来在任何条件为真的情况下重复执行一个代码块。一般情况下这样就够用了，但是有些时候还得量体裁衣。比如要为一个集合（序列和其他可迭代对象）的每个元素都执行一个代码块。

#!/usr/bin/env python

words = ['this','is','ex','parrot']

for word in words:

print word

[root@pankuo ~]# python p.py

this

is

ex

parrot

>>> range(0,10)

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

>>>

range函数的工作方式类似于分片。它包含下限，但不包含上限

>>> range(11)

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

>>>

for number in range（1，101）:

print number

xrange函数的循环行为类似于range函数，区别在于range函数一次创建整个序列，而xrange一次只创建一个数。当需要迭代一个巨大的序列时xrange会更高效，不过一般情况下不需要过多关注它。

5.5.3 循环遍历字典元素

#!/usr/bin/env python

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

for key in d:

print key,'corresponds to',d[key]

[root@pankuo ~]# python p.py

y corresponds to 2

x corresponds to 1

z corresponds to 3

for key,value in d.items():

print key,'corresponds to',value

5.5.4 一些迭代工具

1.并行迭代

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

ages = [12,45,32,102]

for i in range(len(names)):

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

>>> zip(names,ages)

[('anne', 12), ('beth', 45), ('george', 32), ('damon', 102)]

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

print name,'is ',age,'years old'

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

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

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

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

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

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

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

>>>

range会计算所有的数字，这要花费很长的时间。而使用xrange就没这个问题，它只计算前5个数字。

2.编号迭代

index = 0

for string in strings：

if ‘xxx’ in strings

strings[index] = ‘[censored]’

index +=1

for index，string in enumerate(strings):

if 'xxx' in string:

strings[index] = 'censored'

3.翻转和排序迭代

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

[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'

>>>

5.5.5 跳出循环

1.break

from math import sqrt

for n in range(99,0,-1):

root = sqrt(n)

if root == int(root):

print n

break

>>> range(0,10,2)

[0, 2, 4, 6, 8]

>>>

2.continue

continue语句比break语句用得要少得多，它会让当前的迭代结束，“跳”到下一轮循环的开始。它最基本的意思是”跳过剩余的循环体“，但是不结束循环。当循环体很大而且很复杂的时候，就会很有用，有些时候因为一些原因可能会跳过它----这个时候可以使用continue语句：

for x in seq:

if condition1: continue

if condition2: continue

if condition3: continue

do_something()

do_something_else()

do_anohten_thing()

etc()

for x in seq：

if not (condition1 or condition2 or condition3)：

do_something()

do_something_else()

do_another_thing()

etc()

3.while True/break习语

python 中的while和for循环非常灵活，但一旦使用while语句就会遇到一个需要更多功能的问题。如果需要当用户在提示符下输入单词时做一些事情，并且在用户不输入单词后结束循环。

word='dummy'      哑值

while word:

word = raw_input('Please enter a word:')

#处理word：

print 'The word was' + word

[root@pankuo ~]# python p.py

the word was 1

the word was 2

the word was 3

#!/usr/bin/env python

word = raw_input('Please enter a words:')

while word:

print 'the word was ' + word

word = raw_input('Please enter a words:')

#!/usr/bin/env python

while True:

word = raw_input('Please enter a words:')

if not word: break

print 'the word was ' + word

while True的部分实现了一个永远不会自己停止的循环。但是在循环内部的if语句中加入条件可以的，在条件满足时调用break语句。这样以来就可以在循环内部任何地方而不是只在开头终止循环。if/break语句自然地将循环分为两部分：第一部分负责初始化，第2部分则在循环条件为真的情况下使用第1部分内初始化好的数据。

5.5.6 循环中德else子句

broke_out = False

for x in seq:

do_something(x)

if condition(x)

broke_out = True

break

do_something_else(x)

if not broke_out:

print "I didn't break out!"

from math import sqrt

for n in range(99,55,-1)

root=sqrt(n)

if root == int(root):

print n

break

else:

print "Didn't find it!"

[root@pankuo ~]# python p.py

81

100以内的最大平方数81

5.6 列表推导式------轻量级循环

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

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

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

[0, 9, 36, 81]

>>>

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

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

result = []

for x in range(3):

for y in range(3)

result.append((x,y))

>>> girls = ['alice','bernice','clarice']

>>> boys = ['chris','arnold','bob']

>>> [b+'+'+g for b in boys for g in girls if b[0] == g[0]]

['chris+clarice', 'arnold+alice', 'bob+bernice']

girls = ['alice','bernice','clarice']

boys = ['chris','arnold','bob']

letterGirls = {}

for girl in girls:

letterGirls.setdefault(girl[0]，[]).append(girl)

print [b+'+'+g for b in boys for g in letterGirls[b[0]]]

[root@pankuo ~]# python p.py

['chris+clarice', 'arnold+alice', 'bob+bernice']

5.7 三人行

5.7.1 什么都没发生

>>> pass

>>>

if name == ‘Ralph Auldus Melish':

print 'Welcome!'

elif name == 'Enid':

#还没完

elif name == 'Bill Gates'

if name == ‘Ralph Auldus Melish':

print 'Welcome!'

elif name == 'Enid':

#还没完

pass

elif name == 'Bill Gates'

5.7.2 使用del删除

>>> scoundrel = {'age':42,'first name':'Robin','last name':'of Locksley'}

>>> robin = scoundrel

>>> scoundrel

{'last name': 'of Locksley', 'first name': 'Robin', 'age': 42}

>>> robin

{'last name': 'of Locksley', 'first name': 'Robin', 'age': 42}

>>> scoundrel = None

>>> robin

{'last name': 'of Locksley', 'first name': 'Robin', 'age': 42}

>>> robin = None

>>> robin

>>> scoundrel

>>>

>>> x=1

>>> del x

>>> x

Traceback (most recent call last):

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

NameError: name 'x' is not defined

>>>

x和y都指向同一个列表。但是删除x并不会影响y。原因就是删除的只是名称，而不是列表本身。事实上，在python中是没有办法删除值的（也不需要过多考虑删除值得问题，因为在某个值不再使用的时候，python解释器会负责内存的回收）

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

>>> y=x

>>> y[1]="Python"

>>> x

['hello', 'Python']

>>> del x

>>> y

['hello', 'Python']

>>>

5.7.3 使用exec和eval执行和求值字符串

1.exec

>>> exec "print 'hellp,world!'"

hellp,world!

>>>

>>> from math import sqrt

>>> exec "sqrt = 1"

>>> sqrt(4)

Traceback (most recent call last):

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

TypeError: 'int' object is not callable

>>>

exec语句最有用的地方在于可以动态地创建代码字符串。如果字符串是从其他地方获得的---很有可能是用户---那么几乎不能确定其中到底包含什么代码。所以为了安全起见，可以增加一个字典，起到命名空间的作用

>>> from math import sqrt

>>> scope={}

>>> exec 'sqrt = 1' in scope

>>> sqrt(4)

2.0

>>> scope['sqrt']

1

>>>

>>> len(scope)

2

>>> scope.keys()

['__builtins__', 'sqrt']

>>>

2.eval

eval用于’求值‘是类似于exec的内建函数。exec语句会执行一些列python语句，而eval会计算python表达式，并且返回结果值，例如，可以使用下面的代码创建一个python计算器：

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

Enter an arithmetic expression:6+1*3

9

>>>

>>> scope={}

>>> scope['x']=2

>>> scope['y']=3

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

6

>>>

exec或者eval调用的作用域也能在另外一个上面使用：

>>> scope = {}

>>> exec 'x=2' in scope

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

4

>>>

本文转自潘阔 51CTO博客，原文链接：http://blog.51cto.com/pankuo/1661439，如需转载请自行联系原作者

Python——条件判断
1,Python代码缩进规则: 具有相同缩进的代码视为代码块； 2,缩进请严格按照Python的习惯写法：4个空格，不要使用Tab，更不要混合Tab和空格，否则很容易造成因为缩进引起的语法错误。
858 0

62 0
python爬虫实战实现XPath和lxml | python爬虫实战之六

1064 0

1432 0
Python爬虫入门一之综述

3172 0
+关注
21114

0