1.打印多个参数
你知道,print可用于打印一个表达式,这个表达式要么是字符串,要么将自动转换为字符串。但实际上,你可同时打印多个表达式,条件是用逗号分隔它们:
>>> print('Age:', 42)
Age: 42
如你所见,在参数之间插入了一个空格字符。在你要合并文本和变量值,而又不想使用字符串格式设置功能时,这种行为很有帮助。
>>> name = 'Gumby'
>>> salutation = 'Mr.'
>>> greeting = 'Hello,'
>>> print(greeting, salutation, name)
Hello, Mr. Gumby
如果字符串变量greeting不包含逗号,如何在结果中添加呢?你不能像下面这样做:
print(greeting, ',', salutation, name)
因为这将在逗号前添加一个空格。下面是一种可行的解决方案:
print(greeting + ',', salutation, name)
它将逗号和变量greeting相加。如果需要,可自定义分隔符:
>>> print("I", "wish", "to", "register", "a", "complaint", sep="_")
I_wish_to_register_a_complaint
你还可自定义结束字符串,以替换默认的换行符。例如,如果将结束字符串指定为空字符串,以后就可继续打印到当前行。
print('Hello,', end='')
print('world!')
上述代码打印Hello, world! 仅当这些代码包含在脚本中时才如此。在交互式Python会话中,将分别执行每条语句并打印其内容。
2.导入时重命名
从模块导入时,通常使用
importsomemodule
或使用
fromsomemodule import somefunction
或
fromsomemodule import somefunction, anotherfunction, yetanotherfunction
或
from somemodule import *
仅当你确定要导入模块中的一切时,采用使用最后一种方式。但如果有两个模块,它们都包含函数open,该如何办呢?你可使用第一种方式导入这两个模块,并像下面这样调用函数:
module1.open(...)
module2.open(...)
但还有一种办法:在语句末尾添加as子句并指定别名。下面是一个导入整个模块并给它指定别名的例子:
>>> import math as foobar
>>> foobar.sqrt(4)
2.0
下面是一个导入特定函数并给它指定别名的例子:
>>> from math import sqrt as foobar
>>> foobar(4)
2.0
对于前面的函数open,可像下面这样导入它们:
from module1 import open as open1
from module2 import open as open2
3.赋值魔法
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
这在使用返回元组(或其他序列或可迭代对象)的函数或方法时很有用。假设要从字典中随便获取(或删除)一个键-值对,可使用方法popitem,它随便获取一个键-值对并以元组的方式返回。接下来,可直接将返回的元组解包到两个变量中。
>>> scoundrel = {'name': 'Robin', 'girlfriend': 'Marion'}
>>> key, value = scoundrel.popitem()
>>> key
'girlfriend'
>>> value
'Marion'
这让函数能够返回被打包成元组的多个值,然后通过一条赋值语句轻松地访问这些值。要解包的序列包含的元素个数必须与你在等号左边列出的目标个数相同,否则Python将引发异常。
>>> x, y, z = 1, 2
Traceback (most recent call last):
File "
ValueError: need more than 2 values to unpack
>>> x, y, z = 1, 2, 3, 4
Traceback (most recent call last):
File "
ValueError: too many values to unpack
可使用星号运算符(*)来收集多余的值,这样无需确保值和变量的个数相同,如下例所示:
>>> a, b, *rest = [1, 2, 3, 4]
>>> rest
[3, 4]
还可将带星号的变量放在其他位置。
>>> name = "Albus Percival Wulfric Brian Dumbledore"
>>> first, *middle, last = name.split()
>>> middle
['Percival', 'Wulfric', 'Brian']
赋值语句的右边可以是任何类型的序列,但带星号的变量最终包含的总是一个列表。在变量和值的个数相同时亦如此。
>>> a, *b, c = "abc"
>>> a, b, c
('a', ['b'], 'c')
这种收集方式也可用于函数参数列表中。
2)链式赋值:
链式赋值是一种快捷方式,用于将多个变量关联到同一个值。这有点像并行赋值,但只涉及一个值:
x = y = somefunction()
上述代码与下面的代码等价:
y = somefunction()
x = y
请注意,这两条语句可能与下面的语句不等价:
x = somefunction()
y = somefunction()
3)增强赋值
可以不编写代码x = x + 1,而将右边表达式:中的运算符(这里是+)移到赋值运算符(=)的前面,从而写成x += 1。这称为增强赋值,适用于所有标准运算符,如*、/、%等。
>>> x = 2
>>> x += 1
>>> x *= 2
>>> x
6
增强赋值也可用于其他数据类型(只要使用的双目运算符可用于这些数据类型)。
>>> fnord = 'foo'
>>> fnord += 'bar'
>>> fnord *= 2
>>> fnord
'foobarfoobar'
通过使用增强赋值,可让代码更紧凑、更简洁,同时在很多情况下的可读性更强。
4.代码块:缩进的乐趣
代码块其实并不是一种语句,代码块是一组语句,可在满足条件时执行(if语句),可执行多次(循环),等等。代码块是
通过缩进代码(即在前面加空格)来创建的。
也可使用制表符来缩进代码块。Python将制表符解释为移到下一个制表位(相邻制表位相距8个空格),但标准(也是更佳的)做法是只使用空格(而不使用制表符)来缩进,且每级缩进4个空格。
在同一个代码块中,各行代码的缩进量必须相同。下面的伪代码(并非真正的Python代码)演示了如何缩进:
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
在Python中,使用冒号(:)指出接下来是一个代码块,并将该代码块中的每行代码都缩进相同的程度。发现缩进量与之前相同时,就知道当前代码块到此结束了。(很多用于编程的编辑器和IDE知道如何缩进代码块,可帮助你轻松地正确缩进。)