Python基础-第009课:布尔值、格式化字符串、循环
9.1 布尔值
用作布尔表达式时,下面的值将被解析器视为假(False),而其它的各种值视为真,
False 、 None 、0、 “” 、 () 、[]、 {}
bool函数与list、str和tuple一样,可用来转换其他的值。
>>> bool('I think, therefore I am')
True
>>> bool(42)
True
>>> bool('')
False
>>> bool(0)
False
注意 虽然
[]和""
都为假(即bool([]) == bool("") == False
),但它们并不相等(即[] != ""
)。对其他各种为假的对象来说,情况亦如此(一个更显而易见的例子是() != False
)。
9.1.1 更复杂的条件
1. 比较运算符
表9-1 Python比较运算符
表 达 式 | 描 述 |
---|---|
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也支持链式比较:可同时使用多个比较运算符,如0 < age < 100
。
9.2 格式化字符串
用字符串的format()
方法,每个替换字段都用花括号括起,其中可能包含名称,还可能包含有关如何对相应的值进行转换和格式设置的信息。
在最简单的情况下,替换字段没有名称或将索引用作名称。
>>> "{}, {} and {}".format("first", "second", "third")
'first, second and third'
>>> "{0}, {1} and {2}".format("first", "second", "third")
'first, second and third'
然而,索引无需像上面这样按顺序排列。
>>> "{3} {0} {2} {1} {3} {0}".format("be", "not", "or", "to")
'to be or not to be'
命名字段方法。
>>> from math import pi
>>> "{name} is approximately {value:.2f}.".format(value=pi, name="π")
'π is approximately 3.14.'
当然,关键字参数的排列顺序无关紧要。在这里,我还指定了格式说明符.2f
,并使用冒号将其与字段名隔开。它意味着要使用包含2位小数的浮点数格式。如果没有指定.2f
,结果将如下:
>>> "{name} is approximately {value}.".format(name="π", value=pi)
'π is approximately 3.141592653589793.'
最后,如果变量与替换字段同名,还可使用一种简写。在这种情况下,可使用f字符串——在字符串前面加上f。
>>> from math import pi
>>> f"π is roughly {pi}."
"π is roughly 3.141592653589793."
在这里,创建最终的字符串时,将把替换字段pi替换为变量pi的值。这与下面这个更明确一些
的表达式等价:
>>> "π is roughly {pi}.".format(pi=pi)
"π is roughly 3.141592653589793."
9.3 循环
看一个简单的例子,假设要打印1~100的所有数。同样,你可采用笨办法。
print(1)
print(2)
print(3)
...
print(9)
print(10)
但如果你愿意使用笨办法,就不会求助于Python了,不是吗?
9.4 while 循环
为避免前述示例所示的繁琐代码,能够像下面这样做很有帮助:
x = 1
while x <= 10:
print(x)
x += 1
你还可以使用循环来确保用户输入名字,如下所示:
name = ''
while not name:
name = input('Please enter your name: ')
print('Hello, {}!'.format(name))
请尝试运行这些代码,并在要求你输入名字时直接按回车键。你会看到提示信息再次出现,因为name还是为空字符串,这相当于假。
提示 如果你只是输入一个空格字符(将其作为你的名字),结果将如何呢?试试看。程序将接受这个名字,因为包含一个空格字符的字符串不是空的,因此不会将name视为假。这无疑是这个小程序的一个瑕疵,但很容易修复:只需将
while not name
改为:
while not name or name.isspace()
或while not name.strip()
即可。
9.5 for循环
while语句非常灵活,可用于在条件为真时反复执行代码块。这在通常情况下很好,但有时候你可能想根据需要进行定制。一种这样的需求是为序列(或其他可迭代对象)中每个元素执行代码块。
注意 基本上,可迭代对象是可使用for循环进行遍历的对象。以后将详细介绍可迭代对象和迭代器。就目前而言,只需将可迭代对象视为序列即可。为此,可使用for语句:
words = ['this', 'is', 'an', 'ex', 'parrot']
for word in words:
print(word)
或
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
for number in numbers:
print(number)
鉴于迭代(也就是遍历)特定范围内的数是一种常见的任务,Python提供了一个创建范围的内置函数。
>>> range(0, 10)
range(0, 10)
>>> list(range(0, 10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> tuple(range(0, 10))
(0, 1, 2, 3, 4, 5, 6, 7, 8,9)
范围类似于切片。它们包含起始位置(这里为0),但不包含结束位置(这里为10)。在很多情况下,你都希望范围的起始位置为0。实际上,如果只提供了一个位置,将把这个位置视为结束位置,并假定起始位置为0。
>>> range(10)
range(0, 10)
下面的程序打印数1~100:
for number in range(1,101):
print(number)
注意,相比前面使用的while循环,这些代码要紧凑得多。
提示 只要能够使用for循环,就不要使用while循环。