《Think Python 2e》作业实现(三): 函数
这是什么?
这里是《Think Python 2e》作业实现 !在这里将记录《Think Python 2e》作业的练习记录、终端信息和结果分析。
- 这是《Think Python 2e》哪个版本的作业?
《Think Python:如何像计算机科学家一样思考》第二版。这里主要参考了一个中文网页版《Think Python 2e》中译本。- 可以当成《Think Python 2e》参考答案吗?
这里主要记录了我自己完成作业时所产生的成果及习题总结,基本未参考教材所提供的答案,未免有失规范,参考答案建议还是以 绿茶出版社官方代码 为准。- 不同的解释器版本结果不尽相同,这里用的哪个版本Python解释器?
这里用了Python 3.8.6版解释器,部分用安卓Pydroid 4.01_arm64中的3.8.3版Python解释器,在线解释器用教程推荐的PythonAnywhere中的3.8版Python解释器。
习题3-1: 让最后一个字母在第70列上
【习题 3.1】 输入长度<70的任意字符串,让其最后一个字母在第70列上
- 练习记录:
def right_justify(s):
l=len(s)
print(' '*(70-l)+s)
right_justify('monty')
PS C:\Users\Administrator> python D:\WorkSpace\thinkpython2e\3_1.py
monty
- 结果分析:合理使用字符串拼接(string concatenation)和重复;另外,Python提供了一个名叫 len 的内建函数,可以返回一个字符串的长度
习题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)
PS C:\Users\Administrator> python D:\WorkSpace\thinkpython2e\3_2_1.py
spam
spam
- 变形练习:
def do_twice(f, g):
f()
g()
def print_spam():
print('spam')
def print_bread():
print('bread')
do_twice(print_spam, print_bread)
PS C:\Users\Administrator> python D:\WorkSpace\thinkpython2e\3_2_1.py
spam
bread
- 结果分析:函数能以另一个(或者几个)函数作为实参
【习题 3.2.2】 修改do_twice,使其接受两个实参,一个是函数对象,另一个是值;然后调用这一函数对象两次,将那个值传递给函数对象作为实参
def do_twice(f, s):
f(s)
f(s)
def print_s(s):
print(s)
do_twice(print_s, 'bread')
PS C:\Users\Administrator> python D:\WorkSpace\thinkpython2e\3_2_2.py
bread
bread
- 结果分析:被调用的函数有实参,那么调用时必须提供该实参,这里就是函数 f(s) 中的 s
- 变形练习:
def do_twice(f, s, x):
f(s, x)
f(s, x)
def print_s(s, x):
print(s + ' and ' + x)
do_twice(print_s, 'bread', 'spam')
PS C:\Users\Administrator> python D:\WorkSpace\thinkpython2e\3_2_2.py
bread and spam
bread and spam
【习题 3.2.4】 从本章前面一些的示例中,将 print_twice 函数的定义复制到脚本中;使用修改过的do_twice,调用print_twice两次,将’spam’传递给它作为实参
- 练习记录:
def print_twice(s):
print(s,end=' ')
print(s)
def do_twice(f,s):
f(s)
f(s)
do_twice(print_twice, 'spam')
PS C:\Users\Administrator> python D:\WorkSpace\thinkpython2e\3_2_4.py
spam spam
spam spam
【习题 3.2.5】 定义一个名为do_four的新函数,其接受一个函数对象和一个值作为实参; 调用这个函数对象四次,将那个值作为形参传递给它; 函数体中应该只有两条语句,而不是四条
- 练习记录:
#定义函数 print_spam 以供调用
def print_spam(x):
print(x)
#定义函数 do_twice , 调用两次 print_spam 实现打印 x 两次
def do_twice(f,x):
f(x)
f(x)
#定义函数 do_four , 调用 do_twice 两次,实现打印 x 四次
def do_four(f, x):
do_twice(f, x)
do_twice(f, x)
#执行 do_four(f, x)
do_four(print_spam, 'spam')
PS C:\Users\Administrator> python D:\WorkSpace\thinkpython2e\3_2_5.py
spam
spam
spam
spam
- 结果分析:语句
do_four(print_spam, 'spam')
把实参 print_spam 和 ‘spam’ 赋给函数 do_four , 函数 do_four 中 语句do_twice(f, x)
把实参 print_spam 和 ‘spam’ 赋给函数 do_twice 两次 ,函数 do_twice 中语句f(x)
输入实参 print_spam 和 ‘spam’ 各打印 spam 两次
习题3-3:用函数画网格
【习题 3.3.1】 画2X2网格
- 练习记录:
"""
print(str, end=""),下个打印语句不换行
"""
def print_xline_one():
print("+---------",end="")
def print_xline_twice():
print_xline_one()
print_xline_one()
def print_xline():
print_xline_twice()
print("+")
def print_vline_one():
print("| | |")
def print_vline_twice():
print_vline_one()
print_vline_one()
def print_vline():
print_vline_twice()
print_vline_twice()
def print_grid_one():
print_xline()
print_vline()
def print_grid_twice():
print_grid_one()
print_grid_one()
def print_grid_2():
print_grid_twice()
print_xline()
print_grid_2()
PS C:\Users\Administrator> python D:\WorkSpace\thinkpython2e\3_3_1.py
+---------+---------+
| | |
| | |
| | |
| | |
+---------+---------+
| | |
| | |
| | |
| | |
+---------+---------+
【习题 3.3.2】 画4X4网格
- 练习记录:
"""
print(str, end=""),下个打印语句不换行
"""
def print_xline_one():
print("+---------",end="")
def print_xline_twice():
print_xline_one()
print_xline_one()
def print_xline_four():
print_xline_twice()
print_xline_twice()
def print_xline():
print_xline_four()
print("+")
def print_vline_one():
print("| | | | |")
def print_vline_twice():
print_vline_one()
print_vline_one()
def print_vline():
print_vline_twice()
print_vline_twice()
def print_grid_one():
print_xline()
print_vline()
def print_grid_twice():
print_grid_one()
print_grid_one()
def print_grid_four():
print_grid_twice()
print_grid_twice()
def print_grid_4():
print_grid_four()
print_xline()
print_grid_4()
PS C:\Users\Administrator> python D:\WorkSpace\thinkpython2e\3_3_2.py
+---------+---------+---------+---------+
| | | | |
| | | | |
| | | | |
| | | | |
+---------+---------+---------+---------+
| | | | |
| | | | |
| | | | |
| | | | |
+---------+---------+---------+---------+
| | | | |
| | | | |
| | | | |
| | | | |
+---------+---------+---------+---------+
| | | | |
| | | | |
| | | | |
| | | | |
+---------+---------+---------+---------+
- 变形练习:
"""print(str, end=""),下个打印语句不换行
"""
def print_xline_one():
print("+---------",end="")
def print_xline(x):
for i in range(x):
print_xline_one()
print('+')
def print_vline_one():
print("| ",end=(''))
def print_vline(x):
for i in range(x):
print_vline_one()
print('|')
def print_vlines(x):
for i in range(4):
print_vline(x)
def print_grid(x):
print_xline(x)
print_vlines(x)
def print_grid_x(x):
for i in range(x):
print_grid(x)
print_xline(x)
print_grid_x(6)
PS C:\Users\Administrator> python D:\WorkSpace\thinkpython2e\3_3_3.py
+---------+---------+---------+---------+---------+---------+
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
+---------+---------+---------+---------+---------+---------+
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
+---------+---------+---------+---------+---------+---------+
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
+---------+---------+---------+---------+---------+---------+
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
+---------+---------+---------+---------+---------+---------+
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
+---------+---------+---------+---------+---------+---------+
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
+---------+---------+---------+---------+---------+---------+
- 结果分析:print 函数执行后默认会自动换行,但是可以阻止这个行为,只需要像下面这样,print函数的参数以
end=''
结尾,如下例,输出结果未发生换行:
print('+', end='')
print('-')
+-