像计算机科学家一样学习python(5)

有返回值的函数+迭代

Python学习笔记-像计算机科学家一样学习python(5)

有返回值的函数

使用增量开发和脚手架代码(scaffolding), 可以节省大量调试的时间。

isinstance函数,可以用以检查实参的类型。如:instance(n, int)

练习

6-2

Python
def ack(m, n):
        if m == 0:
                return(n+1)
        elif m > 0 and n == 0:
                return(ack(m-1, 1))
        elif m > 0 and n > 0:
                return(ack(m-1, ack(m, n-1)))
        else:
                return('No result')
print(ack(3, 4))

如果数字稍微大一点,就会出现:RecursionError: maximum recursion depth exceeded in comparison

6-5

Python
def gcd(a, b):
        if b == 0:
                return(a)
        else:                
                 r = a % b 
                 return(gcd(b, r))

print(gcd(18,9))

迭代

练习

7-1

Python
def square_root(a):
         x = 3
         while True:
                 
                 print(x)
                 y=(x + a/x) / 2
                 if y == x:
                         break
                 else:
                         x = y
square_root(4)              

练习的函数本身不难写,但是我在如何让函数对齐的问题上出现了问题。我们可以通过f-string来解决这个问题。Python基础之好玩的字符串格式化f-string格式

我们需要用到的是不足补零的用法。

如果我们想在不足指定宽度的时候不是补空格,而是补数字0,可以像这样 {salary:08}

Python
def calcTax(salary):
 tax = int(salary) *25/100
 aftertax = int(salary) *75/100
 print(f'税前薪资是:{salary:08}元, 缴税:{tax:08.1f}元, 税后薪资是:{aftertax:08.1f}元')
 
calcTax(8320)
calcTax(15023)
calcTax(100030)

运行结果如下:

Python
税前薪资是:00008320元, 缴税:002080.0元, 税后薪资是:006240.0元
税前薪资是:00015023元, 缴税:003755.8元, 税后薪资是:011267.2元
税前薪资是:00100030元, 缴税:025007.5元, 税后薪资是:075022.5元

借鉴这个用法,可以写出:

Python
import math
def square_root(a):
         x = 3
         while True:
                 
                 print(x)
                 y=(x + a/x) / 2
                 if y == x:
                         break
                 else:
                         x = y
def text_square_root():
         a = 1
         x = 3
         print('a      mysqrrt(a)     math.sqrt(a)   diff          ')
         print('-      ----------     ------------   ----          ')
         for i in range(10):
                 while True:
                         y=(x + a/x) / 2
                         if y == x:
                                 print(f'{a:<04.1f}  {y:<13.11}  {math.sqrt(a):<13.11}  {abs(y-math.sqrt(a)):<13.11}\n')
                                 break
                         else:
                                 x = y                  
                 a = a + 1
text_square_root()

7-2

Python
def eval_loop():
    while True:
        line = input('>')
        if line == 'done':
            break
        print(eval(line))
    print('Done!')
eval_loop()
最后编辑于
文章链接: http://pheustal.com/2019/12-07/thinkpython
本作品采用CC-BY-SA许可。