02 - 第一个 Python 程序终于要开始写代码了。这章我们会写几个小程序把最基本的东西过一遍。Hello World 的仪式感学任何编程语言第一件事都是打印一句Hello World。这算是程序员圈子里的一个传统了据说从 1978 年的 C 语言教材就开始了。打开你的项目在hello.py里写上print(Hello World)然后在终端里运行uv run hello.py屏幕上出现Hello World了恭喜你你已经是一个 Python 程序员了虽然还很初级哈哈。你可能会觉得这也太简单了吧。确实但别小看这一行——你已经学会了 Python 里用得最多的函数之一print()。print() 的几种用法print()最基本的用法就是打印一段文字print(我在学 Python)你也可以打印数字不用加引号print(42)print(3.14)想打印多个东西用逗号隔开就行print(我叫,小明,今年,25,岁)输出我叫 小明 今年 25 岁逗号会自动在每个内容之间加一个空格。你也可以换分隔符print(2024,05,25,sep-)输出2024-05-25或者让打印完不换行print(你好,end)print(世界)输出你好世界在同一行默认情况下print()打印完会自动换行end就是告诉它结尾什么都别加。跟用户对话input()光让程序说话没意思得让它能听你说话。input()就是干这个的——它会暂停程序等你在键盘上输入点东西。新建一个文件greet.pynameinput(你叫什么名字)print(你好name欢迎来到 Python 的世界)运行一下uv run greet.py它会问你名字你输入之后它会跟你打招呼。有个要注意的地方input()拿到的东西永远是字符串就是文字哪怕你输入的是数字。ageinput(你多大了)print(type(age))# class str所以你如果要做数学运算得先转一下类型ageinput(你多大了)ageint(age)# 把字符串转成整数print(你明年就,age1,岁了)int()是把文字转成整数的函数。后面会详细讲这些类型转换现在先有个印象就行。注释写给人看的话写代码的时候经常需要在旁边加点说明告诉别人或者以后的自己这段代码是干嘛的。这些说明叫注释Python 解释器会忽略它们。单行注释用## 这是一个注释Python 不会执行它print(你好)# 行尾也可以写注释多行注释可以用三个引号 这是一个多行注释 可以写好几行 通常用来给函数或类写说明文档 print(你好)说实话严格来讲三个引号那个不算注释它其实是一个没被赋值给任何变量的字符串。但因为 Python 会忽略这种孤立的字符串效果跟注释差不多。大部分人就直接叫它多行注释了。注释该写多少新手容易走两个极端要么一行注释都不写要么每行都写。我的建议是——写那些为什么而不是是什么。不太好的注释# 把 x 设为 10x10这注释说了等于没说看代码就知道 x 是 10。好的注释# 最大重试次数设为 10超过就放弃# 因为实际测试发现 10 次已经能覆盖 99% 的情况max_retries10这个就解释了为什么是 10以后看代码的人包括三个月后的你自己会觉得感谢。代码风格PEP 8Python 社区有一套公认的代码规范叫PEP 8。不用背大概知道几个要点就行缩进用 4 个空格Python 靠缩进来表示代码块不像 C/Java 用大括号。所以缩进不是可选项是语法的一部分。# 对的ifTrue:print(缩进了)# 错的没缩进会报错ifTrue:print(没有缩进)用 Tab 还是空格Python 官方推荐空格。VS Code 默认按一下 Tab 会自动转成 4 个空格所以不用纠结。变量名用小写加下划线# 推荐user_name小明max_retry_count3# 不推荐userName小明# 这是 Java/JS 的风格UserName小明# 这是类的命名方式运算符两边加空格# 推荐x105# 不推荐x105这些规则现在不用死记VS Code 装了 Python 插件之后写得不规范它会有提示。写多了自然就习惯了。一个稍完整的例子来写一个稍微有意思点的程序把前面学的东西串起来。新建文件calculator.py# 一个超级简单的加法计算器num1input(请输入第一个数字)num2input(请输入第二个数字)# input 拿到的是字符串要先转成数字resultfloat(num1)float(num2)print(num1,,num2,,result)试试运行uv run calculator.py输入两个数字看看结果。这个程序虽然简单但它已经具备了程序的基本要素输入、处理、输出。你可能会想如果我输入的不是数字呢比如输入abc试试看你会看到一个报错信息。这是正常的——我们还没学怎么处理错误输入后面异常处理那章会专门讲。现在先别管知道有这回事就行。调试技巧出错了怎么办写代码一定会遇到报错这很正常。关键是你得能看懂报错信息知道怎么找到问题。看懂报错信息Python 的报错信息traceback是从下往上读的。举个例子defcalculate(x):return10/xdefmain():calculate(0)main()运行后的报错Traceback (most recent call last): File test.py, line 7, in module main() File test.py, line 5, in main calculate(0) File test.py, line 2, in calculate return 10 / x ZeroDivisionError: division by zero最后一行告诉你出了什么错ZeroDivisionError: division by zero除以零。倒数几行告诉你错在哪File test.py, line 2, in calculate第 2 行的calculate函数里。上面的部分是调用链main()调用了calculate(0)calculate里面出了错。看报错的核心就三步看最后一行是什么错误看倒数几行是哪行代码出了问题沿着调用链往上追溯print 调试法最简单粗暴的方式——在你觉得可能有问题的地方加print()defprocess(data):print(fDEBUG: data {data})# 看看传入的数据对不对resultdata.strip().lower()print(fDEBUG: result {result})# 看看处理后的结果returnresult虽然原始但 80% 的 bug 都能用这种方式找到。我自己到现在还经常用。pdbPython 内置调试器pdb 能让你暂停程序一行一行地执行随时查看变量的值importpdbdefbuggy_function(numbers):total0forninnumbers:pdb.set_trace()# 程序会在这里暂停totalnreturntotal buggy_function([1,2,3])暂停后你可以输入命令命令作用n执行下一行不进入函数s执行下一行进入函数c继续执行到下一个断点p 变量名打印变量的值l查看当前代码上下文q退出调试Python 3.7 还有个更简洁的写法直接用breakpoint()代替pdb.set_trace()defbuggy_function(numbers):total0forninnumbers:breakpoint()# 效果一样更简洁totalnreturntotalVS Code 调试如果你用 VS Code调试更直观在代码行号左边点一下会出现一个红点断点按F5启动调试程序会在红点处暂停左侧面板可以看到所有变量的当前值顶部的按钮可以单步执行、继续、跳出等比 pdb 好用多了不用记命令。推荐新手直接从 VS Code 调试开始。pass 和 …占位符有时候你需要一个代码块但暂时不想写具体内容。比如先搭个框架# 先用 pass 占位以后再来写defnot_ready_yet():pass# 什么都不做但语法上需要一行代码classMyError(Exception):pass# 自定义异常经常这样写ifcondition:do_something()else:pass# 暂时不处理这个分支pass就是一个什么都不做的语句纯粹为了满足语法要求Python 不允许空的代码块。...三个点叫 Ellipsis也能当占位符用效果跟pass一样defnot_ready_yet():...classMyError(Exception):...用哪个都行看个人习惯。我一般用pass但有些人喜欢...因为更短。在一些科学计算库如 NumPy里...有特殊含义那是另一回事了。本章小结print()用来输出内容可以打印多个值、自定义分隔符input()用来获取用户输入拿到的永远是字符串注释用#单行或...多行写为什么而不是是什么Python 用缩进表示代码块推荐 4 个空格代码风格遵循 PEP 8不用刻意背编辑器会帮你看报错信息最后一行是错误类型往上找是哪行代码出了问题pdb/breakpoint()和 VS Code 断点是两种常用的调试方式pass和...是占位符满足语法要求但什么都不做面试题Q1print()和input()的返回值分别是什么点击查看答案print()的返回值是None。它的作用是把内容输出到屏幕本身不返回有用的值。input()的返回值是用户输入的字符串str类型。哪怕用户输入的是数字123input()返回的也是字符串123。Q2Python 中为什么缩进很重要如果缩进不一致会怎样点击查看答案Python 用缩进来定义代码块作用域不像 C/Java 用{}。缩进决定了哪些代码属于同一个块。如果缩进不一致比如混用 Tab 和空格Python 会报IndentationError或TabError。所以必须保持一致推荐全部用 4 个空格。Q3type()函数有什么用type(123)和type(123)的结果一样吗点击查看答案type()用来查看一个值的类型。type(123)返回class int整数。type(123)返回class str字符串。虽然看起来都是 123但一个是数字一个是文字。这在处理input()返回值时特别重要——用户输入的数字其实是字符串。Q4float(3.14)和int(3.14)都能正常执行吗点击查看答案float(3.14)可以正常执行返回3.14。int(3.14)会报错ValueError。因为int()只能转换整数字符串比如3不能直接转换带小数点的字符串。如果要把3.14转成整数需要先转 float 再转 intint(float(3.14))结果是3直接截断小数部分不四舍五入。上一章 | 下一章变量与数据类型 →