COMP9021学习笔记

前言

2023T2,马丁教的。个人感觉这门课很水(倒也是好事(学费:?))。就是很基础的python,应该是为了方便转码的同学设置的。上课体验不是很好,教案也没有,上课纯马丁炫技。马丁也有法式口音,在家看Lecture Record会有更好的体验(自动字幕太猛了)。但是。马丁真的很负责,很晚也会回邮件回论坛的问题。所以我给他好评。

本地python环境安装

我用的Windows,Mac用户教不了(我没钱买)。个人建议无脑Anaconda。

  1. 点这里下载Anaconda
    (安装过程要非常的久,有几步卡个十几分钟是正常的)

  2. 安装完成后,在开始菜单找到Anaconda文件夹

  3. 单击Anaconda Navigator

  4. 在一阵弹窗过后选择JupiterLab,熟悉的窗口会自己弹出来了

  5. 没弹出来就自己在浏览器中输入 http://localhost:8888/lab
    默认存储路径为C:\Users\$用户名\

.ipynb文件是马丁老师同款的python笔记本(我用来打草稿,Shift + Enter运行,也可以打断点调试,很好用)
.py是平时交作业用的格式,可以复制到Ed论坛试运行
平时作业注意冒号后的空格(

期末抱佛脚复习部分

我个人容易忘记的几句语法

  1. 单个文件读取
1
2
3
with open('文件名.txt') as file:    #默认当前路径
for lines in file: #不跳过空行操作
#doing sth with lines

或者可以这样读取

1
2
3
with open('文件名.txt') as file:    #默认当前路径
lines = file.read().split() #跳过空行,并且lines直接以列表存储,但不适用于文中有空格的情况
lines = file.read().split('\n') #不跳过空行,并且lines直接以列表存储

如果文件是.csv的话

1
2
3
4
5
6
7
with open('文件名.csv') as file:
reader = csv.reader(file)
#输入下列语句可以查看前十行是个啥,顺带知道这个csv每列的标题是什么
print(list(reader)[:10])
#没有标题也可以自定义
for title1, title2, title3... in reader:
#doing sth with reader
  1. 单个文件写入
1
2
3
#首先要定义file_name和string是什么,可以直接用'字符串'的形式表示
with open(file_name, 'w') as file: #表示开启写入模式
file.write(string)
  1. 多个文件读取
1
2
3
4
5
6
from pathlib import Path
names_dir = Path('文件夹名称') #这一步获取了文件夹的路径(考试一般也不会有重名的情况吧
for file_name in sorted(names_dir.glob('*.txt')): #直接加一个sorted排好,自己看也方便
#glob('*.txt')将文件夹中所有的文件名生成一个列表,也可以加别的限制条件
with open(file_name) as file:
#剩下的就和上面的一样了
  1. 浮点数
1
2
3
float('-inf')   #可以表示无穷小,在最值问题可能会用到
#(最值问题答案不一定只有1个,新建list输出)
round(float(f), n) #f为浮点数,n为显示小数位数
  1. class, def, self
    这块知识在学期末尾教,要赶很多作业所以学的不是很好
    (据说马丁教是不会考这类知识的,只能赌一手他不考
    这里直接复制别人的笔记,,
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
36
37
38
39
40
#类名要大写
class Circle:
#初始化
def __init__(self, r, pi = 3.14):
#类的属性
# 一般带了self就不用return了,可以在其他函数直接调用
self.r = r
self.pi = pi
self.area = 0.0
self.perimeter = 0.0
#计算面积(类的成员方法)
self.compute_area()
# 计算周长(类的成员方法)
self.compute_perimeter()

# 计算面积(调用方法)
def compute_area(self):
self.area = self.pi * self.r ** 2

#计算周长
def compute_perimeter(self):
self.perimeter = 2 * self.pi * self.r

# 判断相等
def __eq__(self, other):
if self.r == other.r:
return True
else:
return False

# 计算长度
def __len__(self):
return 2 * self * r

#字符串格式化
def __str__(self):
return f"Circle str r: {self.r}"
#represent
def __repr__(self):
return f"Circle repr r: {self.r}"

类的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 初始化
circle1 = Circle(2)
# 调用实例的属性
print('面积是:', circle.area, '周长', circle1.perimeter)

# 初始化
circle1 = Circle(100)
# 调用
print('面积是:', circle.area, '周长', circle2.perimeter)

# 初始化
circle2 = Circle(2101, 3.1415926)
# 调用
print('面积是:', circle2.area, '周长', circle2.perimeter)

#运算符重载,调用的__eq__()
circle1 == circle2
  1. 字符串运算
1
2
3
4
string.replace('字符串', '')    #删除(替换)元素
string.upper() #大写字母
string.lower() #小写字母
string.capitalize() #第一个字母大写,其余小写

考完更新

如下列分享有违规行为请立即联系dead.leaf.dance@gmail.com删除

线下期末中规中矩的考察,6道题都蛮简单的
题目都是英语,我这英语也不太行,应该就是这个意思(输入输出都是我自己编的
留意老师的备注,看清是return输出,还是print()输出

  1. 输入字符串,去除重复
1
2
# 输入 aaaabbbbcccc
# 输出 abc
  1. 伪高精度(我自己起的名字
    设计一个函数(m, n)
    默认 n = 1
    m除了第一位,每位数字都和n相加,加完取最后一位输出
1
2
3
4
5
6
7
8
# 输入 8
# 输出 8

# 输入 189012 1
# 输出 190123

# 输入 189012 -11
# 输出 178901
  1. 输出列表
    给一个list_of_lists[[]]
    然后表中表的长度不变,输出升序
1
2
3
4
5
6
7
8
# 输入 [[]]
# 输出 [[]]

# 输入 [[5, 5, 3, 4]]
# 输出 [[3, 4, 5, 5]]

# 输入 [[5, 4], [0], [14, 40], [99, 1, 7]]
# 输出 [[0, 1], [4], [5, 7], [14, 40, 99]]
  1. 输出字母金字塔
    设计一个函数f(n)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 输入 1
# 输出
A

# 输入 2
# 输出
A
CBC

# 输入 4
# 输出
A
CBC
EDCDE
GFEDEFG
  1. 匹配字典
    考生目录里会有一个dictionary.txt(全大写)
    输入一句话(首字母大写),这句话可能会有空格,感叹号,分号,问号,冒号…共6种标点符号
    找出这句话中,在字典里没出现过的单词
    按字母个数输出一句话 + 列表
    列表前有4个空格
1
2
3
4
5
6
7
# 输入 一句英文
# 输出 (大概就是输出这么一句话+一个列表,考完忘记了
...1 letter not in dictionary
['A', 'C']
...2 letter not in dictionary
['BY', 'AT']
...以此类推
  1. 经典grid
    编样例太麻烦了我就不放了
    题目里会随机生成一个里面是字母的grid,大小是dim * dim
    输入一个字符串
    找这个字符串在不在这个grid里面
    可以横着找,竖着找,斜着找(对角线),三种方法。
    只要有一个方法能行就输出True,三种都不行就输出False。