七、条件和条件语句

你说的曾经没有我的故事 提交于 2020-03-17 06:42:56

布尔值

真值也称为布尔值,是以在真值方面做出巨大贡献的George Blooe命名的。

用作布尔表达式(如用作if语句中的条件)时,下面的值都将被解释器视为,其它时候都为真。

False None 0 "" [] () {}

在有些语言中,标准的真值为0(表示假)和1(表示真).实际上,True和False不过时0和1的别名,虽然看起来不同。但作用时相同的。

布尔值的True和False属于类型bool,而bool与list和tuple一样,可以用来转换其他的值。

>>> bool('hello world')
True
>>> bool(78)
True
>>> bool(1)
True
>>> bool(0)
False
>>> bool({})
False

  布尔运算符:and not or  (短路逻辑)

在表达式x or y 中,如果x为真,就返回x,否则就返回y:

>>> name = input('Name: ') or 'root'
Name:
>>> name
'root'
>>> name = input('Name: ') or 'root'
Name: ubuntu
>>> name
'ubuntu'
>>> name = input('Name: ') or 'root'
Name:       #输入纯空格了
>>> name
'     '

 断言

让程序在错误条件出现时立即崩溃。

>>> age = 10
>>> assert  age == 15 ,'The age must be 10'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError: The age must be 10

  如果条件不满足,程序立即崩溃。可以在后面加字符串,对断言做出说明。

for

可迭代对象是可使用for循环进行遍历的对象。

只要能够使用for循环,就不要使用while循环。

迭代字典

要遍历字典里面所有关键字,可像遍历序列那样使用普通的for语句。

d = {'x':1, 'y':2, 'z':3}
for key in d:
    print(key,'-->',d[key])

  也可以使用keys等字典方法来获取所有的键。如果只对值感兴趣,可使用d.values。 d.items以元祖的方式返回键值对。for循环的有点之一是,可在其中使用序列解包。

d = {'x':1, 'y':2, 'z':3}
for key, value in d.items():
    print(key, value)

  并行迭代

有时候你可能想同时迭代俩个序列。

names = ['lilei', 'hanmeimei', 'jom']
ages = [13, 14, 15]
for i in range(len(names)):
    print(names[i], 'is', ages[i], 'years old.')

  内置函数zip

它将俩个序列缝合起来,并返回一个由元祖组成的序列。返回值是一个适合迭代的对象,要查看其内容,需用list将其转换为列表。

>>> names = ['lilei', 'hanmeimei', 'jom']
>>> ages = [13, 14, 15]
>>> list(zip(names, ages))
[('lilei', 13), ('hanmeimei', 14), ('jom', 15)]

  缝合后,可在循环中将元祖解包。

names = ['lilei', 'hanmeimei', 'jom']
ages = [13, 14, 15]
for name, age in zip(names, ages):
    print(name, 'is', age, 'years old.')

  函数zip可用于缝合任意数量的序列,需要注意的是,当序列的长度不同时,函数zip将在最短的序列用完后停止。

迭代时获取索引

names = ['lilei', 'hanmeimei', 'jom']
for index, name in enumerate(names):
    print(index, name)

  编号可以不从0开始

names = ['lilei', 'hanmeimei', 'jom']
for index, name in enumerate(names, 5):
    print(index, name)

  反向迭代和排序后再迭代

reversed和sorted.它们类似于列表方法reversed和sort(sorted接受的参数也与sort类似)。但可用于任何序列或可迭代对象,且不就地修改,而是返回反转和排序后的版本。

>>> sorted([7, 5, 45, 8, 9, 52])
[5, 7, 8, 9, 45, 52]
>>> reversed([7, 5, 45, 8, 9, 52])
<list_reverseiterator object at 0x7ff681238b38>
>>> list(reversed([7, 5, 45, 8, 9, 52]))
[52, 9, 8, 45, 5, 7]

 sorted返回的是一个列表,而reversed返回的时一个可迭代对象。

跳出循环

break 跳出这个循环。continue 跳出这次循环,继续下一次循环。

 

循环中的else子句

for i in range(5):
    if i > 3:
        break
else:
    print('hello')
print('world')

 else子句,仅在没有调用break时才执行。

count = 0
while count < 5:
    count += 1
    if count < 0:
        break
else:
    print('hello')
print('world')

 

  

 

简单推导

列表推导是一种从其它列表创建列表得一种方式。

>>> [x * x for x in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

 奇偶数

>>> [x for x in range(1, 101) if x % 2 == 0]
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100]
>>> [x for x in range(1, 101) if x % 2 == 1]
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99]

  还可以添加更多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)]

  pass

有时候什么都不要做,或者是占位符。

  del

对于你不在使用得对象,Python会将其删除(因为没有任何变量或数据结构指向它)。垃圾回收。

使用del不仅会删除到对象本身,还会删除名称本身。

 

>>> x = 1
>>> del x
>>> x
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined

 

  俩个引用

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

  只是删除名称x,并没有删除列表本身(值),在Python中,根本没有办法删除值。因为对于你不在使用得值,Python解释器会立即将其删除。

使用exec和eval执行字符串及计算其结果。

函数exec将字符串作为代码执行。

 

>>> exec('print("hello world")')
hello 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

  为了安全,要提供一个字典来充当命名空间。为此添加第二个参数---字典,用作代码字符串的命名空间。

>>> from math import sqrt
>>> scope = {}
>>> exec("sqrt = 1", scope)
>>> sqrt(4)
2.0
>>> scope['sqrt']
1

  eval

eval是一个类似于exec的内置函数。exec执行一些列Python语句,而eval计算用字符串表示的Python表达式的值。并返回结果。(exec什么都不返回,因为它本身是条件语句)。创建Python计算器:

>>> eval(input("Enter: "))
Enter: 5*6-9+7
28

  与exec一样,也可向eval提供一个命名空间,虽然表达式通常不会像语句那样给变量重新赋值。

  向exec和eval提供命名空间时,可在使用这个命名空间前在其中添加一些值。

 

 

>>> scope = {}
>>> scope['x'] = 1
>>> scope['y'] = 2
>>> eval("x * y",scope)
2

  一个命名空间可用于多次调用exec和eval.

小结

打印语句:你可以使用print语句来打印多个逗号分割值。还可以指定print结尾符。(默认是换行\n)

导入语句:在导入的函数名称过长或者这个名称你已经在使用,可以使用import...as...语句

赋值语句:通过使用序列解包或者链式赋值,可以同时给多个变量赋值。通过增强赋值,可以就地修改变量。

代码块:代码块用于通过缩进将语句编组。代码块可用于条件语句和循环中,还可用于函数和类定义中。

条件语句:条件语句根据条件(布尔表达式)决定是否执行后续代码块。条件语句的一个变种条件表达式。

断言:断言断定某件事(一个布尔表达式)为真,可包含说明为何必须如此的字符串。如果指定的字符串为假,断言将导致程序停止执行。

循环:你可针对序列中的每个元素(如特定范围内的每个数)执行代码块,也可在条件为真时反复执行代码块。要跳过代码块中余下的内容,直接进入下一次迭代,可使用continue语句;要跳出循环,可使用break语句。另外,还可以在循环末尾添加一个else子句,它将在没有执行循环中的任何break时执行。

推导:推导并不是语句,而是表达式。推过列表推导,可从既有列表创建出新列表。

pass、del、exec和eval:pass语句什么都不做,但适合用作占位符。del语句用于删除变量或数据结构的成员,但不能删除值。函数exec用于将字符串作为python程序执行。函数eval计算用字符串表示的表达式并返回结果。

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!