Python 基础语法 (4)【适合0基础】
1. 文件
1.1 概念
变量是把数据保存到内存中. 如果程序重启/主机重启, 内存中的数据就会丢失
要想能让数据被持久化存储, 就可以把数据存储到硬盘中. 也就是在文件中保存
文件有不同类型,通过文件的后缀名,可以看到文件的类型,常见的文件的类型如下:
1. 文本文件 (txt)
2. 可执行文件 (exe, dll)
3. 图片文件 (jpg, gif)
4. 视频文件 (mp4, mov)
5. office 文件 (.ppt, docx)
......
后续主要研究最简单的文本文件
1.2 文件路径
一个文件往往是放在一系列的目录结构(如:文件夹)之中的,为了方便确定一个文件所在的位置, 使用 文件路径 来进行描述
文件路径分为 绝对路径 和 相对路径
以 盘符 开头的路径,称为 绝对路径;以指定的 基础目录 为参考点,间接找到目标文件的,称为相对路径
对于新手,使用 绝对路径 更简单,更不容易出错
如:D:\program\qq\Bin\QQ.exe
1. D: 表示 盘符
2. 目录之间的分隔符, 可以使用 \ 也可以使用 / 编写代码的时候使用 / 更方便(\ 容易转义)
1.3 文件操作
# 1. 打开文件
# 函数 open 打开一个文件
f = open('d:/test.txt','r')
# 第一个参数是一个字符串, 表示要打开的文件路径
# 第二个参数是一个字符串, 表示打开方式. 其中 r 表示按读方式打开. w 表示按照写方式打开. a 表示追加写方式打开
# 如果打开文件成功, 返回一个文件对象. 后续的读写文件操作都是围绕这个文件对象展开
# 如果打开文件失败(比如路径指定的文件不存在), 就会抛出异常# 2. 关闭文件
# 使用 close 方法关闭已经打开的文件
f.close()
# 一个程序能同时打开的文件个数, 是存在上限的(使用完毕的文件要记得及时关闭)# 3. 写文件
# 写文件, 要使用 'w' 方式打开,如果是使用 'r' 方式打开文件, 写入时会抛异常
# 使用 write 方法写文件
f = open('d:/test.txt', 'w')
f.write('hello')
f.close()
# 用记事本打开文件, 即可看到文件修改后的内容# 'w' 一旦打开文件成功, 就会清空文件原有的数据
# 'a' 实现 "追加写", 文件原有内容不变, 写入的内容会存在于之前文件内容的末尾
f = open('d:/test.txt', 'a')
f.write('world')
f.close()# 4. 读文件
# 读文件内容需要 'r' 方式打开文件
# 使用 read 方法,参数表示读取几个字符
f = open('d:/test.txt', 'r')
result = f.read(2)
print(result)
f.close()# 如果文件是多行文本, 可以使用 for 循环一次读取一行
f = open('d:/test.txt', 'r')
for line in f:print(f'line = {line}')
f.close()
"""
文件里每一行末尾都自带换行符,而 print 打印一行的时候又会默认加上一个换行符
使用 print(f'line = {line}', end='') 手动把 print 自带的换行符去掉
"""# readlines 把文件整个内容读取出来, 返回一个列表. 每个元素即为一行
f = open('d:/test.txt', 'r')
lines = f.readlines()
print(lines)
f.close()
打开文件之后, 容易忘记关闭的, Python 提供了 上下文管理器 , 来帮助自动关闭文件
# 使用 with 语句打开文件
# 当 with 内部的代码块执行完毕后, 就会自动调用方法
with open('d:/test.txt', 'r') as f:lines = f.readlines()
print(lines)
1.4 编码方式
当文件内容存在中文的时候, 读取文件内容不一定就顺利,可能会出现 乱码 或 异常
这是因为,计算机表示中文的时候, 会采取一定的编码方式(本质是用数字表示汉字),而一般常用的汉字编码方式,主要是 GBK 和 UTF-8
保证文件本身的编码方式, 和 Python 代码中读取文件使用的编码方式匹配, 才能避免出现上述问
题
用记事本打开文本文件, 在 "菜单栏" -> "文件" -> "另存为" 窗口中, 可以看到当前文件的编码方式:
如果此处的编码为 ANSI , 则表示 GBK 编码;如果此处为 UTF-8 , 则表示 UTF-8 编码
可以修改打开文件的代码, 给 open 方法加上 encoding 参数, 显式的指定为和文本相同的编码方式
f = open('d:/test.txt', 'r', encoding='utf8')
2. 面向对象【基础感知】
2.1 概念
程序设计语言的早期,大多数程序设计都采用结构化编程:程序中遍布着全局函数、数组和变量。从1990年后,面向对象程序设计成为主流
面向对象编程(OOP)是一种编程范式,通过将数据和操作数据的方法封装在对象中,实现代码的模块化和复用。Python 是一门支持 OOP 的高级语言,其核心概念包括类、对象、继承、多态和封装
2.2 创建类
class Person:"user definde class: Person."def __init__(self,idNo = 'N',name = 'N'): self.sName = nameself.sId = idNoself.SWeight = 0def speak(self):print("Person::speak():")def eat(self,weight):self.SWeight += weightprint("Person::eat",weight)
1. 构造函数 init():函数名是规定好的。Python 规范要求 init 的左右两侧各有两根下画线,避免与用户自定义的其他函数相冲突。构造函数的作用就是在实例化一个对象的同时初始化这个对象,构造函数有 3 个参数,对于 idNo 和 name,当你试图实例化一个 Person 对象时,必须提供 ID 和姓名这两个参数,否则取默认值 "N"。
2. self参数 基本是必需的。它绑定在被执行这个成员函数的对象上。我们总是在一个对象上执行其成员函数,例如 "aaa".strip () 就是在值为 "aaa" 的字符串对象上执行其 strip () 成员函数,这种调用方式就隐含指定了 self,所以执行对象的成员函数时,不需要显式地传递 self 实参,Python 解释器会自动传递。
3. 我们也用 def 来定义类的成员函数,定义的方法与定义全局函数类似,但存在两个区别:成员函数定义在类的内部;成员函数第 1 个参数是 self。在成员函数内部,引用对象自身属性的形式为 self. 属性名,例如 self.sName、self.sWeight。
4. 类定义开始处的独立字符串 "user defined class: Person" 是类的描述性文档,可以通过 Person.doc 访问。这个 doc 可以看作是 Python 解释器给 Person 类型添加的属性
2.3 创建对象
class Person:"user definde class: Person."def __init__(self,idNo = 'N',name = 'N'): self.sName = nameself.sId = idNoself.SWeight = 0def speak(self):print("Person::speak():")def eat(self,weight):self.SWeight += weightprint("Person::eat",weight)l1 = Person("6666","zhangsan")
l1.sHeight = 10
l1.SWeight = 20
1. 第 1 行创建一个 Person 对象,同时给出了构造函数参数,ID 是 "6666",姓名为 "zhangsan"。Person () 函数实际上就是 Person 类的构造函数__init__(),在函数 Person ( ) 里,self 参数是解释器隐含提供的,我们不需要写出来。
2. l1.sHeight = 10,sHeight 不是 Person 预先建立好的属性,但通过这行代码,我们为 l1 对象添加了这一属性。
2.4 继承和多态
继承允许一个类(子类)继承另一个类(父类)的属性和方法。多态指子类可以重写父类的方法,实现不同的行为,但调用方式保持一致
# 继承
# 定义一个父类
class Animal:def __init__(self, name):self.name = namedef speak(self):return "hello world"# 子类通过 class Child(Parent) 的语法继承父类
# 子类可以通过super()调用父类的方法
class Dog(Animal):def __init__(self, name):super().__init__(name)def speak(self):return f"{self.name} says Woof!"class Cat(Animal):def __init__(self, name):super().__init__(name)def speak(self):return f"{self.name} says Meow!"dog = Dog("Bill")
print(dog.speak()) # output: Bill says Woof!# 多态
class Bird:def fly(self):print("Most birds can fly")class Penguin(Bird):def fly(self):print("Penguins can't fly")def make_bird_fly(bird):bird.fly()make_bird_fly(Bird()) # Output: Most birds can fly
make_bird_fly(Penguin()) # Output: Penguins can't fly
# 函数重写
3. 模块
活跃的社区和丰富的模块是 Python 强大的原因之一。通过引入模块,Python 语言的功能可以得到拓展
导入模块方式:
1. import 模块名
2. from 模块名 import 对象名
3. from 模块名 import * (导入模块所有对象)
给模块起别名导入:
1. import 模块名 as 新名字
2. from 模块名 import 对象名 as 新名字
# import math 用于导入 math 模块,导入后就可以通过 "math."使用模块的内部函数或变量
import math
# from math import sqrt,pi 一次导入 math 模块中多个对象
from math import sqrt,pi# floor() 用于返回参数的下取整
print(math.floor(67.7))
# ceil() 用于返回参数上取整
print(math.ceil(67.1))
# sqrt() 用于求参数平方根
print(sqrt(pi))# 为模块设置别名,常用于长模块名或避免命名冲突
import math as m
print(m.sqrt(16))