>>> 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 (expected 3)
Python 3.0中有另外一个解包的特性:可以像在函数的参数列表中一样使用星号运算符。例如,a, b, *rest = [1, 2, 3, 4]最终会在 a 和 b 都被赋值之后将所有其他的参数都是收集到 rest 中。
2. 链式赋值
链式赋值(chained assignment)是将同一个赋值给多个变量的捷径。
x = y = somefunction()
3. 增量赋值
将表达式运算符(本例中是 + -) 放置在赋值运算符 = 的左边,写成 x +=1。这种写法叫做增量赋值。
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 zero')
3. 嵌套代码块
name = raw_input('What is your name? ')
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')
4. 更复杂的条
4.1 比较运算符
表达式 描述
x==y x 等于 y
x < y x 小于 y
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 容器的成员
在Python 3.0中,比较不兼容类型的对象已经不再可行。
在Python中比较运算和赋值运算一样是可以连接的——几个运算符可以连在一起使用,比如:0 < age < 100。
4.2 相等运算符
如果想要知道两个东西是否相等,应该使用相等运算符,即两个等号 == :
>>> "foo"=="foo"
True
>>> "foo"=="bar"
False
4.3 is:同一性运算符
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 判定两者是否等同(同一个对象)。
4.4 in:成员资格运算符
4.5 字符串和序列比较
字符串可以按照字母顺序排列进行比较。
>>> "alpha" < "beta"
True
其他的序列也可以用同样的方式进行比较,不过比较的不是字符而是元素的其他类型。
>>> [1, 2] < [2, 1]
True
4.6 布尔运算符
and , or 和 not 运算符就是所谓的布尔运算符。
5. 断言
>>> 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.1 while 循环
>>> while x <= 100:
... print(x)
... x += 1
...
5.2 for 循环
>>> words = ['this', 'is', 'an', 'ex', 'parrot']
>>> for word in words:
... print(word)
...
因为迭代(循环的另外一种说法)某范围的数字是很常见的,所以有个内建的范围函数 range 供使用:
>>> for number in range(1, 101):
... print(number)
...
5.3 循环遍历字典元素
一个简单的 for 语句就能循环字典的所有键,就像处理序列一样:
>>> d = {'x':1, 'y':2, 'z':3}
>>> for key in d:
... print(key, 'corresponds to', d[key])
...
z corresponds to 3
x corresponds to 1
y corresponds to 2
d.items 方法会将键 - 值对作为元组返回,for循环的一大好处就是可以循环中使用序列解包:
>>> for key, value in d.items():
... print(key, 'corresponds to', d[key])
...
>>> while True:
... word = input('Please enter a word: ')
... if not word: break
... print('The word was ' + word)
...
while True 的部分实现了一个永远不会自己停止的循环。但是在循环内部的 if 语句中加入条件可以的,在条件满足时调用 break 语句。
5.6 循环中的 else 子句
在循环中增加一个 else 子句 —— 它仅在没有调用 break 时执行。
>>> from math import sqrt
>>> for n in range(99, 81, -1):
... root = sqrt(n)
... if root == int(root):
... print(n)
... break
... else:
... print("Didn't find it")
...
Didn't find it
六、列表推导式
列表推导式(list comprehension)是利用其它列表创建新列表的一种方法。它的工作方式类似于 for 循环:
>>> [x*x for x in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
可以增加一个if部分添加到列表推导式:
>>> [x*x for x in range(10) if x % 3 == 0]
[0, 9, 36, 81]
也可以增加更多 for 语句的部分:
>>> [(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)]
也可以和if子句联合使用,像以前一样:
>>> 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']