第3章 函数
练习 3-1:输入长度<70的任意字符串,让其最后一个字母在第70列上
【习题 3.1.1】 编写一个函数 right_justify,接收一个字符串形参 s,并打印出足够的前导空白,以达到最后一个字符显示在第70列上。
>>> right_justify('monty')
monty
提示:可以利用字符串的拼接和重复特性。另外,Python提供了一个内置名为 len
的函数,返回一个字符串的长度,所以 len(‘allen’) 的值是5。
【求解】
先计算s的长度l,前导空白=空格*(70-l):
>>> def right_justify(s):
... l = len(s)
... print(' '*(70-l)+s)
...
>>> right_justify('monty')
monty
将len(s)带入l,还能更剪短点:
>>> def right_justify(s):
... print(' '*(70-len(s))+s)
...
>>> right_justify('monty')
monty
练习 3-2:在函数中调用另一个函数
函数对象是一个值,可以将它赋值给变量,或者作为实参传递。例如,do_twice 是一个函数,接收一个函数对象作为实参,并调用它两次:
def do_twice(f):
f()
f()
下面是一个使用 do_twice 来调用一个 print_spam 函数两次的示例:
def print_spam():
print('spam')
do_twice(print_spam)
【习题 3.2.1】 将这个示例存入脚本并测试它。
【求解】
代码:
def do_twice(f):
f()
f()
def print_spam():
print('spam')
do_twice(print_spam)
运行结果:
spam
spam
【习题 3.2.2】 修改 do_twice,让他接收两个实参,一个是函数对象,另一个是一个值,它会调用函数对象两次,并传入那个值作为实参。
【求解】 这让我想起了代数 y=g(f(x),x)
代码:
def do_twice(f,x):
f(x)
f(x)
def print_spam(x):
print(x)
do_twice(print_spam,'spam')
运行结果:
spam
spam
【习题 3.2.3】 将本章前面介绍的函数 print_twice 的定义复制到你的脚本中。
【求解】
def print_twice(bruce):
print(bruce)
print(bruce)
【习题 3.2.4】 使用修改版的 do_twice 来调用 print_twice 两次,并传入实参 ‘spam’。
【求解】
代码:
def do_twice(f,x):
f(x)
f(x)
def print_twice(bruce):
print(bruce)
print(bruce)
do_twice(print_twice,'spam')
运行结果:
spam
spam
spam
spam
【习题 3.2.4】 定义一个新的函数 do_four,接收一个函数对象与一个值,使用这个值作为实参调用函数4次。这个函数的函数体应该只有2条语句,而不是4条。
【求解】 在 do_four 里调用 do_twice 两次,从而实现调用实参函数4次(2×2)
代码:
#执行函数f(x)两次
def do_twice(f,x):
f(x)
f(x)
#通过执行do_twice(f,x)两次,实现执行f(x)四次
def do_four(f,x):
do_twice(f,x)
do_twice(f,x)
#定义最终被调用的函数
def print_spam(x):
print(x)
#执行将'spam'打印四次
do_four(print_spam,'spam')
执行结果:
spam
spam
spam
spam