欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【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)发生的事情:

【Think Python】Python笔记(五)条件和递归

  • return语句可以直接退出函数:执行流程马上返回调用者,函数剩余的语句不会执行
def print_n(s, n):
    if n<=0:
        return
    print(s)
    print_n(s, n-1)
  • 上面简单的例子也许用for循环很容易做到,但是当复杂的时候就很难用for循环达到目的,这时候递归是必要的;

(九)递归函数的堆栈图

每当一个函数被调用的时候,Python便生成一个新的栈帧,用于保存函数的局部变量和形参;对于一个递归函数,在堆栈上可能同时有多个栈帧;

  • 下面是n = 3调用count_down的堆栈图:

【Think Python】Python笔记(五)条件和递归

  • 通常情况下,堆栈的顶部是__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表示换行;

(十二)调试

当出现语法错误运行时错误,错误信息会包含很多信息,信息量很大,但是最有用的部分是:

  • 哪一类错误;
  • 错误出现在哪里;

语法错误

语法错误通常很容易找到,但是需要注意(不可见的):

  1. 空格;
  2. 制表符;
>>> 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;

相关标签: Python