当前位置: 首页 > news >正文

02 - 第一个 Python 程序

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.py

name=input("你叫什么名字?")print("你好,"+name+"!欢迎来到 Python 的世界")

运行一下:

uv run greet.py

它会问你名字,你输入之后它会跟你打招呼。

有个要注意的地方:input()拿到的东西永远是字符串(就是文字),哪怕你输入的是数字。

age=input("你多大了?")print(type(age))# <class 'str'>

所以你如果要做数学运算,得先转一下类型:

age=input("你多大了?")age=int(age)# 把字符串转成整数print("你明年就",age+1,"岁了")

int()是把文字转成整数的函数。后面会详细讲这些类型转换,现在先有个印象就行。


注释:写给人看的话

写代码的时候经常需要在旁边加点说明,告诉别人(或者以后的自己)这段代码是干嘛的。这些说明叫"注释",Python 解释器会忽略它们。

单行注释用#

# 这是一个注释,Python 不会执行它print("你好")# 行尾也可以写注释

多行注释可以用三个引号:

""" 这是一个多行注释 可以写好几行 通常用来给函数或类写说明文档 """print("你好")

说实话,严格来讲三个引号那个不算注释,它其实是一个没被赋值给任何变量的字符串。但因为 Python 会忽略这种孤立的字符串,效果跟注释差不多。大部分人就直接叫它多行注释了。

注释该写多少?

新手容易走两个极端:要么一行注释都不写,要么每行都写。

我的建议是——写那些"为什么"而不是"是什么"

不太好的注释:

# 把 x 设为 10x=10

这注释说了等于没说,看代码就知道 x 是 10。

好的注释:

# 最大重试次数设为 10,超过就放弃# 因为实际测试发现 10 次已经能覆盖 99% 的情况max_retries=10

这个就解释了"为什么是 10",以后看代码的人(包括三个月后的你自己)会觉得感谢。


代码风格:PEP 8

Python 社区有一套公认的代码规范,叫PEP 8。不用背,大概知道几个要点就行:

缩进用 4 个空格

Python 靠缩进来表示代码块(不像 C/Java 用大括号)。所以缩进不是可选项,是语法的一部分。

# 对的ifTrue:print("缩进了")# 错的,没缩进会报错ifTrue:print("没有缩进")

用 Tab 还是空格?Python 官方推荐空格。VS Code 默认按一下 Tab 会自动转成 4 个空格,所以不用纠结。

变量名用小写加下划线

# 推荐user_name="小明"max_retry_count=3# 不推荐userName="小明"# 这是 Java/JS 的风格UserName="小明"# 这是类的命名方式

运算符两边加空格

# 推荐x=10+5# 不推荐x=10+5

这些规则现在不用死记,VS Code 装了 Python 插件之后,写得不规范它会有提示。写多了自然就习惯了。


一个稍完整的例子

来写一个稍微有意思点的程序,把前面学的东西串起来。

新建文件calculator.py

# 一个超级简单的加法计算器num1=input("请输入第一个数字:")num2=input("请输入第二个数字:")# input 拿到的是字符串,要先转成数字result=float(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里面出了错。

看报错的核心就三步:

  1. 看最后一行是什么错误
  2. 看倒数几行是哪行代码出了问题
  3. 沿着调用链往上追溯

print 调试法

最简单粗暴的方式——在你觉得可能有问题的地方加print()

defprocess(data):print(f"DEBUG: data ={data}")# 看看传入的数据对不对result=data.strip().lower()print(f"DEBUG: result ={result}")# 看看处理后的结果returnresult

虽然原始,但 80% 的 bug 都能用这种方式找到。我自己到现在还经常用。

pdb:Python 内置调试器

pdb 能让你暂停程序,一行一行地执行,随时查看变量的值:

importpdbdefbuggy_function(numbers):total=0forninnumbers:pdb.set_trace()# 程序会在这里暂停total+=nreturntotal buggy_function([1,2,3])

暂停后你可以输入命令:

命令作用
n执行下一行(不进入函数)
s执行下一行(进入函数)
c继续执行到下一个断点
p 变量名打印变量的值
l查看当前代码上下文
q退出调试

Python 3.7+ 还有个更简洁的写法:直接用breakpoint()代替pdb.set_trace()

defbuggy_function(numbers):total=0forninnumbers:breakpoint()# 效果一样,更简洁total+=nreturntotal

VS Code 调试

如果你用 VS Code,调试更直观:

  1. 在代码行号左边点一下,会出现一个红点(断点)
  2. F5启动调试
  3. 程序会在红点处暂停
  4. 左侧面板可以看到所有变量的当前值
  5. 顶部的按钮可以单步执行、继续、跳出等

比 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...是占位符,满足语法要求但什么都不做

面试题

Q1:print()input()的返回值分别是什么?

点击查看答案

print()的返回值是None。它的作用是把内容输出到屏幕,本身不返回有用的值。

input()的返回值是用户输入的字符串(str类型)。哪怕用户输入的是数字123input()返回的也是字符串"123"

Q2:Python 中为什么缩进很重要?如果缩进不一致会怎样?

点击查看答案

Python 用缩进来定义代码块(作用域),不像 C/Java 用{}。缩进决定了哪些代码属于同一个块。

如果缩进不一致(比如混用 Tab 和空格),Python 会报IndentationErrorTabError。所以必须保持一致,推荐全部用 4 个空格。

Q3:type()函数有什么用?type(123)type("123")的结果一样吗?

点击查看答案

type()用来查看一个值的类型。

type(123)返回<class 'int'>(整数)。
type("123")返回<class 'str'>(字符串)。

虽然看起来都是 123,但一个是数字,一个是文字。这在处理input()返回值时特别重要——用户输入的数字其实是字符串。

Q4:float("3.14")int("3.14")都能正常执行吗?

点击查看答案

float("3.14")可以正常执行,返回3.14

int("3.14")会报错ValueError。因为int()只能转换整数字符串(比如"3"),不能直接转换带小数点的字符串。

如果要把"3.14"转成整数,需要先转 float 再转 int:int(float("3.14")),结果是3(直接截断小数部分,不四舍五入)。


上一章 | 下一章:变量与数据类型 →

http://www.jsqmd.com/news/886294/

相关文章:

  • 如何用软件魔法扩展你的Windows数字工作空间
  • 2026这6款神级降AI率工具大曝光,一键把AI检测率精准控到安全区!
  • angular-tree-component核心功能解析:拖拽、复选框与虚拟滚动全攻略
  • 事件幂等性失效导致资损?DeepSeek架构师紧急复盘:4种隐形漏洞+实时熔断配置模板
  • 告别SVN恐惧症:美术策划也能轻松上手的Unity PlasticSCM极简入门(附团队项目拉取实战)
  • 如何用Rust技术栈解决小说下载的三大技术难题
  • AI率总超标?2026年AI写作辅助网站排行榜权威发布,轻松定稿不是梦!
  • 2026实测横评:抖音图片怎么去水印?4款微信小程序对比教你一步到位 - 科技热点发布
  • Dask与核密度矩阵:150GB太阳风数据的分布式密度估计实践
  • 终极指南:如何使用HiveWE快速制作魔兽争霸III地图
  • 2026小红书去水印工具实测:这4款免费无广告的小程序,帮你一步到位 - 科技热点发布
  • 口碑最好的AI论文写作工具推荐(从文献整理到论文成稿全流程)适合全体毕业生
  • 深度解析网络设备权限管理工具:中兴光猫工厂模式与Telnet服务完整指南
  • 单片机引脚不够用?单引脚驱动LCD的硬件时序优化方案
  • Windows 11终极清理优化指南:一键解决系统卡顿与隐私泄露
  • OpenCore Legacy Patcher终极指南:让旧款Mac免费重获新生的完整教程
  • 从收音机到手机:LC振荡器在射频电路里的那些‘隐藏’应用与选型避坑指南
  • HTW1000 烧录器/仿真器 TENX(十速)/海速芯 MCU在线/串联烧录器 单片机开发 嵌入式系统应用
  • 戴森球计划终极蓝图指南:从新手到工厂大师的完整教程
  • AQS与ReentrantLock:从排队抢锁到公平与非公平的工程实践——JUC锁机制的基石
  • 2026年抖音视频去水印最新方法:6种方案实测,这4款小程序一步到位 - 科技热点发布
  • Unity体素雾效VFM2:原理、性能与交互式雾气实现
  • 【DeepSeek注释生成优化实战指南】:20年AI工程师权威拆解3大瓶颈与5步提效法
  • 别再死磕USB HID了!用ESP32的Arduino框架手把手教你实现蓝牙鼠标键盘(附完整代码)
  • 【仅限首批内测开发者访问】Sora 2.1 Beta MOV导出API密钥激活路径曝光:3天后关闭权限窗口
  • 小红书视频怎么下载到手机里?实测6种方法,这4款小程序2026年依然免费好用 - 科技热点发布
  • 6款实用AI智能降重工具 合规程度拉满
  • Java开发转型AI大模型工程师:收藏这份心法+实战项目,轻松上手!
  • 北光恒电:安捷伦N5182B信号源 开机异常、自检报错、输出异常故障排查
  • 【限时解密】Midjourney内部模糊权重矩阵(.json配置文件级干预),仅剩最后83个白名单访问名额