跳到主要内容
Python 核心语法实战:变量、流程控制与函数详解 | 极客日志
Python AI 算法
Python 核心语法实战:变量、流程控制与函数详解 Python 核心语法涵盖变量类型、运算符、输入输出、流程控制、函数定义、列表元组字典及文件操作。通过实例演示动态类型特性、缩进规则、循环控制及标准库应用。掌握这些基础有助于编写自动化脚本及数据处理程序,避免常见错误如除零异常或作用域混淆。适合编程初学者快速构建知识体系。
日志猎手 发布于 2026/3/28 更新于 2026/4/25 0 浏览Python 作为一门优雅且强大的编程语言,凭借易上手、用途广的特点,成为很多人入门编程的首选。无论是数据分析、人工智能,还是 Web 开发、自动化脚本,Python 都能胜任。但想要用好 Python,扎实的基础语法是关键。本文将结合系统的语法知识,从简单的运算到数据持久化的文件操作,带你一站式吃透 Python 核心语法。
变量与数据类型:程序的'原材料仓库'
变量就像快递盒,用来装不同类型的数据;数据类型则是快递盒上的标签,告诉我们里面装的是文件、水果还是电子产品。类型系统其实是在对变量进行'归类',相同类型的变量往往具有类似的特性和使用规则。
Python 的变量规则和其他语言大差不差,关键在于 Python 不用手动指定数据类型,赋值后会自动识别,即动态类型特性,这是它的一大特色。动态类型特性是一把双刃剑:对于中小型程序,可以大大节约代码量;对于大型程序,则提高了模块之间的交互成本。
常见数据类型及操作
数据类型 定义方式 核心操作 适用场景 整数(int) num = 10加减乘除、取余(%)、整除(//) 计数、编号等整数场景 浮点数(float) price = 9.9同整数,注意精度问题 金额、重量等小数场景 字符串(str) name = "Python"拼接(+)、切片([0:2])、替换(replace) 文本存储与处理 列表(list) nums = [1,2,3]增(append)、删(pop)、改(nums[0]=0) 存储多个可变数据 元组(tuple) info = ("Tom",20)只能查,不能改 存储固定不变的数据(如坐标) 字典(dict) student = {"name":"Tom","age":20}按键取值(student["name"])、增删键值对 存储键值对应的数据(如个人信息) 集合(set) s = {1,2,3}去重、交集(&)、并集( )
在 Python 中,单引号构成的字符串和双引号构成的字符串没有区别,'hello' 和 "hello" 是完全等价的。
关键易错点解析
可变 vs 不可变类型 :列表、字典、集合是可变类型(能修改内部数据),整数、浮点数、字符串、元组是不可变类型(修改会生成新对象)。错误示例:s = "hello"; s[0] = "H"(报错,字符串不可变);正确示例:s = "hello"; s = "Hello"(重新赋值生成新字符串)。
:元组用小括号,列表用中括号;元组不能修改,列表可以。新手常犯把元组当成列表修改,导致报错。
列表与元组的区别
字典的键要求 :必须是不可变类型(如字符串、整数),不能用列表当键。错误示例:dict = {[1]:"a"}(报错);正确示例:dict = {(1):"a"}(用元组当键)。
运算符:程序的'计算器 + 判断器' 运算符就像数学里的加减乘除和逻辑判断,是实现数据运算和条件判断的核心工具。重点记清优先级和实用技巧。
算术运算符 :+(加)、-(减)、*(乘)、/(除)、%(取余)、//(整除)、**(幂运算)。实例:print(7//3) # 输出 2(整除取整数部分);print(2**3) # 输出 8(2 的 3 次方)。
除零异常 :/、//、%的除数不能为 0,否则会报错(ZeroDivisionError)。
%求余的正负 :结果的正负和被除数一致(比如 7%3=1,-7%3=2,7%-3=-2)。
print (7 % 3 )
print (-7 % 3 )
print (7 % -3 )
比较运算符 :==(等于)、!=(不等于)、>(大于)、<(小于)、>=(大于等于)、<=(小于等于)。注意:比较结果是布尔值(True/False),实例:print(5==5) # 输出 True。
逻辑运算符 :and(与)、or(或)、not(非)。短路特性:and 前为 False 则不执行后面;or 前为 True 则不执行后面。实例:print(0 and 5) # 输出 0(前面为 False,短路)。
赋值运算符 :=、+=、-=、*=、/=(简化运算)。实例:a = 5; a +=3 # 等价于 a = a+3,结果 a=8。
链式赋值 :同时给多个变量赋同一个值。
多元赋值 :同时给多个变量赋不同值(常用于交换变量)。
a = b = 10
print (a, b)
x = 10
y = 20
x, y = y, x
print (x, y)
⚠️ 注意:Python 没有 ++ 和 -- 运算符(比如 a++、a--),如果需要自增 / 自减,用 a += 1 或 a -= 1。
成员运算符 :in(在...内)、not in(不在...内)。实例:print("a" in "abc") # 输出 True;print(4 in [1,2,3]) # 输出 False。
优先级避坑:算术运算符 > 比较运算符 > 逻辑运算符 > 赋值运算符。不确定时加括号,比如 (3+2)*4 比 3+2*4 更清晰,避免出错。
注释:代码的'笔记本' (1)单行注释 :#开头。适合简短解释,#后面的内容都会被视为注释。
(2)多行注释 :三引号包裹。适合长段解释(比如函数功能、文件说明),用 """ 或 ''' 包裹。
""" 这是多行注释的第一行
这是多行注释的第二行
常用于函数/文件的开头,说明功能
"""
def calc_sum (a, b ):
''' 计算两个数的和
参数:a -> 第一个数,b -> 第二个数
返回值:a + b 的结果
'''
return a + b
输入输出:程序的交互窗口 程序需要和用户交互:用户输入数据(比如成绩),程序输出结果(比如平均分)。Python 中最基础的交互方式是控制台输入输出。
print() 是 Python 内置函数,用于把内容输出到控制台(比如 PyCharm 的下方窗口、Windows 的 CMD)。
print ("Hello Python" )
print (10 + 20 )
print (avg)
name = "张三"
age = 20
print ("姓名:" , name, "年龄:" , age)
如果想让输出更美观(比如 '姓名:张三,年龄:20'),可以用 f-string:在字符串前加 f,用 {变量/表达式} 嵌入内容。
name = "张三"
age = 20
score = 89.5
print (f"姓名:{name} ,年龄:{age} " )
print (f"平均分:{score} ,总分:{score * 3 } " )
input() 函数用于读取用户在控制台输入的内容,返回值永远是字符串类型(即使输入的是数字,也需要手动转换类型)。
语法:变量 = input("提示信息"),其中'提示信息'会显示在控制台,告诉用户该输入什么。
name = input ("请输入你的姓名:" )
print (f"你好,{name} !" )
age = input ("请输入你的年龄:" )
age = int (age)
print (f"明年你{age + 1 } 岁" )
score = float (input ("请输入你的成绩:" ))
score1 = float (input ("请输入第 1 个分数:" ))
score2 = float (input ("请输入第 2 个分数:" ))
score3 = float (input ("请输入第 3 个分数:" ))
score4 = float (input ("请输入第 4 个分数:" ))
avg = (score1 + score2 + score3 + score4) / 4
print (f"4 个分数的平均分为:{avg} " )
流程控制:让程序'做选择''重复做' 默认情况下,程序是'从上到下'顺序执行的。但实际场景中,我们需要程序'根据条件做选择'(比如成绩及格与否)或'重复做一件事'(比如计算 100 次循环)——这就需要流程控制语句。
顺序语句是最简单的流程:代码从第一行到最后一行,依次执行,没有跳转。
print ("第一步:输入成绩" )
score = float (input ("请输入成绩:" ))
print ("第二步:判断是否及格" )
if score >= 60 :
print ("及格" )
else :
print ("不及格" )
print ("第三步:程序结束" )
条件语句用 if、if-else、if-elif-else 表示'如果…就…否则…'的逻辑,缩进是关键(Python 用缩进表示'代码块',通常是 4 个空格)。
if 条件表达式:
代码块(条件为 True 时执行)
if 条件表达式:
代码块 1 (条件为 True 时执行)
else :
代码块 2 (条件为 False 时执行)
if 条件 1 :
代码块 1 (条件 1 为 True 时执行)
elif 条件 2 :
代码块 2 (条件 1 为 False ,条件 2 为 True 时执行)
elif 条件 3 :
代码块 3 (条件 1 、2 为 False ,条件 3 为 True 时执行)
...
else :
代码块 n(所有条件都为 False 时执行)
⚠️ 注意:elif 是'else if'的缩写,不能写成 else if(会报错);且条件是'互斥'的,只要有一个条件成立,后续条件就不再判断。
示例 :判断年份是否为闰年(闰年规则:能被 400 整除,或能被 4 整除但不能被 100 整除):
year = 2024
if year % 100 == 0 :
if year % 400 == 0 :
print (f"{year} 是闰年" )
else :
print (f"{year} 是平年" )
else :
if year % 4 == 0 :
print (f"{year} 是闰年" )
else :
print (f"{year} 是平年" )
如果条件语句的代码块暂时没有内容,需要用 pass 占位(否则会报错)——pass 表示'什么都不做'。
score = 70
if score >= 60 :
pass
else :
print ("需要补考" )
循环语句用于'重复执行一段代码',Python 中常用 while 循环和 for 循环。
while 条件表达式:
循环体(条件为 True 时执行)
sum_result = 0
num = 1
while num <= 100 :
sum_result += num
num += 1
print (f"1~100 的和为:{sum_result} " )
⚠️ 注意:如果循环体中没有让条件变为 False 的语句(比如忘记写 num += 1),循环会'无限执行'(死循环),需要手动停止程序。
for 循环比 while 更简洁,主要用于'遍历可迭代对象'(比如列表、元组、字符串,或用 range() 生成的序列)。
for 循环变量 in 可迭代对象:
循环体(每次从可迭代对象中取一个值给循环变量,执行一次循环体)
range() 用于生成一个整数序列,常用三种写法:
range(n):生成 0 ~ n-1 的序列(如 range(5) → 0,1,2,3,4);
range(start, end):生成 start ~ end-1 的序列(前闭后开,如 range(1,5) → 1,2,3,4);
range(start, end, step):生成 start ~ end-1 的序列,步长为 step(如 range(1,10,2) → 1,3,5,7,9)。
for i in range (1 , 11 ):
print (i)
示例 2:计算 1~100 的和(for 循环版)
sum_result = 0
for i in range (1 , 101 ):
sum_result += i
print (f"1~100 的和为:{sum_result} " )
s = "Python"
for char in s:
print (char)
break 和 continue 用于控制循环的执行流程:
break:结束整个循环 ,跳出循环体;
continue:结束本次循环 ,直接进入下一次循环。
for i in range (1 , 6 ):
if i == 3 :
print (f"第{i} 个包子有虫,不吃了!" )
break
print (f"吃完第{i} 个包子" )
示例 2:continue——吃包子跳过第 3 个
for i in range (1 , 6 ):
if i == 3 :
print (f"第{i} 个包子有虫,跳过!" )
continue
print (f"吃完第{i} 个包子" )
函数:代码的'复用神器' 如果一段代码需要重复使用(比如计算不同区间的和),每次都复制粘贴会很麻烦——修改时要改几十次。这时候就需要函数:把重复的代码封装起来,需要时直接'调用',不用重复写。
函数就像一个'工厂':输入'原材料'(参数),经过'加工'(函数体),输出'产品'(返回值)。它的核心作用是代码复用和逻辑封装。
比如计算'a 到 b 的和',不用函数需要重复写循环;用函数后,只需定义一次,调用时传不同的 a 和 b 即可:
sum1 = 0
for i in range (1 , 101 ):
sum1 += i
print (sum1)
sum2 = 0
for i in range (300 , 401 ):
sum2 += i
print (sum2)
def calc_sum (a, b ):
sum_result = 0
for i in range (a, b+1 ):
sum_result += i
print (sum_result)
calc_sum(1 , 100 )
calc_sum(300 , 400 )
def 函数名 (形参列表):
函数体(需要执行的代码)
[return 返回值]
def:关键字,用于声明函数;
函数名:遵循变量名规则,建议用有意义的单词(如 calc_sum);
形参列表:函数的'输入',多个参数用逗号分隔,可空(无参数);
函数体:函数的核心逻辑,需要缩进;
return:函数的'输出',执行到 return 时函数结束,返回值给调用者。
def add (x, y ):
result = x + y
return result
函数名 (实参列表)
返回值变量 = 函数名 (实参列表)
实参列表:传给函数的'实际值',个数和形参一致;
函数调用时,实参会赋值给形参(如 add(10, 20) 中,10→x,20→y)。
total = add(10 , 20 )
print (total)
add(30 , 40 )
函数必须'先定义,后调用'(否则会报错 NameError);
函数定义时,函数体不会执行;只有调用时才会执行。
调用函数时,实参的个数必须和形参一致,否则会报错。比如 def add(x, y) 需要 2 个实参,传 1 个或 3 个都会报错:
可以给形参设置'默认值'——调用时如果不传该参数,就用默认值;传了就用实参值。
语法:def 函数名 (形参 1, 形参 2=默认值,形参 3=默认值):,有默认值的参数必须放在无默认值参数的后面(否则报错)。
def add (x, y, debug=False ):
if debug:
print (f"计算{x} + {y} " )
return x + y
print (add(10 , 20 ))
print (add(10 , 20 , True ))
默认情况下,实参是'按位置'传给形参(第一个实参给第一个形参,第二个给第二个)。但可以用'关键字参数'显式指定实参传给哪个形参,顺序可以任意。
语法:函数名 (形参名 1=实参 1, 形参名 2=实参 2)
def test (x, y ):
print (f"x={x} , y={y} " )
test(10 , 20 )
test(y=20 , x=10 )
函数的返回值用 return 语句指定,有以下特性:
一个函数可以有多个 return 语句,但执行到第一个 return 时函数就会结束;
一个函数可以返回多个值,用逗号分隔,接收时用多个变量(或元组)接收;
如果没有 return,函数默认返回 None(表示'无值')。
def is_odd (num ):
if num % 2 == 0 :
return False
return True
print (is_odd(10 ))
print (is_odd(11 ))
def get_point ():
x = 10
y = 20
return x, y
x, y = get_point()
print (x, y)
point = get_point()
print (point)
_, y = get_point()
print (y)
def print_hello ():
print ("Hello" )
result = print_hello()
print (result)
变量不是在所有地方都能使用——它的'有效范围'称为作用域。Python 中变量作用域主要分两种:
只能在函数内部使用,出了函数就失效;
函数调用结束后,局部变量会被销毁。
def test ():
num = 10
print (num)
test()
可以在所有函数外部使用;
函数内部可以'读取'全局变量,但要'修改'全局变量,需要用 global 关键字声明(否则会被视为局部变量)。
num = 10
def test ():
print (num)
test()
num = 10
def test ():
global num
num = 20
test()
print (num)
⚠️ 注意:if、for、while 等语句块不会产生作用域——在这些语句块中定义的变量,外部也能使用:
for i in range (1 , 5 ):
num = i
print (num)
def add (x, y ):
return x + y
def calc_avg (a, b, c ):
total = add(a, add(b, c))
return total / 3
avg = calc_avg(10 , 20 , 30 )
print (avg)
递归是一种特殊的嵌套调用:函数内部调用自己。它的核心是'把大问题拆成小问题',需要满足两个条件:
存在'递归结束条件'(否则会无限递归,导致栈溢出);
每次递归时,参数要'逼近'结束条件。
示例:递归计算 n 的阶乘(n! = n × (n-1) × ... × 1)
def factorial (n ):
if n == 1 :
return 1
return n * factorial(n - 1 )
print (factorial(5 ))
⚠️ 注意:无限递归会导致'栈溢出'(RecursionError),比如忘记写结束条件:
def factorial (n ):
return n * factorial(n - 1 )
单一职责 :一个函数只做一件事(比如 add 只算和,calc_avg 只算平均);
逻辑与交互分离 :函数内部尽量不做控制台输入输出(比如 calc_sum 只返回和,不打印;打印交给调用者);
注释清晰 :用文档字符串说明函数功能、参数、返回值(方便他人使用)。
def calc_sum (a, b ):
""" 计算区间 [a, b] 内所有整数的和(包含 a 和 b)
参数:
a: int,区间的起始整数
b: int,区间的结束整数(需大于等于 a)
返回值:
int,区间 [a, b] 的和
"""
if b < a:
raise ValueError("结束值 b 不能小于起始值 a" )
sum_result = 0
for i in range (a, b+1 ):
sum_result += i
return sum_result
total = calc_sum(1 , 100 )
print (f"1~100 的和为:{total} " )
列表和元组:批量存储数据的'容器' 列表和元组是 Python 中用于批量表示序列型数据的核心结构,二者功能相似但存在'可变 / 不可变'的关键差异——文档中用'散装辣条'比喻列表(可随时增减),用'包装辣条'比喻元组(固定不可改),非常直观。
列表是一种可修改的序列结构,用于批量保存任意类型的数据(数字、字符串、布尔值等均可混合存储)。当需要存储的数据集数量不确定或需要动态调整时,优先使用列表。
带初始值的列表:直接在 [] 中填写元素,元素类型可混合:
alist = [1 , 'hello' , True ]
print (alist)
alist = []
alist = list ()
print (type (alist))
列表通过 [下标] 访问元素,下标从 0 开始计数,也支持负数下标(表示'倒数第 N 个'):
alist = [1 , 2 , 3 , 4 ]
print (len (alist))
修改元素:通过 [下标] = 新值 修改,下标必须在有效范围内(0 ~ len(alist)-1),否则报错:
alist = [1 , 2 , 3 , 4 ]
alist[2 ] = 100
print (alist)
alist = [1 , 2 , 3 , 4 ]
print (alist[2 ])
print (alist[-1 ])
切片通过 [start:end:step] 获取连续的子列表,规则为前闭后开区间(包含 start,不包含 end),step 为步长(默认 1),支持省略边界和负步长:
alist = [1 ,2 ,3 ,4 ]
print (alist[100 :200 ])
alist = [1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10 ]
print (alist[::2 ])
print (alist[::-1 ])
alist = [1 , 2 , 3 , 4 ]
print (alist[1 :])
print (alist[:-1 ])
print (alist[:])
基础切片(获取下标 1 到 3 的子列表,不包含 3):
alist = [1 , 2 , 3 , 4 ]
print (alist[1 :3 ])
alist = [1 ,2 ,3 ,4 ]
i = 0
while i < len (alist):
print (alist[i])
i += 1
alist = [1 ,2 ,3 ,4 ]
for i in range (len (alist)):
print (f"下标 {i} :{alist[i]} " )
alist = [1 ,2 ,3 ,4 ]
for elem in alist:
print (elem)
extend(列表):将另一个列表的元素追加到当前列表(修改原列表):
alist = [1 ,2 ,3 ]
blist = [4 ,5 ,6 ]
alist.extend(blist)
print (alist)
print (blist)
alist = [1 ,2 ,3 ]
blist = [4 ,5 ,6 ]
print (alist + blist)
remove(值):(注意不要以为是下标)按元素值删除(仅删除第一个匹配值,值不存在报错):
alist = [1 ,2 ,3 ,4 ]
alist.remove(2 )
print (alist)
pop():删除并返回列表末尾元素;pop(下标):删除并返回指定下标元素:
alist = [1 ,2 ,3 ,4 ]
alist.pop()
alist.pop(1 )
print (alist)
insert(下标,元素):在指定下标位置插入(会移动后续元素,效率低):
alist = [1 ,2 ,3 ,4 ]
alist.insert(1 , 'hello' )
print (alist)
append(元素):在列表末尾添加(尾插,效率高):
alist = [1 ,2 ,3 ,4 ]
alist.append('hello' )
print (alist)
index(值):返回元素的下标(值不存在报错):
alist = [1 ,2 ,3 ,4 ]
print (alist.index(2 ))
in:判断元素是否在列表中,返回布尔值(True/False):
alist = [1 ,2 ,3 ,4 ]
print (2 in alist)
print (10 in alist)
元组与列表结构相似,但创建后不可修改(不能新增、删除、修改元素)。当数据集需要'只读保护'时,优先使用元组。
元组用 () 表示,创建方式与列表类似,但需注意单个元素的元组必须加逗号(避免与括号表达式混淆):
atuple = (1 , 'hello' , True )
single_tuple = (1 ,)
print (single_tuple)
atuple = ()
atuple = tuple ()
print (type (atuple))
atuple1 = (1 ,2 )
atuple2 = (3 ,4 )
print (atuple1 + atuple2)
atuple = (1 ,2 ,3 ,4 )
for elem in atuple:
print (elem)
print (2 in atuple)
print (atuple.index(3 ))
atuple = (1 ,2 ,3 ,4 )
print (atuple[2 ])
print (atuple[1 :3 ])
数据安全 :传递元组给函数时,无需担心函数修改数据(列表可能被修改);
可作为字典的 key :字典的 key 要求是'可哈希对象'(不可变),元组不可变可哈希,而列表可变不可哈希,无法作为字典 key。
字典:键值对映射的'查询表' 字典是 Python 中用于存储键值对(key-value)的结构,类似于 java 的哈希,核心作用是'通过 key 快速查找 value',类似生活中的'字典'(通过拼音查汉字)、'学号查学生'。
字典中,key 是唯一的(不能重复),value 可重复且支持任意类型;key 与 value 是'一对一映射',通过 key 能直接定位到 value,查询效率极高。
字典用 {} 表示,key 与 value 之间用 : 分隔,键值对之间用 , 分隔。文档推荐多键值对时分行书写,代码更清晰:
student = {'id' : 1 , 'name' : 'zhangsan' , 'score' : 80 }
student = {
'id' : 1 ,
'name' : 'zhangsan' ,
'score' : 80 ,
}
print (student)
adict = {}
adict = dict ()
print (type (adict))
用 in 判断 key 是否存在:返回布尔值,避免报错:
student = {'id' : 1 , 'name' : 'zhangsan' }
print ('score' in student)
用 [key] 获取 value:key 不存在则报错(KeyError):
student = {'id' : 1 , 'name' : 'zhangsan' }
print (student['id' ])
字典通过 [key] = value 实现新增或修改,逻辑为:
若 key 不存在:新增键值对;
若 key 已存在:修改 value;
student = {'id' : 1 , 'name' : 'zhangsan' }
student['score' ] = 90
student['name' ] = 'lisi'
print (student)
用 pop(key) 删除指定 key 的键值对,key 不存在报错:
student = {'id' : 1 , 'name' : 'zhangsan' , 'score' : 80 }
student.pop('score' )
print (student)
字典遍历的核心是'遍历 key',再通过 key 获取 value,文档提供 4 种常见方式:
student = {'id' : 1 , 'name' : 'zhangsan' , 'score' : 80 }
for key in student:
print (f"{key} : {student[key]} " )
用 keys() 获取所有 key :返回 dict_keys 类型(支持遍历,类似列表):
print (student.keys())
for key in student.keys():
print (key)
用 values() 获取所有 value :返回 dict_values 类型:
print (student.values())
for value in student.values():
print (value)
用 items() 获取所有键值对 :返回 dict_items 类型(每个元素是 (key, value) 元组):
print (student.items())
for key, value in student.items():
print (f"{key} : {value} " )
字典的 key 必须是'可哈希对象'(即能通过 hash() 函数计算出固定哈希值的类型),明确:
不支持的 key 类型 :list(列表)、dict(字典)等可变类型(不可哈希,报错):
hash ([1 ,2 ,3 ])
hash ({'a' :1 })
支持的 key 类型 :int(整数)、str(字符串)、bool(布尔值)、tuple(元组)等不可变类型:
print (hash (1 ))
print (hash ('hello' ))
print (hash (()))
文件:数据持久化的'硬盘容器' 变量存储的数据在程序 / 电脑重启后会丢失,而文件能将数据持久化存储到硬盘,是程序与外部数据交互的核心方式。文档重点讲解'文本文件'的操作(最基础、最常用)。
文件的本质 :硬盘上的一段二进制数据,通过'文件名 + 路径'唯一标识;
常见文件类型 (文档列举):
文本文件:.txt(纯文本,人类可读);
可执行文件:.exe、.dll(机器可执行);
媒体文件:.jpg(图片)、.mp4(视频);
办公文件:.docx(Word)、.ppt(PPT)。
要操作文件,必须先通过'路径'告诉程序文件的位置,文档分两种路径:
从'盘符'开始的完整路径,如 D:/program/qq/Bin/QQ.exe,特点是'唯一、不依赖基准目录',新手推荐使用(不易出错)。
路径分隔符:Windows 支持 \ 或 /,代码中推荐用 /(避免 \ 的转义问题);
示例:D:/test.txt(D 盘根目录下的 test.txt 文件)。
以'当前程序所在目录'为基准的路径(如 ./test.txt 表示程序同目录下的 test.txt),文档暂不展开(新手易混淆,建议先掌握绝对路径)。
文件操作必须遵循'打开→操作→关闭'的流程,文档详细说明了每个步骤的用法与注意事项。
用 Python 内建函数 open() 打开文件,返回'文件对象'(后续读写操作依赖此对象),语法:
文件对象 = open (文件路径,打开方式,encoding=编码方式)
核心参数 :
文件路径:字符串,绝对路径(如 D:/test.txt)或相对路径;
打开方式:字符串,控制文件的读写权限,文档重点讲 3 种:
r:只读模式(默认),文件不存在则报错;
w:只写模式,文件不存在则创建,文件存在则清空原有内容;
a:追加模式,文件不存在则创建,写入内容追加到文件末尾(不清空原有内容);
encoding:字符串,指定文件编码(处理中文必须设置,如 utf-8、gbk)。
打开失败 :路径错误或文件不存在时,抛出 FileNotFoundError:
open ('D:/不存在的文件.txt' , 'r' )
f = open ('D:/test.txt' , 'r' , encoding='utf-8' )
用文件对象的 write(内容) 方法写入,内容必须是字符串:
f = open ('D:/test.txt' , 'r' )
f.write('hello' )
f = open ('D:/test.txt' , 'a' , encoding='utf-8' )
f.write('\nPython file' )
f.close()
f = open ('D:/test.txt' , 'w' , encoding='utf-8' )
f.write('hello world' )
f.close()
read(n):读取 n 个字符(n 省略则读取全部内容):
f = open ('D:/test.txt' , 'r' , encoding='utf-8' )
content = f.read(5 )
print (content)
f.close()
for 循环读行:逐行读取(处理大文件高效,避免内存溢出):
f = open ('D:/test.txt' , 'r' , encoding='utf-8' )
for line in f:
print (line,)
f.close()
readlines():读取所有行,返回列表(每行是列表的一个元素):
f = open ('D:/test.txt' , 'r' , encoding='utf-8' )
lines = f.readlines()
print (lines)
f.close()
必须用文件对象的 close() 方法关闭文件,原因:
程序能同时打开的文件数量有限,不关闭会导致'文件句柄泄漏',最终报错(OSError: Too many open files);
未关闭的文件,写入内容可能停留在内存缓冲区,未真正写入硬盘(丢失数据)。
f = open ('D:/test.txt' , 'r' )
f.read()
f.close()
文档强调:文件编码与代码读取编码必须一致,否则会出现乱码或 UnicodeDecodeError。
常见中文编码:
gbk:Windows 系统默认编码(记事本保存的'ANSI'格式即 gbk);
utf-8:跨平台通用编码(推荐使用)。
解决方法:用 open() 的 encoding 参数显式指定编码:
f = open ('D:/test.txt' , 'r' , encoding='utf-8' )
f = open ('D:/test.txt' , 'r' , encoding='gbk' )
文档推荐用 with 语句打开文件,无需手动调用 close()——with 块执行完毕后,会自动关闭文件(即使发生异常),代码更简洁、安全。
with open ('D:/test.txt' , 'r' , encoding='utf-8' ) as f:
print (content)
标准库:Python 自带的工具箱 标准库是 Python 安装后默认自带的库,无需额外安装即可直接使用。其覆盖场景极广,是 Python 生态的基础支撑。
分类 核心功能示例 内置函数 / 类型 函数:print()、input();类型:int、str、list、dict 及内置操作(如 str.split()) 文本处理 字符串切割、拼接、前缀判定等(如 str.startswith()) 时间日期 日期构造、差值计算(如 datetime 模块) 数学计算 数值运算、三角函数(如 math 模块) 文件目录 目录遍历、文件操作(如 os 模块的 os.walk()) 数据存储 数据库操作、数据序列化(如 json 模块) 加密解密 哈希计算、加密算法(如 hashlib 模块) 操作系统相关 进程管理、环境变量(如 os 模块) 并发编程 多进程、多线程、协程(如 threading、multiprocessing 模块) 网络编程 TCP/UDP 通信、HTTP 请求(如 socket 模块) 多媒体 / 图形化界面 音频处理、窗口开发(如 tkinter 模块)
标准库的模块本质是独立的 .py 文件,需通过 import [模块名] 导入当前代码文件后使用。以下结合文档中的 3 个实战案例,讲解具体用法。
需求:输入两个日期,计算间隔天数(如计算与'心爱之人'的相识天数)。
import datetime
date1 = datetime.datetime(2012 , 2 , 14 )
date2 = datetime.datetime(2022 , 7 , 12 )
print (date2 - date1)
字符串是 Python 内置类型,其方法无需导入额外模块,可直接使用。
分类 方法 / 操作 功能描述 示例 返回值 创建与转换 str(obj) 将对象转为字符串 str(123) → "123" 新字符串 单 / 双 / 三引号 直接定义字符串(三引号支持多行) s = 'hi';s = """line1\nline2""" 字符串变量 r"..."(原始字符串) 忽略转义字符(如\n 不解析为换行) r"a\nb" → "a\nb" 原始字符串 修改(返回新串) s.replace(old, new, count) 替换子串 old 为 new,count 指定替换次数(默认全部) "abac".replace("a", "x", 2) → "xbxc" 新字符串 s.strip(chars) 去除首尾指定字符(默认去除空白:空格、\n、\t 等) " abc ".strip() → "abc";"###abc##".strip("#") → "abc" 新字符串 s.lstrip(chars) 去除左侧指定字符 " abc ".lstrip() → "abc " 新字符串 s.rstrip(chars) 去除右侧指定字符 " abc ".rstrip() → " abc" 新字符串 s.center(width, fillchar) 居中对齐,用 fillchar(默认空格)填充至 width 长度 "hi".center(5, "*") → "hi " 新字符串 s.ljust(width, fillchar) 左对齐,填充至 width 长度 "hi".ljust(5, "-") → "hi---" 新字符串 s.rjust(width, fillchar) 右对齐,填充至 width 长度 "hi".rjust(5, "-") → "---hi" 新字符串 判断(布尔值) s.isalpha() 是否全为字母(无数字 / 符号) "abc".isalpha() → True bool s.isdigit() 是否全为数字(0-9,不包含中文数字) "123".isdigit() → True bool s.isalnum() 是否全为字母或数字 "abc123".isalnum() → True bool s.isspace() 是否全为空白字符(空格、\n、\t 等) " \t\n".isspace() → True bool s.islower() 是否全为小写字母 "abc".islower() → True bool s.isupper() 是否全为大写字母 "ABC".isupper() → True bool s.startswith(prefix) 是否以 prefix 开头(prefix 可为元组,匹配任一) "test".startswith(("te", "a")) → True bool s.endswith(suffix) 是否以 suffix 结尾(suffix 可为元组,匹配任一) "test".endswith(("st", "x")) → True bool 查找与计数 s.find(sub, start, end) 从 start 到 end 查找 sub,返回首个索引;无则返回 -1 "abac".find("a") → 0;find("x") → -1 整数 s.rfind(sub, start, end) 从右侧查找 sub,返回首个索引;无则返回 -1 "abac".rfind("a") → 2 整数 s.index(sub, start, end) 同 find,但无匹配时抛 ValueError "abac".index("a") → 0 整数(无匹配则报错) s.rindex(sub, start, end) 同 rfind,但无匹配时抛 ValueError "abac".rindex("a") → 2 整数(无匹配则报错) s.count(sub, start, end) 统计 sub 在 start 到 end 间出现的次数 "abac".count("a") → 2 整数 分割与连接 s.split(sep, maxsplit) 按 sep 分割(默认按空白),maxsplit 指定最大分割次数(默认全部分割) "a,b,c".split(",") → ["a","b","c"];"a b c".split(maxsplit=1) → ["a", "b c"] 列表 s.rsplit(sep, maxsplit) 从右侧按 sep 分割,maxsplit 指定最大次数 "a/b/c".rsplit("/", 1) → ["a/b", "c"] 列表 s.splitlines(keepends) 按换行符(\n、\r\n 等)分割,keepends=True 保留换行符 "line1\nline2".splitlines() → ["line1", "line2"] 列表 sep.join(iterable) 用 sep 连接可迭代对象(元素需为字符串) "-".join(["a","b"]) → "a-b" 新字符串 大小写转换 s.lower() 转为全小写 "AbC".lower() → "abc" 新字符串 s.upper() 转为全大写 "AbC".upper() → "ABC" 新字符串 s.title() 每个单词首字母大写(其余小写) "hello world".title() → "Hello World" 新字符串 s.capitalize() 首字符大写,其余小写 "hello".capitalize() → "Hello" 新字符串 s.swapcase() 大小写互换 "AbC".swapcase() → "aBc" 新字符串 格式化 s.format(*args, **kwargs) 格式化字符串(用{}占位) "I am {age}".format(age=18) → "I am 18" 新字符串 f-string(f"{var}") 嵌入式格式化(Python 3.6+) name="Tom"; f"Hi {name}" → "Hi Tom" 新字符串 编码解码 s.encode(encoding) 按 encoding(默认 utf-8)编码为字节串 "你好".encode() → b'\xe4\xbd\xa0\xe5\xa5\xbd' 字节串(bytes) bytes.decode(encoding) 字节串按 encoding 解码为字符串(需配合 bytes 使用) b'\xe4\xbd\xa0'.decode() → "你" 字符串
需求:指定路径和关键词,查找路径下所有文件名含关键词的文件。
import os
inputPath = input ('请输入待搜索路径:' )
pattern = input ('请输入待搜索关键词:' )
for dirpath, dirnames, filenames in os.walk(inputPath):
for f in filenames:
if pattern in f:
print (f'{dirpath} /{f} ' )
第三方库是开发者或组织编写并发布的库,需额外安装才能使用。其覆盖场景远超标准库(如二维码生成、Excel 操作、键盘监听等),是 Python 生态强大的核心原因。
使用第三方库需遵循'找库 → 安装 → 导入使用'三步流程:
遇到需求时,通过搜索引擎(百度、Bing、搜狗等)查询'Python + 需求'(如'Python 生成二维码'),即可找到常用库(如 qrcode 库)。
打开 cmd(Windows)或终端(Mac/Linux),输入 pip,若显示帮助信息(如下),则说明可用:
C:\Users>pip
Usage: pip <command > [options]
Commands:
install Install packages.
uninstall Uninstall packages.
list List installed packages.
...
若提示'pip 不是内部或外部命令':需将 Python 安装目录下的 Scripts 文件夹(含 pip.exe)添加到系统 PATH 环境变量,或重装 Python 并勾选'Add Python 3.10 to PATH'。
基本命令:pip install [库名](需联网,安装成功后即可导入使用)。
特殊情况:部分库需指定版本(如 xlrd 最新版不支持 xlsx 格式,需安装旧版),命令为 pip install [库名]==[版本号](如 pip install xlrd==1.2.0)。
安装完成后,通过 import [库名] 导入模块,语法与标准库完全相同。
需求:生成含指定内容(如'请关注中草药')的二维码图片,扫码可查看内容。
import qrcode
img = qrcode.make('请关注中草药' )
img.save('qrcode.png' )
需求:读取 Excel 文件(d:/test.xlsx),计算'101 班'学生的平均分(Excel 内容含'姓名、班级、分数')。
import xlrd
xlsx = xlrd.open_workbook('d:/test.xlsx' )
table = xlsx.sheet_by_index(0 )
nrows = table.nrows
count = 0
total = 0
for i in range (1 , nrows):
classId = table.cell_value(i, 1 )
if classId == 101 :
score = table.cell_value(i, 2 )
total += score
count += 1
print (f'101 班平均分:{total / count} ' )
案例 3:程序猿鼓励师(pynput + playsound 库)
需求:监听键盘按键,每按 10 次自动播放音频(ding.mp3),鼓励开发者。
步骤 1:确定库——pynput 监听键盘,playsound 播放音频。
步骤 3:编写代码(多线程解决音频卡顿):
注意:需将 ding.mp3 音频文件放在代码同级目录下。
pip install pynput==1.6.8
pip install playsound==1.2.2
相关免费在线工具 加密/解密文本 使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
RSA密钥对生成器 生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
Mermaid 预览与可视化编辑 基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
随机西班牙地址生成器 随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online
Gemini 图片去水印 基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online
curl 转代码 解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online