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

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))​

相关文章:

  • StarRocks Community Monthly Newsletter (May)
  • 线性代数(1)线性方程组的多种解法
  • 如何设计一个既提供绘图Tools又提供example_data的MCP服务器:
  • 计算机组成原理期末题目解析
  • nohz_full 参数对内核软硬锁检测机制的影响分析
  • 大模型笔记6:微调
  • Redis中的zset的底层实现
  • 【Create my OS】5 内核线程
  • 【图片识别改名】如何批量识别大量图片的文字并重命名图片,基于WPF和京东OCR识别接口的实现方案
  • srm管理系统供应商管理在线询价比价管理电子采购(java)
  • redis序列化
  • 嵌入式学习笔记C语言阶段--16函数指针
  • YOLOv3 中的 NMS 详解(基于论文与 Darknet 实现)
  • C#设计模式之AbstractFactory_抽象工厂_对象创建新模式-学习
  • 使用 socat 和 xinetd 将程序绑定到端口运行
  • 安卓9.0系统修改定制化____默认开启 开发者选项中的OEM锁解锁选项 开搞篇 五
  • Milvus/ES 插入方案对比
  • OD 算法题 B卷【最多团队】
  • SeaTunnel与Hive集成
  • Mkdocs 阅读时间统计插件
  • 莱芜金点子今天最新招聘电子版/企业网站seo案例分析
  • 哪些网站做外链好/北京网络推广公司wyhseo
  • 网站建设怎么招聘/营销工具有哪些
  • wordpress 共存/网站seo方案案例
  • 如何做网站的教程/优化教程网站推广排名
  • 安徽建设学校网站/白银网站seo