Python学习笔记
三引号换行打印
Python一次只能读取一行,不可以将一句代码分成两行写,不然会报错
# 错误:
print("哈哈哈
我爱编程")
若想输出大量文字的时候不那么麻烦想直接换行,可用三引号
print(""""hahaha
我爱编程
我爱Python""")
# 引号可以是单引号也可以是双引号
基本数据类型
四种基本数据类型:字符串、整型、浮点、布尔值
需注意布尔值的写法0,1或者True,False(注意开头字母大写)而且Python中没有null只有None(同样注意首字母大写)
# 列表
num = [1,2,3,4,5,6]
print(num[0:2])
# 从下标0(包含)打印到下标2(不包含)
print(type(num))
# 打印num的数据类型
num.append(7)
# 在数组尾部加上元素“7”
num.remove(7)
# 删除元素“7”
# 与列表相对应的元组
num = (1,2,3,4,5,6)
# 元组本身不可变,因此不可修改,不可增加
列表相关函数
print(max(num_list))#打印列表里的最大值
print(min(num_list))#打印列表里的最小值
print(sorted(num_list))#打印排序好的列表
逻辑运算
and # 与
or # 或
not # 非
循环
for n in num:
print(n)
for n in range(12):
print(n)
# range是从零开始的计数器,括号内为截止数字(不包含),因此此段代码输出结果为从0到11
# 若括号内有两个数字(3, 12)则表示从3开始到11
#若括号中有三个数字(3, 12, 2)则表示从3开始步长为2(即一次增加2)到11截止,也就是3,5,7,9,11
i**2
# 计算i的平方
# 同理 i**i就是i的i次方
i**(1/2)
#i开方
判断
age = 20
if age < 18:
print('未成年')
elif age < 65:
print('成年人')
else:
print('老年人')
字典
person = {
'name' : '张三',
'age' : 18,
'city' : '杭州'
}
print(person['name'])
# 通过索引字典person的键"name"可以打印出其值“张三”
print(person.keys())
# 获取字典person中的所有键
print(person.values())
# 打印字典person中所有的值
print(person.items())
# 打印字典所有的键值对,结果如下
# dict_items([('name', '张三'), ('age', 18), ('city', '杭州')])
person['name'] = '李四'
#可将原“张三”改为“李四”
person['gender'] = '男'
#新增'gender:男'的键值对
'name' in person
#判断person字典中是否包含键“name”,返回类型为布尔值
del person['gender']
#删除字典中的gender键
len(person)
#返回字典person中包含多少对键值对
# 通过循环打印所有键值对
for k, v in person.items():
print(k, ":", v)
字典中的键不能重复
函数
# 定义函数
def hello(name):
return 'hello ' + name
# 引用函数
print(hello('张三'))
# 使用f字符串
def hello(name):
return f'hello {name}'
print(hello('Python'))
# 结果与上边的一样,只是name位置不一样,前面加上f就可以把name放在大括号中放入引号中了
format方法
# 方式一
message_content = """
律回春渐,新元肇启。
新岁甫至,福气东来。
金{0}贺岁,欢乐祥瑞。
金{0}敲门,五福临门。
给{1}及家人拜年啦!
新春快乐,{0}年大吉!
""".format(year, name)
# 这里{0}会被替换为format后边括号内第一个元素(即下标为0)也就是year,而{1}会被替换为第二个元素(即下标为1)也就是name
# 方式二
message_content = """
律回春渐,新元肇启。
新岁甫至,福气东来。
金{current_year}贺岁,欢乐祥瑞。
金{current_year}敲门,五福临门。
给{receiver_name}及家人拜年啦!
新春快乐,{current_year}年大吉!
""".format(current_year = year, receiver_name = name)
#此时无所谓format后括号内元素的顺序
f字符串
name = "老林"
year = "虎"
message_content = f"""
律回春渐,新元肇启。
新岁甫至,福气东来。
金{year}贺岁,欢乐祥瑞。
金{year}敲门,五福临门。
给{name}及家人拜年啦!新春快乐,{year}年大吉!
"""
#因为字符串前有f字符,因此字符串内{}的值会被直接对应替换为其所含值
数字与字符串同理
gpa_dict = {"小明":3.251, "小花":3.869, "小李":2.683, "小张":3.685}
for name, gpa in gpa_dict.items():
print(f"{name}你好,你的当前绩点为:{gpa:.2f}")
#此处gpa后跟的 :.2f 意为着所有gpa保留两位小数
导入外部库
# 第一种:
# 导入math库
import math
math.sin(1)
# 使用math库中的sin方法计算1的sin值,模块名math点方法名
# 第二种
from math import sin
sin(1)
#直接引入模块中具体的方法,后续再使用此方法不需要再使用模块名math.
# 第三种 不建议
from math import *
sin(1)
# 引入math中所有的方法,后续使用math中所有方法都不需要加math.
输入
input("提示用户的信息")
# 注意,无论输入何种数据类型的数据,input返回的结果都是字符串类型,因此无法直接使用input的返回值进行数学计算
类型转换
int("666") # 把字符串“666”转换成整型
str(666) # 将整型转换成字符串
float() # 将数据类型转换成浮点数
user_age = int(input("请输入您的年龄:")) # 输入的虽然是数字但是input只能返回字符串类型,因此需要将其转换成int类型再赋值给user_age,才能进行下一步的运算
user_age_after_10_year = user_age + 10
print("您十年后会是" + str(user_age_after_10_year) + "岁") # 因为上一步运算结果user_age_after_10_year为整型,无法使用print与字符串同时打印,因此需要先将其转换成字符串类型
面相对象
class Calculator:
# 构造函数:主要作用,定义实例对象的属性,第一个参数永远都为self,用于表示对象自身,并且self参数无需手动传入
def __init__(self, num):
self.num = num
# 若此处写成num = num,对象就会以为只是给普通变量num赋值,而非对象的属性
#类中定义的方法同理,第一个参数被占用,永远都是self但是使用时无需传参
def sum(self):
total = 0
for i in self.num:
total += i
return total
def avg(self):
return self.sum() / len(self.num)
nums = [1, 2, 3, 4, 5]
calc = Calculator(nums)
# 创建Calculator类的实例对象
print(calc.num)
# 读取对象里的属性
calc.sum()
# 调用对象里的函数
print ("喵" * 5) # 字符串乘以数字n表示将字符串重复n次
# 打印结果为 喵喵喵喵喵
继承
# ============================================================
# 主题:类的继承、方法重写与多态
# 知识点:父类 / 子类 / super() / 方法重写 / 多态
# ============================================================
# ── 父类(基类)────────────────────────────────────────────
class Animal:
"""所有动物的基类,定义动物共有的属性和行为"""
def __init__(self, name, age):
# __init__ 是构造方法,创建对象时自动调用
# self 代表当前对象本身
self.name = name # 动物的名字
self.age = age # 动物的年龄
def call(self):
"""发出叫声 —— 每种动物叫声不同,子类应该重写这个方法"""
print(f"{self.name} 发出了叫声")
def introduce(self):
"""自我介绍 —— 所有动物通用,子类无需重写"""
print(f"我叫 {self.name},今年 {self.age} 岁")
# ── 子类:Human ────────────────────────────────────────────
class Human(Animal):
"""人类,继承自 Animal,新增职业属性和思考能力"""
def __init__(self, name, age, job):
# super().__init__() 调用父类的构造方法
# 这样就不需要重复写 self.name = name 这些代码
super().__init__(name, age)
self.job = job # 人类独有的属性:职业
# 方法重写(Override):覆盖父类的 call() 方法
def call(self):
print(f"{self.name} 说:你好!")
# 子类独有的方法
def think(self):
print(f"{self.name} 正在思考 [{self.job}] 相关的问题...")
# ── 子类:Cat ──────────────────────────────────────────────
class Cat(Animal):
"""猫,继承自 Animal,新增颜色属性和捕鼠能力"""
def __init__(self, name, age, color):
super().__init__(name, age)
self.color = color # 猫独有的属性:毛色
# 方法重写(Override):覆盖父类的 call() 方法
def call(self):
print(f"{self.name} 说:喵~")
# 子类独有的方法
def catch_mouse(self):
print(f"{self.color}猫 {self.name} 一跃而起,抓住了老鼠!")
# ── 创建对象(实例化)─────────────────────────────────────
human_1 = Human("张三", 25, "程序员")
cat_1 = Cat("Tom", 3, "橘色")
# ── 使用对象 ───────────────────────────────────────────────
print("=== 张三的行为 ===")
human_1.introduce() # 调用从父类继承来的方法
human_1.call() # 调用子类重写后的方法
human_1.think() # 调用子类独有的方法
print()
print("=== Tom 的行为 ===")
cat_1.introduce() # 同样继承自父类
cat_1.call() # 子类重写后的叫声
cat_1.catch_mouse() # 子类独有的方法
# ── 重点:多态演示 ─────────────────────────────────────────
# 把不同的动物放进同一个列表,统一调用 call()
# 虽然方法名相同,但每个对象的表现各不相同 —— 这就是"多态"
print()
print("=== 多态演示:让所有动物叫一声 ===")
animals = [human_1, cat_1]
for animal in animals:
animal.call() # 同一行代码,不同对象,不同结果
文件
相对路径
.当前目录,对当前目录下文件进行操作的时候可以省略前面的./
..当前目录的父目录
../.. 当前目录的父目录的父目录
读取写入格式
open("./data.txt", "r", encoding="utf-8")
#参数./data.txt为文件路径,可以是绝对路径也可以是相对路径
#参数r为打开文件的模式,r代表只读,w代表只写,不加此参数默认为只读
#参数encoding="utf-8"代表编码格式为utf-8,此参数可带可不带
文件读取
f = open("./data.txt", "r", encoding="utf-8")
print(f.read())
# read()会一次性读完全部的文件内容,并打印,一般不建议使用,会导致爆内存
read(10) #表示一次性读10个字节
read(10) #下次调用read函数的时候会从上次读到的位置接着读
readline() #一次性读取一行,会根据换行符来判定什么时候为本行结尾,而且换行符也会被当成读到内容的一部分。读到文段结尾时readline()会和read()一样返回空字符串表示后边没有内容了
# 方法一
f = open("./data.txt", "r", encoding="utf-8")
line = f.readline() #读第一行
while line != "": #判断当前行是否为空
print(line) #不为空则继续打印当前行
line = f.readline() #读取下一行
# 方法二
f = open("./data.txt", "r", encoding="utf-8")
#readlines会读全部文件内容,并把每行作为列表元素返回
lines = f.readlines() #把每行内容存储到列表里
for line in lines: # 遍历每行内容
print(line) # 打印当前行
注意:每次调用open函数打开文件后需要关闭文件
f.close() # 关闭文件,释放资源
另一种方便的写法(推荐)
with open("./data.txt") as f:
print(f.read()) # 对文件进行操作
#此方式无需单独在结尾关闭文件,打开文件对文件进行操作完成后会自动关闭
关于文件操作模式
r代表只读模式:只能读取文件中的内容
w代表只写模式:只能写入内容,并且每次打开文件都会清空文件并从头开始写入,写入函数为write()
a代表附加模式:只能写入内容,但是是以追加的形式,不管打开多少次,都是在原有基础上向后拓展添加,而非清空重写
特殊:r+可读可写,且是以追加形式写入的模式
捕捉异常
try: # 有可能产生错误的代码
user_weight = float(input("请输入您的体重(单位:kg):"))
user_height = float(input("请输入您的身高(单位:m):"))
user_BMI = user_weight / user_height ** 2
except ValueError:
print("输入不为合理数字,请重新运行程序,并输入正确的数字。") #产生值错误时会运行
except ZeroDivisionError:
print("身高不能为零,请重新运行程序,并输入正确的数字。") # 产生除零错误时会运行
except:
print("发生了未知错误,请重新运行程序。") # 产生其它错误时会运行
else:
print("您的BMI值为:"+str(user_BMI)) # 没有错误时会运行
finally:
print("程序结束运行。") # 不管发生错误与否都会运行

浙公网安备 33010602011771号