Python基础语法
1 Python简介
更新至3.0版本
特点
- 跨平台语言
- 解释型语言 (无编译)
- 交互式语言
- 面向对象语言
2 Python 基础
2.1 输出、输入函数
==print函数==
允许的输出内容:
- 数字
- 字符串 (要+单引号 / 双引号)
- 表达式
输出到文件中
open
1 | # 指定所在的输出文件位置,使用 file = 变量 |
2.1 .1 输入函数
input ()
1 | i = str(input('请输入内容:')) |
2.2 转义字符
样式 | 含义 |
---|---|
\123 | 1~3位八进制数据所表示的字符,如\256 |
\uF890 | 4位十六进制数据所表示的字符,如\u0014 |
’ | 单引号字符 |
\ | 反斜杠字符 |
\t | 水平制表符 占四个制表位 |
\v | 垂直制表符 |
\r | 回车 |
\n | 换行符 |
\b | 退格 |
\f | 换页 |
\a | 响铃 |
运算符
高到低的顺序列出了所有的运算符,如下表:
运算符 | 描述 |
---|---|
[] [:] |
下标,切片 |
** |
指数 |
~ + - |
按位取反, 正负号 |
* / % // |
乘,除,模,整除 |
+ - |
加,减 |
>> << |
右移,左移 |
& |
按位与 |
^ | |
按位异或,按位或 |
<= < > >= |
小于等于,小于,大于,大于等于 |
== != |
等于,不等于 |
is is not |
身份运算符 |
in not in |
成员运算符 |
not or and |
逻辑运算符 |
= += -= *= /= %= //= **= &= ` |
= ^= >>= <<=` |
比较运算符有的地方也称为关系运算符,包括==
、!=
、<
、>
、<=
、>=
逻辑运算符有三个,分别是and
、or
和not
2.3 进制与编码
1 二进制
1 基本单位
- 信息存储量是度量存储器存放程序和数据的数量。
- 位(Bit):计算机当中最小的信息单位
存放一个二进制位数,即 0 或 1 - 字节(Byte):计算机中的基本信息单位常用的单位
- 字(Word):有字节组成
- 字长:字的位数
字长越长,计算机性能越好 - 千字节(KB)
- 容量单位: 位(bit)-> 字节 B -> 千字节 KB -> 兆字节 MB -> 吉字节 GB -> TB -> PB -> EB、ZB、YB 、NB、DB等
2 单位换算
1字节(Byte) = 8位(bit) 2^3方
1KB( K,千字节) = 1024B 2^10方
1MB( M,兆字节) = 1024KB
1GB( G,吉字节,千兆) = 1024MB
1TB( T,万亿字节,太字节) = 1024GB
1PB( P,千万亿字节,拍字节) = 1024TB
1EB( E,百亿亿字节,艾字节) = 1024PB
ASCII码
2.4 标识符和保留字
保留字:具有特殊意义,不能用来做变量或者对象
标识符:变量、函数、类、模块和其他对象起的名字
规则:
- 字母、数字、下划线
- 不能以数字开头
- 不能是保留字
- 严格区分大小写
2.5 变量的定义和使用
- 标识
- 类型
- 值
2.6 数据类型
- int :无小数部分
- str:
- float:有小数部分
- bool : true 、 false
2.6.1 类行转换
1 | name = '张三' |
2.7 分支语句
1 | if |
1 | """ |
练习:百分制成绩转换为等级制成绩。
要求:如果输入的成绩在90分以上(含90分)输出A;80分-90分(不含90分)输出B;70分-80分(不含80分)输出C;60分-70分(不含70分)输出D;60分以下输出E。
1 | # 百分制成绩转换为等级制成绩 |
pass语句:知识一个占位符,什么都不做
- 搭建好代码结构之后,还不知道具体的代码怎么写
1 | a = 1 |
2.8 循环结构
range()函数
- 用于生成一个整数数列
- 可迭代对象
语法:
1 | range(start, stop) |
- start表示这一些列数字中的第一个数字;stop-1表示这一系列数字中的最后一个数字。
- [ start ,stop) :区间范围
三种方式
range(stop)
创建一个(0,stop)之间的整数序列,步长为1
range(start,stop)
创建一个(start,stop)之间的整数序列,步长为1
range(start,stop,step)
创建一个[start,stop)之间的整数序列,步长为step
range(101)
:可以用来产生0到100范围的整数,需要注意的是取不到101。
range(1, 101)
:可以用来产生1到100范围的整数,相当于==前面是闭区间==后面是开区间。
range(1, 101, 2)
:可以用来产生1到100的奇数,其中2是步长,即每次数值递增的值。
range(100, 0, -2)
:可以用来产生100到1的偶数,其中-2是步长,即每次数字递减的值。
1 for -in
- 明确知道了循环的次数
1~100 求和
1 | sum = 0 |
1 | for i in 'python': |
不需要使用到变量,则使用下划线代替
1 | for _ in range(10): |
2 while
- 不知道循环次数
猜数字游戏:猜数字游戏的规则是:计算机出一个1到100之间的随机数,玩家输入自己猜的数字,计算机给出对应的提示信息(大一点、小一点或猜对了),如果玩家猜中了数字,计算机提示用户一共猜了多少次,游戏结束,否则游戏继续。
1 | # AUTHOR: Kcs |
九九乘法表:
1 | # AUTHOR: Kcs |
练习
练习1:输入一个正整数判断是不是素数。
提示:素数指的是只能被1和自身整除的大于1的整数。
1 | # AUTHOR: Kcs |
练习2:输入两个正整数,计算它们的最大公约数和最小公倍数。
提示:两个数的最大公约数是两个数的公共因子中最大的那个数;两个数的最小公倍数则是能够同时被两个数整除的最小的那个数。
1 | # AUTHOR: Kcs |
构造程序逻辑
水仙花数:
水仙花数也被称为超完全数字不变数、自恋数、自幂数、阿姆斯特朗数,它是一个3位数,该数字每个位上数字的立方之和正好等于它本身,例如:$1^3 + 5^3+ 3^3=153$。
1 | for num in range(100, 1000): |
反转正整数
将12345变成54321
1
2
3
4
5
6num = int(input('num = '))
reversed_num = 0
while num > 0:
reversed_num = reversed_num * 10 + num % 10
num //= 10
print(reversed_num)生成斐波那契数列的前20个数。
斐波那契数列的特点是数列的前两个数都是1,从第三个数开始,每个数都是它前面两个数的和,形如:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, …
1
2
3
4
5a = 0
b = 1
for _ in range(20):
a, b = b, a + b
print(a, end=' ')百钱百鸡问题。
公鸡5元一只,母鸡3元一只,小鸡1元三只,用100块钱买一百只鸡,问公鸡、母鸡、小鸡各有多少只?
1
2
3
4
5
6
7
8
9
10"""
1只公鸡5元 1只母鸡3元 3只小鸡1元 用100元买100只鸡
问公鸡 母鸡 小鸡各有多少只
"""
for x in range(0, 20): # 5元的张数
for y in range(0, 33): # 3元的张数
z = 100 - x - y # 1元的张数
if 5 * x + 3 * y + z / 3 == 100:
print('公鸡: %d只, 母鸡: %d只, 小鸡: %d只' % (x, y, z))找出10000以内的完美数。
完美数又称为完全数或完备数,它的所有的真因子(即除了自身以外的因子)的和(即因子函数)恰好等于它本身。例如:6($6=1+2+3$)和28($28=1+2+4+7+14$)就是完美数。
1
2
3
4
5
6
7
8
9
10
11import math
for num in range(2, 10000):
result = 0
for factor in range(1, int(math.sqrt(num)) + 1):
if num % factor == 0:
result += factor
if factor > 1 and num // factor != factor:
result += num // factor
if result == num:
print(num)输出100以内所有的素数。
1
2
3
4
5
6
7
8
9
10import math
for num in range(2, 100):
is_prime = True
for factor in range(2, int(math.sqrt(num)) + 1):
if num % factor == 0:
is_prime = False
break
if is_prime:
print(num, end=' ')
2.9 函数和模块
函数
函数创建:
使用 def 关键字
1
2
3
4
5def 函数名(参数)
def add(n):
def add(*s):#*表示s为可变参数1
2
3
4
5
6
7
8
9
10
11
12
13# 在参数名前面的*表示args是一个可变参数 将传入的参数相加
def add(*args):
total = 0
for val in args:
total += val
return total
# 在调用add函数时可以传入0个或多个参数
print(add())
print(add(1))
print(add(1, 2))
print(add(1, 2, 3))
print(add(1, 3, 5, 7, 9))
递归函数
- 递归调用与终止条件
1 | # 递归求阶乘 |
斐波那契数列
1 | #斐波那契数列 |
模块
每一个python文件就是一个模块,通过import 导入指定的模块到python文件来 ,避免了函数名称冲突,也清晰知道了调用的函数来自哪里。
语句
1 import 语句
调用模块中的函数格式:
模块名. 函数名
1 | import module1[, module2[,... moduleN]] |
例如调用math
1 | import math |
2 from…import 语句
语法格式:
1 | from modname import name1[, name2[, ... nameN]] |
- modname:模块名
- name1:函数名
eg:
1 | # 要导入模块 fib 的 fibonacci 函数 |
from…import* 语句 (少使用)
把一个模块的所有内容全都导入到当前的命名空间
1 | # from modname import * |
module1.py
1 | def foo(): |
module2.py
1 | def foo(): |
test.py
1 | from module1 import foo |
module3.py
1 | def foo(): |
内置模块
第三方的模块
1 | pip install 模块名 #安装第三方模块 |
变量作用域
减少对全局变量的使用,则会减少对cpu的占用时间,降低耦合度
- 局部变量:定义在函数内
- 全局变量:不定义在任何一个函数内 globa 声明全局变量
- 嵌套作用域:nonlocal声明变量
主程序运行
1 | if __name__ ='__main__': |
主程序:
add1.py
1 | def add(a,b): |
test.py
1 | import add1 |
python 的 包
- 分层次的目录结构,功能相似的模块放在一个包下
- 规范代码
- 避免模块代码冲突
包含 有
__init__.py
的为:包
导包:
1 | import 包名.模块名 |
2.10 字符串
在字符串前面使用一个 r 就会显示出字符串的原本内容 \ 不会出现转义
1 | s1 = r'\'hello, world!\'' |
对字符串的操作
+
:拼接字符*
:重复字符串内容in \ not in :是否包含字符串(成员运算)
\ [ n: m] [n开始:m结束):切片运算,截取字符串
==用单引号、双引号、三个单引号创建字符串都只有一个地址,id 都一样== :字符串驻留机制
- == :比较内容
- is:比较地址
- 字符串的长度为0或1时
- 符合标识符的字符串
- 字符串只在编译时进行驻留,而非运行时
- [-5.256]之间的整数数字
查询方法
大小写转换
!(Python基础.assets/image-20220710104156865.png)
字符串内容对齐
切割字符串
1 | str1 = 'hello, world!' |
格式化字符串
1 | # 格式化字符串 |
列表 list[ ]
- 结构化的、非标量类型、有序序列
- 类似数组
创建列表:
使用[ ]
使用list()
1
2lst = ['nihao','buhoa',123]
lst2 = list(['nihao','buhoa',123])
特点:
- 有序排序
- 具有索引映射
- 可以存储重复数据
- 元素数据类型混存
- 根据需求动态分配和回收内存
列表的一些列操作
1 | lst = ['nihao','buhoa',123] |
列表的增删改操作
增:
append:在末尾追加元素
extend:在末尾添加至少一个元素
insert:在列表任意位置插入一个元素
切片
1
2
3
4
5lst = [1, 3, 5, 7, 100]
lst.append(50)
lst2 = [45,51,65]
lst.extend(lst2) [1, 3, 5, 7, 100,45,51,65]
lst.append(lst2) # [1, 3, 5, 7, 100,[45,51,65]]
删
- remove():删除一个元素,重复删除第一个元素
- pop():根据索引移除元素,不指定索引,则删除最后一个元素
- clear() :清空列表的元素
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20list1 = [1, 3, 5, 7, 100]
# 先通过成员运算判断元素是否在列表中,如果存在就删除该元素
if 3 in list1:
list1.remove(3)
if 1234 in list1:
list1.remove(1234)
print(list1) # [1, 400, 5, 7, 100, 200, 1000, 2000]
# 从指定的位置删除元素
list1.pop(0)
list1.pop(len(list1) - 1)
print(list1) # [400, 5, 7, 100, 200, 1000]
#切片 不产生新对象
list1[1:3] = []
print(list1)
# 清空列表元素
list1.clear()
# 删除列表
del list1改
- 指定索引修改元素
1
2
3list1 = [1, 3, 5, 7, 100]
list1[1] = 55
print(list1)排序
调用sort(),降序reverse = True ,升序则是False
调用内置函数sorted()函数,会产生一个新的列表对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18list1 = [1, 7,3, 100,5,45]
desc_lst = sorted(list1,reverse = True) # 降序
print(list1)
list1 = ['orange', 'apple', 'zoo', 'internationalization', 'blueberry']
list2 = sorted(list1)
# sorted函数返回列表排序后的拷贝不会修改传入的列表
# 函数的设计就应该像sorted函数一样尽可能不产生副作用
list3 = sorted(list1, reverse=True)
# 通过key关键字参数指定根据字符串长度进行排序而不是默认的字母表顺序
list4 = sorted(list1, key=len)
print(list1)
print(list2)
print(list3)
print(list4)
# 给列表对象发出排序消息直接在列表对象上进行排序
list1.sort(reverse=True)
print(list1)
列表生成式
- 必须具有一定的规则
1 | lst = [ i for i in range(1,11)] |
- for 前面的 i * i 是:列表元素的表达式
元组 tuple ( )
- 元素不可以修改
- 没有对元素的添加、删除、修改操作,当然如果一个方法要返回多个值,使用元组也是不错的选择。
- 元组在创建时间和占用的空间上面都优于列表
创建元组
- 直接小括号
- 使用内置函数tuple()
- 一个元组的元素要使用逗号隔开
1 | # 定义元组 |
集合 { } set( )
- 可变序列
- 不存在重复元素
- 无序的
创建集合
- 使用{}
- 使用内置函数 set()
1 | # 创建集合的字面量语法 |
集合的操作
- in \ not in:判断集合操作
- 新增操作
- add():添加一个元素
- update():至少添加一个元素
- 删除
- remove():删除一个指定元素,不存在抛出异常
- discard():删除指定元素
- pop():删除任意一个元素
- clrear():清空集合
1 | set1 = {1, 2, 3, 3, 3, 2} |
集合的运算
- 成员
- 交集
- 并集
- 差集
1 | set1 = {1, 2, 3, 3, 3, 2} |
集合生成式
1 | s1 = { i for i in range(1,11)} |
字典 { } dict( )
特点:
键不可以重复,值可以重复
无序
key必须是不可变对象
可变容器模型
字典的每个元素都是由一个键和一个值组成的“==键值对==”,键和值通过冒号分开
使用内置函数dict()
1 | # 创建字典的字面量语法 |
获取字典视图
- keys() :获取字典中所有的key
- values():获取字典中所有的value
- items():获取字典中的所有键值对
1 | scores = {'小明': 15, '小张': 17, '小李': 12} |
字典生成式
内置函数zip()
可迭代的对象作为参数,将对象中对应的元素打包成一个元组,然后返回有这些元组组成的lie’b
总结:
练习
练习1:在屏幕上显示跑马灯文字
1 | import os |
练习2:设计一个函数产生指定长度的验证码,验证码由大小写字母和数字构成。
参考答案:
1 | import random |
练习3:设计一个函数返回给定文件名的后缀名。
参考答案:
1 | def get_suffix(filename, has_dot=False): |
练习4:设计一个函数返回传入的列表中最大和第二大的元素的值。
参考答案:
1 | def max2(x): |
练习5:计算指定的年月日是这一年的第几天。
参考答案:
1 | def is_leap_year(year): |
练习6:打印杨辉三角。
参考答案:
1 | def main(): |
综合案例
案例1:双色球选号。
1 | from random import randrange, randint, sample |
说明: 上面使用random模块的sample函数来实现从列表中选择不重复的n个元素。
综合案例2:约瑟夫环问题。
1 | """ |
综合案例3:井字棋游戏。
1 | import os |
2.11异常
1 try except
1 | try: |
1 | try: |
多个except结构
- 捕获异常顺序按照先子类后父类的顺序 BaseException是最大的异常处理
2 try except else结构
如果try 中没有抛出异常,则执行else块,try抛出异常则执行except块
1 | try: |
3 try except else finally结构
finally 无论是否发生异常都会执行,用作释放try申请的资源
1 | try: |
异常处理模块
Traceback :打印异常信息
3 面向对象
3.1 类和对象
- 类是抽象的概念,而对象是具体的东西
- 对象都有属性和行为
3.1.1 类
class 定义类
类属性 :类里面的变量
实例方法:类里面的方法
静态方法:@staticmethod 注释的 ==使用类名直接访问==
类方法:@classmethod 注释的 ==使用类名直接访问==
内置方法:
- 初始化方法
__init__
方法,是对象的内置方法。 __del__
: 对象被从内存中销毁前,会被自动调用__str__
: 返回对象的描述信息,print函数输出使用 ,==必须返回一个字符串==
- 初始化方法
1 | class Student(object): |
3.1.2 对象
- 创建实例对象:实例名 = 类名()
1 | def main(): |
3.1.3 访问可见性
在Python中,属性和方法的访问权限只有两种,也就是==公开的和私有的==,如果希望属性是==私有的==,在给属性命名时可以用两个==下划线作为开头==
- 以单下划线来限制访问。单下划线开头的属性和方法外界仍然是可以访问的,所以更多的时候它是一种暗示或隐喻
3.1.4 面向对象的支柱
封装 :提高程序的安全性
将==属性和方法封装到一个抽象类==中
创建类对象,对象调用封装里面的方法
对象的方法都封装在类的内部
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18# AUTHOR: Kcs
# TIME : 2022/7/10 18:26
class Student:
def __init__(self, name, age):
self.__age = age # 双下滑线 表示:不希望在类外部被访问到
self.name = name
def show(self):
print(self.name, self.__age)
stu = Student('张三', 45)
# print(stu.name,stu.__age)
print(dir(stu))
# 若是想要被访问到双下滑线的信息
print(stu._Student__age)
继承:提高代码的复用性
Python支持多继承
定义子类时,必须在其构造方法中调用父类的构造函数
1
2
3
4
5
6
7
8
9
10class A(object):
pass
class B(object):
pass
class C(A, B):
pass1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21# AUTHOR: Kcs
# TIME : 2022/7/10 18:43
class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age
def info(self):
print(self.name, self.age)
class Student(Person):
def __init__(self, name, age, sno):
super(Student, self).__init__(name, age)
self.sno = sno
class Teacher(Person):
def __init__(self, name, age, prof):
super(Teacher, self).__init__(name, age)
self.prof = prof重写方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25class Person(object): # 不写括号 就默认是继承object类
def __init__(self, name, age):
self.name = name
self.age = age
def info(self):
print(self.name, self.age)
class Student(Person):
def __init__(self, name, age, sno):
super(Student, self).__init__(name, age)
self.sno = sno
#重写方法
def info(self):
print('我是学生,我叫:', self.name, '我的学号是:', self.sno)
class Teacher(Person):
def __init__(self, name, age, prof):
super(Teacher, self).__init__(name, age)
self.prof = prof
#重写方法
def info(self):
print('我是老师,我叫:', self.name, '我的职位是:', self.prof)object中的方法:
1
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
多态:提高程序的可扩展性和可维护性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35# AUTHOR: Kcs
# TIME : 2022/7/10 19:40
# 多态
# 以动物来描述多态
class Animal(object):
def eat(self):
print("动物吃东西。。。")
class Dog(Animal):
def eat(self):
print("狗吃骨头。。。")
class Cat(Animal):
def eat(self):
print("猫吃鱼。。。")
class Person(object):
def eat(self):
print('人吃五谷杂粮。。。')
#函数
def func(obj):
obj.eat()
func(Animal())
func(Cat())
func(Dog())
func(Person())
练习
练习1:定义一个类描述数字时钟。
参考答案:
1 | import time |
练习2:定义一个类描述平面上的点并提供移动点和计算到另一个点距离的方法。
参考答案:
1 | from math import sqrt |
特殊方法和特殊属性
__new__
__init__
3.1.5 类的拷贝
变量的赋值操作:
- 两个变量指向同一个对象
1 类的先拷贝
- 一般是浅拷贝
- 拷贝时,对象包含的子对象内容不拷贝,so,源对象与拷贝对象会引用同一个子对象
2 类的深拷贝
- 使用copy模块的deepcopy函数,递归拷贝对象中包含的子对象,源对象和拷贝对象所有的子对象也不相同
1 | # AUTHOR: Kcs |
3.2 面向对象进阶
3.2.1 @property装饰器
访问属性可以通过属性的getter(访问器)和setter(修改器)方法进行对应的操作
对属性的访问既安全又方便
1 | class Person(object): |
__slots__魔法
- 限定自定义类型的对象只能绑定某些属性
- 只对当前类的对象生效,对子类并不起任何作用
class Person(object):
1 | class Person(object): |
4 文件
4.1 编码格式
- Python的解释器使用Unicode
- py文件使用UTF-8存储
在文件的开头修改编码格式
#encoding = 编码格式
4.2 文件读写原理 (IO操作)
原理:
4.2.1 读写操作
内置函数open() 创建文件对象
语法规则:
1 | # 创建文件对象 |
打开文件模式
模式 | 描述 |
---|---|
t | 文本模式 (默认)。 |
x | 写模式,新建一个文件,如果该文件已存在则会报错。 |
b | 二进制模式。 |
+ | 打开一个文件进行更新(可读可写)。 |
U | 通用换行模式(不推荐)。 |
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。 |
w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
w+ | 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
1 | # 创建文件对象 |
复制文件:
1 | # 创建文件对象 |
文件当中的常用方法:
序号 | 方法及描述 |
---|---|
1 | file.close() 关闭文件。关闭后文件不能再进行读写操作。 |
2 | file.flush() 刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。 |
3 | file.fileno() 返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。 |
4 | file.isatty() 如果文件连接到一个终端设备返回 True,否则返回 False。 |
5 | file.next()返回文件下一行。 |
6 | [file.read(size]) 从文件读取指定的字节数,如果未给定或为负则读取所有。 |
7 | [file.readline(size]) 读取整行,包括 “\n” 字符。 |
8 | [file.readlines(sizeint]) 读取所有行并返回列表,若给定sizeint>0,则是设置一次读多少字节,这是为了减轻读取压力。 |
9 | [file.seek(offset, whence]) 设置文件当前位置 |
10 | file.tell() 返回文件当前位置。 |
11 | [file.truncate(size]) 截取文件,截取的字节通过size指定,默认为当前文件位置。 |
12 | file.write(str) 将字符串写入文件,返回的是写入的字符长度。 |
13 | file.writelines(sequence) 向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。**** |
with 语句 (上下文管理器)
- 会自动关闭文件流对象
with可以自动管理上下文资源,不论什么原因跳出with块,都能确保问价能正确的关闭,以此来达到释放资源的目的
语法:
1 | # AUTHOR: Kcs |
1 | """ |
目录
- mkdir()方法:创建目录,参数为:目录名称
- chdir()方法:改变目录,参数:设定的目录结构
- rmdir()方法:删除目录,删除目录之前会先删除内容
OS文件/ 目录方法
序号 | 方法及描述 |
---|---|
1 | os.access(path, mode) 检验权限模式 |
2 | os.chdir(path) 改变当前工作目录 |
3 | os.chflags(path, flags) 设置路径的标记为数字标记。 |
4 | os.chmod(path, mode) 更改权限 |
5 | os.chown(path, uid, gid) 更改文件所有者 |
6 | os.chroot(path) 改变当前进程的根目录 |
7 | os.close(fd) 关闭文件描述符 fd |
8 | os.closerange(fd_low, fd_high) 关闭所有文件描述符,从 fd_low (包含) 到 fd_high (不包含), 错误会忽略 |
9 | os.dup(fd) 复制文件描述符 fd |
10 | os.dup2(fd, fd2) 将一个文件描述符 fd 复制到另一个 fd2 |
11 | os.fchdir(fd) 通过文件描述符改变当前工作目录 |
12 | os.fchmod(fd, mode) 改变一个文件的访问权限,该文件由参数fd指定,参数mode是Unix下的文件访问权限。 |
13 | os.fchown(fd, uid, gid) 修改一个文件的所有权,这个函数修改一个文件的用户ID和用户组ID,该文件由文件描述符fd指定。 |
14 | os.fdatasync(fd) 强制将文件写入磁盘,该文件由文件描述符fd指定,但是不强制更新文件的状态信息。 |
15 | [os.fdopen(fd, mode[, bufsize]]) 通过文件描述符 fd 创建一个文件对象,并返回这个文件对象 |
16 | os.fpathconf(fd, name) 返回一个打开的文件的系统配置信息。name为检索的系统配置的值,它也许是一个定义系统值的字符串,这些名字在很多标准中指定(POSIX.1, Unix 95, Unix 98, 和其它)。 |
17 | os.fstat(fd) 返回文件描述符fd的状态,像stat()。 |
18 | os.fstatvfs(fd) 返回包含文件描述符fd的文件的文件系统的信息,像 statvfs() |
19 | os.fsync(fd) 强制将文件描述符为fd的文件写入硬盘。 |
20 | os.ftruncate(fd, length) 裁剪文件描述符fd对应的文件, 所以它最大不能超过文件大小。 |
21 | os.getcwd() 返回当前工作目录 |
22 | os.getcwdu() 返回一个当前工作目录的Unicode对象 |
23 | os.isatty(fd) 如果文件描述符fd是打开的,同时与tty(-like)设备相连,则返回true, 否则False。 |
24 | os.lchflags(path, flags) 设置路径的标记为数字标记,类似 chflags(),但是没有软链接 |
25 | os.lchmod(path, mode) 修改连接文件权限 |
26 | os.lchown(path, uid, gid) 更改文件所有者,类似 chown,但是不追踪链接。 |
27 | os.link(src, dst) 创建硬链接,名为参数 dst,指向参数 src |
28 | os.listdir(path) 返回path指定的文件夹包含的文件或文件夹的名字的列表。 |
29 | os.lseek(fd, pos, how) 设置文件描述符 fd当前位置为pos, how方式修改: SEEK_SET 或者 0 设置从文件开始的计算的pos; SEEK_CUR或者 1 则从当前位置计算; os.SEEK_END或者2则从文件尾部开始. 在unix,Windows中有效 |
30 | os.lstat(path) 像stat(),但是没有软链接 |
31 | os.major(device) 从原始的设备号中提取设备major号码 (使用stat中的st_dev或者st_rdev field)。 |
32 | os.makedev(major, minor) 以major和minor设备号组成一个原始设备号 |
33 | [os.makedirs(path, mode]) 递归文件夹创建函数。像mkdir(), 但创建的所有intermediate-level文件夹需要包含子文件夹。 |
34 | os.minor(device) 从原始的设备号中提取设备minor号码 (使用stat中的st_dev或者st_rdev field )。 |
35 | [os.mkdir(path, mode]) 以数字mode的mode创建一个名为path的文件夹.默认的 mode 是 0777 (八进制)。 |
36 | [os.mkfifo(path, mode]) 创建命名管道,mode 为数字,默认为 0666 (八进制) |
37 | [os.mknod(filename, mode=0600, device]) 创建一个名为filename文件系统节点(文件,设备特别文件或者命名pipe)。 |
38 | [os.open(file, flags, mode]) 打开一个文件,并且设置需要的打开选项,mode参数是可选的 |
39 | os.openpty() 打开一个新的伪终端对。返回 pty 和 tty的文件描述符。 |
40 | os.pathconf(path, name) 返回相关文件的系统配置信息。 |
41 | os.pipe() 创建一个管道. 返回一对文件描述符(r, w) 分别为读和写 |
42 | [os.popen(command, mode[, bufsize]]) 从一个 command 打开一个管道 |
43 | os.read(fd, n) 从文件描述符 fd 中读取最多 n 个字节,返回包含读取字节的字符串,文件描述符 fd对应文件已达到结尾, 返回一个空字符串。 |
44 | os.readlink(path) 返回软链接所指向的文件 |
45 | os.remove(path) 删除路径为path的文件。如果path 是一个文件夹,将抛出OSError; 查看下面的rmdir()删除一个 directory。 |
46 | os.removedirs(path) 递归删除目录。 |
47 | os.rename(src, dst) 重命名文件或目录,从 src 到 dst |
48 | os.renames(old, new) 递归地对目录进行更名,也可以对文件进行更名。 |
49 | os.rmdir(path) 删除path指定的空目录,如果目录非空,则抛出一个OSError异常。 |
50 | os.stat(path) 获取path指定的路径的信息,功能等同于C API中的stat()系统调用。 |
51 | [os.stat_float_times(newvalue]) 决定stat_result是否以float对象显示时间戳 |
52 | os.statvfs(path) 获取指定路径的文件系统统计信息 |
53 | os.symlink(src, dst) 创建一个软链接 |
54 | os.tcgetpgrp(fd) 返回与终端fd(一个由os.open()返回的打开的文件描述符)关联的进程组 |
55 | os.tcsetpgrp(fd, pg) 设置与终端fd(一个由os.open()返回的打开的文件描述符)关联的进程组为pg。 |
56 | [os.tempnam(dir[, prefix]]) 返回唯一的路径名用于创建临时文件。 |
57 | os.tmpfile() 返回一个打开的模式为(w+b)的文件对象 .这文件对象没有文件夹入口,没有文件描述符,将会自动删除。 |
58 | os.tmpnam() 为创建一个临时文件返回一个唯一的路径 |
59 | os.ttyname(fd) 返回一个字符串,它表示与文件描述符fd 关联的终端设备。如果fd 没有与终端设备关联,则引发一个异常。 |
60 | os.unlink(path) 删除文件路径 |
61 | os.utime(path, times) 返回指定的path文件的访问和修改的时间。 |
62 | [os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])](https://www.runoob.com/python/os-walk.html) 输出在文件夹中的文件名通过在树中游走,向上或者向下。 |
63 | os.write(fd, str) 写入字符串到文件描述符 fd中. 返回实际写入的字符串长度 |
64 | os.path 模块 获取文件的属性信息。 |
1 | import os |
os.path模块操作目录
案例:列入指定目录下的所有py文件
1 | import os |
案例:遍历指定目录下的所有文件
1 | import os |
1 | import os |
4.3 file对象
4.3.1 file对象的属性
属性 | 描述 |
---|---|
file.closed | 返回true如果文件已被关闭,否则返回false。 |
file.mode | 返回被打开文件的访问模式。 |
file.name | 返回文件的名称。 |
file.softspace | 如果用print输出后,必须跟一个空格符,则返回false。否则返回true。 |
学生信息管理系统
需求分析:
功能:
- 添加学生及成绩信息
- 将学生信息保存到文件中
- 修改和删除学生信息
- 查询学生信息
- 根据学生成绩进行排序
- 统计学生的总分
系统设计:
系统功能结构:
- 录入学生信息模块
- 查找学生信息模块
- 删除学生信息模块
- 修改学生信息模块
- 学生成绩排名模块
- 统计学生总人数模块
- 显示全部学生信息模块
系统业务流程:
系统开发必备:
python解释器:python 3.10
开发工具:Pycharm
python内置模块:os,re
主函数设计:
效果图:
主函数业务流程图:
实现主函数:
编号 | 功能 |
---|---|
0 | 退出系统 |
1 | 录入学生信息,调用insert()函数 |
2 | 查找学生信息,调用search()函数 |
3 | 删除学生信息,调用delete()函数 |
4 | 修改学生信息,调用modifv()函数 |
5 | 对学生成绩排序,调用sort()函数 |
6 | 统计学生总人数,调用total()函数 |
7 | 显示所有的学生信息,调用show()函数 |
学生信息维护模块设计
录入学生信息功能
- 从控制台录入学生信息,并且把信息保存到磁盘文件中
业务流程:
具体实现
- save(student)函数,用于将学生信息保存到文件
- insert()函数,用于录入学生信息
删除学生信息功能
- 从控制台录入学生id,到磁盘文件中找到对应的学生信息,并将其删除
业务流程
具体实现
- delete ()函数
- 调用show()函数显示学生信息,
修改学生信息功能
- 从控制台录入学生ID,到磁盘文件中找到对应的学生信息,将其进行修改
业务流程
具体实现
查询/统计模块设计
查询学生信息功能
- 从控制台录入学生id或姓名,到磁盘文件中找到对应的学生信息
业务流程
具体实现
- 编写主函数中调用的查找学生信息的函数search()
- 定义显示查询结果的函数show_student(query_student)