【Think Python】Python笔记(五)条件和递归
程序员文章站
2022-04-25 20:26:29
...
(一)Floor division 和求余(modulus)
//
运算符先进行除法,之后将结果保留到整数;/
运算符是保留小数的,生成一个float类型的数;%
求余运算符,将两个数相除,返回它们的余数;
(二)布尔表达式(boolean expressions)
- 布尔表达式的结果是true或者false;
==
是关系运算符之一;- 其他关系运算符:
!=
,>
,<
,>=
,<=
;
(三)逻辑运算符(logical operators)
- 一共有三个逻辑运算符:
and
,or
,not
;- 严格地说,逻辑运算符的运算数应该是布尔类型,但是Python并不是严格要求;任何非0的数都是真(true)
(四)有条件的执行(conditional execution)
if x > 0:
print('x is positive')
注意:
- 语句体中出现的语句数量并没有限制,但是至少要有一条;
- 有时候需要使用
pass
作为占位符;
(五)二选一条件句(Alternative execution)
if x % 2 == 0:
print('x is even')
else:
print('x is odd')
(六)链式条件句
语法:
if x < y:
print(1)
elif x > y:
print(-1)
else:
print(0)
(七)嵌套句型(Nested conditionals)
if x == y:
print(0)
else:
if x>y:
print(1)
else:
print(-1)
- 要尽量少使用嵌套句型,因为这样会造成代码的可读性下降;
- 使用逻辑语句通常是减少嵌套的好办法;
if 0 < x:
if x < 10:
print('x is a positive single-digit number.')
使用逻辑语句之后:
if 0 < x and x < 10:
print('x is a positive single-digit number.')
当然Python提供了更加简洁的方法:【这种在C语言中不允许出现】
if 0 < x < 10:
print('x is a positive single-digit number.')
(八)递归(Recursion)
一个函数可以调用其他函数,也可以调用自己;
def count_down(n):
if n<=0:
print('BlastOff')
else:
print(n)
count_down(n-1)
- 当执行
count_down(3)
发生的事情:
-
return
语句可以直接退出函数:执行流程马上返回调用者,函数剩余的语句不会执行
def print_n(s, n):
if n<=0:
return
print(s)
print_n(s, n-1)
- 上面简单的例子也许用for循环很容易做到,但是当复杂的时候就很难用for循环达到目的,这时候递归是必要的;
(九)递归函数的堆栈图
每当一个函数被调用的时候,Python便生成一个新的栈帧,用于保存函数的局部变量和形参;对于一个递归函数,在堆栈上可能同时有多个栈帧;
- 下面是n = 3调用count_down的堆栈图:
- 通常情况下,堆栈的顶部是
__main__
栈帧,在__main__
没有创建变量,也没有传递任何实参,所以是空的; - 对于形参n,四个
countdown
栈帧中有不同的值;n = 0
的情况称之为基础情形(base case),是递归跳出的条件;
(十)无限递归
- 当一个递归永远都达不到基础情形,将会永远地进行递归的调用,这个程序永远不会终止,称之为无限递归
- 在大多数编程环境里,一个具有无限递归的程序并非永远不会终止。 当达到最大递归深度时,Python会报告一个错误信息:
File "<stdin>", line 2, in recurse File "<stdin>", line 2, in recurse File "<stdin>", line 2, in recurse . . . File "<stdin>", line 2, in recurse RuntimeError: Maximum recursion depth exceeded
(十一)键盘输入
- python中提供一个内建函数
input
,这个函数可以暂停程序,并等待用户的输入;按下Enter
键,程序恢复执行;input
是以字符串的形式返回用户的输入;通常,在从用户那里获得输入之前,告诉用户需要输入什么;input
接受提示语作为实参;
name = input('What is your name?\n')
其中的\n
表示换行;
(十二)调试
当出现
语法错误
和运行时错误
,错误信息会包含很多信息,信息量很大,但是最有用的部分是:
- 哪一类错误;
- 错误出现在哪里;
语法错误
语法错误通常很容易找到,但是需要注意(不可见的):
- 空格;
- 制表符;
>>> x = 5
>>> y = 6
File "<stdin>", line 1
y = 6
^
IndentationError: unexpected indent
问题在于第二行缩进的一个空格,需要注意Python是通过缩进来识别代码块,因此,缩进很重要;
通常,错误信息指向发现错误的地方, 但是实际的错误可能发生在代码中更早的地方, 有时在前一行。
运行时错误
运行时错误也存在上述的问题;
import math
signal_power = 9
noise_power = 10
ratio = signal_power // noise_power
decibels = 10 * math.log10(ratio)
print(decibels)
提示下面的错误:
Traceback (most recent call last):
File "snr.py", line 5, in ?
decibels = 10 * math.log10(ratio)
ValueError: math domain error
这是因为ratio的值为0;
上一篇: 《Think Python》笔记1