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

(一)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表示换行;

(十二)调试

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

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

语法错误

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

  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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值