Python 函数:把代码打包复用,编程效率翻倍
🔥 自定义函数 + for 循环,从此告别重复写代码
3. 函数
前两章我们用了 Python 自带函数(如 int、abs)和模块函数(如 math.sqrt)。 本章你将学会:自定义函数、参数、函数调用、for 循环,这是编程的核心基础。
3.1 定义新函数
用 def 关键字定义函数,格式固定:
# 定义函数:打印歌词defprint_lyrics():# 函数体,必须缩进4个空格print("I'm a lumberjack, and I'm okay.")print("I sleep all night and I work all day.")
print_lyrics:函数名(合法变量名即可)
定义后会创建一个函数对象:
print_lyrics
运行结果:
<function __main__.print_lyrics()>
调用函数:
# 调用函数print_lyrics()
运行结果:
I'm a lumberjack, and I'm okay.I sleep all night and I work all day.
3.2 参数
函数可以接收参数,让功能更灵活。
# 定义带参数的函数:打印两次字符串defprint_twice(string):print(string)print(string)
调用时传入参数:
# 传入字符串参数print_twice('Dennis Moore, ')
运行结果:
Dennis Moore, Dennis Moore,
也可以用变量做参数:
line = 'Dennis Moore, '# 变量作为参数传入print_twice(line)
运行结果:
Dennis Moore, Dennis Moore,
3.3 函数互相调用
函数可以在另一个函数内部被调用,实现模块化。
# 定义重复打印函数:word重复n次defrepeat(word, n):print(word * n)spam = 'Spam, '# 调用函数repeat(spam, 4)
运行结果:
Spam, Spam, Spam, Spam,
组合函数输出完整歌词
# 打印前两行deffirst_two_lines(): repeat(spam, 4) repeat(spam, 4)# 打印后三行deflast_three_lines(): repeat(spam, 2)print('(Lovely Spam, Wonderful Spam!)') repeat(spam, 2)# 打印完整一段defprint_verse(): first_two_lines() last_three_lines()# 调用print_verse()
运行结果:
Spam, Spam, Spam, Spam, Spam, Spam, Spam, Spam, Spam, Spam, (Lovely Spam, Wonderful Spam!)Spam, Spam,
3.4 循环重复(for 循环)
用 for + range 实现重复执行代码。
# 循环2次,i依次取0、1for i inrange(2):print(i)
运行结果:
01
循环打印多段歌词:
# 循环打印2段for i inrange(2):print("Verse", i) print_verse()print()
封装成函数:
# 打印n段歌词defprint_n_verses(n):for i inrange(n): print_verse()print()
3.5 变量与参数是局部的
函数内的变量/参数,只在函数内部有效,外部无法访问。
# 拼接并打印两次defcat_twice(part1, part2):# 局部变量cat cat = part1 + part2 print_twice(cat)line1 = 'Always look on the 'line2 = 'bright side of life.'cat_twice(line1, line2)
运行结果:
Always look on the bright side of life.Always look on the bright side of life.
外部访问局部变量会报错:
# 错误:cat是cat_twice内的局部变量print(cat)
运行结果:
NameError: name 'cat' is not defined
3.6 栈图(Stack Diagram)
栈图用来表示函数调用关系与变量作用域:
__main__line1 → 'Always look on the 'line2 → 'bright side of life.'cat_twicepart1 → 'Always look on the 'part2 → 'bright side of life.'cat → 'Always look on the bright side of life.'print_twicestring → 'Always look on the bright side of life.'
3.7 错误追踪(Tracebacks)
函数出错时,Python 会打印完整调用链,帮你定位问题。
# 错误函数:访问不存在的catdefprint_twice(string):print(cat)print(cat)cat_twice(line1, line2)
报错信息会显示:
NameError: name 'cat' is not defined在 print_twice 中出错由 cat_twice 调用
3.8 为什么要用函数?
3.9 调试技巧
3.10 术语表
3.11 练习
3.11.1 助手问题
3.11.2 右对齐函数
写 print_right(text),让字符串最后一个字符在第40列。
3.11.3 金字塔函数
写 triangle(s, height),打印字符金字塔。
LLLLLLLLLLLLLLL
3.11.4 矩形函数
写 rectangle(s, w, h),打印字符矩形。
HHHHHHHHHHHHHHHHHHHH
3.11.5 99瓶啤酒歌
写 bottle_verse(n),打印一段歌词,并用循环打印整首歌。