05- 条件控制语句
1.1 条件判断语句(if语句)
1.1.1 单分支选择结构
单分支选择结构语法如下所示,其中表达式后面冒号“:”是不可缺少的,表示一个语句块的开始,并且语句块必须做相应的缩进,议案是以四个空格为缩进单位。
if 表达式:
语句块
当表达式的值为True或其他与True等价的值时,表示条件满足语句块被执行,否则该语句块不被执行,而是继续执行后面的代码。下面的代码演示了单分支选择结构的法:
x = input('Input two numbers:')
a,b = map(int,x.split())
if a>b :
a,b = b,a #序列解包,交换两个变量的值
print(a,b)
在Python中,代码的缩进非常重要,所及你是体现代码逻辑关系的重要方式,同一个代码块必须保证相同的缩进量。在实际开发中,只要遵循一定的约定,Python代码的排版是可以降低要求的。例如下面的代码,虽然不建议这样写,但确实是可以执行的。
>>> if 3>2:print('ok')
...
ok
>>> if True:print(3);print(5)
...
3
5
1.2 基本输入输出
input()和print()是python的基本输入输出参数,前者用来接收用户的键盘输入,后者用来把制定的格式输出到标准控制台或者指定的文件对象。不论用户输入什么内容,input()哟率作为字符串对待,必要时可以使用内置函数Int(),float()或eval()对用户输入的内容进行转换。
>>> x = input('Please input:')
Please input:345
>>> x
'345'
>>> type(x) #把用户的输入作为字符串对待
<class 'str'>
>>> int(x) #转换为整数
345
>>> eval(x) #对字符串求值。或类型转换
345
>>> x=input('Please input:')
Please input:[1,2,3]
>>> x
'[1,2,3]'
>>> type(x)
<class 'str'>
>>> eval(x)
[1, 2, 3]
>>> x=input('Please input:') #不论用户输入了什么,都作为一个字符串来对待
Please input:'hello world'
>>> x
"'hello world'" #不论用户输入了什么,都作为一个字符串来对在
>>> eval(x) #如果本来就想输入字符串,就不用输入引号了。
'hello world'
该函数用来获取用户的输入,input()调用后,程序会立即暂停,等待用户输入,用户输入完内容之后,点击回车程序才会继续向下执行。输入完成以后,其所输入的内容会以返回值的形式返回。
用户
内置函数print()用户输出信息到标准控制台或指定文件,语法格式为:
print(value1,value2,...,sep='',end='\n',file=sys.stdout.flush=False)
其中。seq参数之前为需要输出的内容(可以有多个);sep参数用于指定数据之间的分割符,默认为空格。file参数用于指定输出位置,默认为标准控制台,也可以重定向输出到文件。例如:
>>> print(1,3,5,7,sep='\t') #修改默认分隔符
1 3 5 7
>>> for i in range(10): #修改end参数,每个输出之后不换行
... print(i,end=' ')
0 1 2 3 4 5 6 7 8 9
>>> with open('test.txt','a+') as fp:
... print('Hello World!',file=fp) #重定向,将内容输出到文件中
1.3 双分支选择结构
双分支选择结构的语法为:
if 表达式:
语句块1
else:
语句块2
当表达式的值为True或其他等价值时,执行语句块1,否则执行语句块2。语句块1或语句块2总有一个会执行,然后执行后面的代码,如图所示:
下面的代码通过鸡兔同笼问题演示了双分支结构的用法。
jitu,tui=map(int,input('请输入鸡兔总数和腿总数:').split())
tu=(tui-jitu*2)/2
if int(tu) == tu:
print('鸡:{0},兔{1}'.format(int(jitu-tu),int(tu)))
else:
print('数据不准确,无解')
另外,python还提供了一个三元运算符,并且在三元运算符构成的表达式中还可以嵌套三元运算符,可以实现与选择结构相似的结果。
value1 if condition else value2
当表达式condition的值与True等价时,表达式的值为value1,否则表达式的值为value2。另外,value1和value2本身也是复杂表达式,也可以包含函数调用,甚至可以是三元运算构成的表达式。这个结构的表达式也具有惰性求值的特点。
>>> a=5
>>> print(6) if a>3 else print(5)
6
>>> print(6 if a>3 else 5) #虽然结果与上一行代码一样,但代码含义不同
6
>>> b=6 if a>13 else 9 #赋值运算符的优先级非常低
>>> b
9
>>> x=math.sqrt(9) if 5>3 else random.randint(1,100) #还没导入math模块
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'math' is not defined
>>> import math
>>> x=math.sqrt(9) if 5>3 else random.randint(1,100) #还没导入random模块,但表达式5>3的值为True,所以可以正常运行
>>> x=math.sqrt(9) if 2>3 else random.radnint(1,100) #条件表达式2>3的值为False,需要计算第二个表达式,但此时还没导入random.所以出错。
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'random' is not defined
>>> import random #导入random,成功执行。
>>> x=math.sqrt(9) if 2>3 else random.randint(1,100)
虽然三元运算符可以嵌套使用,可以实现浮渣的多分支选择结构的效果,但这样的代码可读性非常的差,不建议使用,在下面的代码中,函数的定义为f=lambda x:x*x
>>> f=lambda x:x *x
>>> x=3
>>> (1 if x>2 else 0) if f(x)>5 else ('a' if x<5 else 'b')
1
>>> x=0
>>> (1 if x>2 else 0) if f(x)>5 else ('a' if x<5 else 'b')
'a'
>>>