Python学习笔记(第三部分)
接续 Python.md 文件的第三部分
类
类的创建的基本使用
-
创建一个类
class Dog():''' 文档字符串:这是一次模拟小狗的简单尝试 '''def __init__(self,name,age):self.name = nameself.age = agedef sit(self):print(self.name.title() + " is now sitting.")def rollover(self):print(self.name.title() + " is now rolling over!")
Dog()类中包含两个属性:name 和 age ,以及两个方法 sit() 和 rollover()。类中的函数称为方法,可以通过实例访问到的变量称为属性
__init__()
方法,前后各有两个下划线,这是一个特殊的方法,在根据Dog()类创建实例时,python都会自动运行这个方法。- 这个方法中,形参 self 必须有,而且必须位于其他所有参数的前边,因为python在调用
__init__()
创建实例时,将自动传入实参 self - 每个与类相关联的方法调用都自动传入实参 self ,它是只想实例本身的引用,让实例能够访问到类中的属性和方法
- 通过实参向 Dog() 传递 name 和 age 时,self会自动传递,因此不用自己传递它,只用给出后边两个实参
- 这个方法中,形参 self 必须有,而且必须位于其他所有参数的前边,因为python在调用
- 以 self 为前缀的变量可以供类中的所有方法使用,而且还可以通过类的任何实例来访问这些变量
self.name = name
获取存储在形参 name 中的值,并将其存储在 name 变量中,然后将该变量关联到当前创建的实例- sit() 和 rollover() 方法不需要其他信息,因此只有一个形参 self
- 类名通常是首字母大写,实例是小写
-
创建类的实例,根据类来创建对象称为实例化
class Dog():''' 文档字符串:这是一次模拟小狗的简单尝试 '''def __init__(self,name,age):self.name = nameself.age = agedef sit(self):print(self.name.title() + " is now sitting.")def rollover(self):print(self.name.title() + " is now rolling over!")my_dog = Dog('whill', 6) print("My dog's name is " + my_dog.name.title()) # 访问属性通过 句点表示法 print("My dog's age is " , my_dog.age)my_dog.sit() my_dog.rollover() # 访问方法通过 句点表示法
使用类和实例
-
Car类
class Car():'''一次模拟汽车的简单尝试'''def __init__(self,make,model,year):'''初始化描述汽车的属性'''self.make = makeself.model = modelself.year = yeardef get_descriptive_name(self):long_name = str(self.year) + " " + self.make + " " + self.modelreturn long_namemy_new_car = Car("Audi", 'a6', 2016) print(my_new_car.get_descriptive_name())
-
给属性指定默认值
类的每个属性都必须有初始值,可以在
__init__()
方法内指定属性的初始值,此时无需包含为它提供初始值的形参class Car():'''一次模拟汽车的简单尝试'''def __init__(self,make,model,year):'''初始化描述汽车的属性'''self.make = makeself.model = modelself.year = yearself.odometer_reading = 0 # 为odometer_reading属性设置的初始值,不用再在形参中给出def get_descriptive_name(self):long_name = str(self.year) + " " + self.make + " " + self.modelreturn long_namedef read_odometer(self):'''打印汽车总里程'''print("Total odometer: " + str(self.odometer_reading) + " miles. ")my_new_car = Car("Audi", 'a6', 2016) print(my_new_car.get_descriptive_name()) my_new_car.read_odometer()
-
修改属性的值
# 法一 通过实例直接访问它(不安全) my_new_car = Car("Audi", 'a6', 2016) my_new_car.odometer_reading = 23 my_new_car.read_odometer()
class Car():'''一次模拟汽车的简单尝试'''--snip--def update_odometer(self,mileage):'''将里程表修改为指定的值静止将里程表读数往回调'''if mileage > self.odometer_reading:self.odometer_reading = mileageelse:print("不允许作弊.") my_new_car = Car("Audi", 'a6', 2016) my_new_car.update_odometer(23) my_new_car.read_odometer()
-
通过方法对属性的值进行递增
class Car():'''一次模拟汽车的简单尝试'''def __init__(self,make,model,year):'''初始化描述汽车的属性'''self.make = makeself.model = modelself.year = yearself.odometer_reading = 0 # 为odometer_reading属性设置的初始值,不用再在形参中给出def get_descriptive_name(self):long_name = str(self.year) + " " + self.make + " " + self.modelreturn long_namedef read_odometer(self):'''打印汽车总里程'''print("Total odometer: " + str(self.odometer_reading) + " miles. ")def update_odometer(self,mileage):'''将里程表修改为指定的值静止将里程表读数往回调'''if mileage > self.odometer_reading:self.odometer_reading = mileageelse:print("不允许作弊.")def increment_odometer(self,miles):if miles > 0:self.odometer_reading += mileselse:print("不允许作弊.")used_car = Car("Audi",'a7',2019) print(used_car.get_descriptive_name())used_car.update_odometer(2650) used_car.read_odometer()used_car.increment_odometer(3000) used_car.read_odometer()
继承
-
一个类继承一个类时,它将自动获得被继承类的所有属性和方法,原有的类称为父类或超类,新类称为子类
class Car():'''一次模拟汽车的简单尝试'''def __init__(self,make,model,year):'''初始化描述汽车的属性'''self.make = makeself.model = modelself.year = yearself.odometer_reading = 0 # 为odometer_reading属性设置的初始值,不用再在形参中给出def get_descriptive_name(self):long_name = str(self.year) + " " + self.make + " " + self.modelreturn long_namedef read_odometer(self):'''打印汽车总里程'''print("Total odometer: " + str(self.odometer_reading) + " miles. ")def update_odometer(self,mileage):'''将里程表修改为指定的值静止将里程表读数往回调'''if mileage > self.odometer_reading:self.odometer_reading = mileageelse:print("不允许作弊.")def increment_odometer(self,miles):if miles > 0:self.odometer_reading += mileselse:print("不允许作弊.")class ElectricCar(Car):'''继承了类 Car'''def __init__(self,make,model,year):'''初始化父类的属性'''super().__init__(make,model,year)my_tesla = ElectricCar("tesla",'model y', 2018) print(my_tesla.get_descriptive_name())
-
创建子类时,父类必须包含在当前文件中,而且必须子类的前边
-
定义子类时,在括号内指定父类的名称
class ElectricCar(Car):
-
super()
是特殊的函数,使父类和子类关联起来 -
给子类定义自己的特有属性和方法:
class Car():---snip---class ElectricCar(Car):'''继承了类 Car'''def __init__(self,make,model,year):# 初始化父类的属性super().__init__(make,model,year) # 初始化自己特有的属性self.batery_size = 70def describe_battery(self):print("This car has a " + str(self.batery_size) + '-kWh battery.')my_tesla = ElectricCar("tesla",'model y', 2018) print(my_tesla.get_descriptive_name()) my_tesla.describe_battery()
-
重写父类的方法(定义一个和父类方法重名的方法)
class Car():---snip---def fill_gas_tank(self):'''加油的方法'''print("加油中...")print("加油完成!")class ElectricCar(Car):def __init__(self,make,model,year):super().__init__(make,model,year)def fill_gas_tank(self):'''重写父类方法,电动车没有油箱'''print("This car doesn't need a gas tank.")
重写父类方法后,在创建子类的实例时,Python会忽略掉原来父类中的方法
-
将实例用作属性
class Car():'''一次模拟汽车的简单尝试'''def __init__(self,make,model,year):'''初始化描述汽车的属性'''self.make = makeself.model = modelself.year = yearself.odometer_reading = 0 # 为odometer_reading属性设置的初始值,不用再在形参中给出def get_descriptive_name(self):long_name = str(self.year) + " " + self.make + " " + self.modelreturn long_namedef read_odometer(self):'''打印汽车总里程'''print("Total odometer: " + str(self.odometer_reading) + " miles. ")def update_odometer(self,mileage):'''将里程表修改为指定的值静止将里程表读数往回调'''if mileage > self.odometer_reading:self.odometer_reading = mileageelse:print("不允许作弊.")def increment_odometer(self,miles):if miles > 0:self.odometer_reading += mileselse:print("不允许作弊.")class Battery():def __init__(self,battery_size=70):'''初始化电瓶的属性'''self.battery_size = battery_sizedef describe_battery(self):print("This car has a " + str(self.battery_size) + '-kWh battery.')class ElectricCar(Car):def __init__(self,make,model,year):super().__init__(make,model,year)self.battery = Battery() # 创建了一个Battery()的实例作为ElectricCar类的属性my_tesla = ElectricCar("tesla",'model y', 2018) print(my_tesla.get_descriptive_name()) my_tesla.battery.describe_battery()
有时候自己的类非常庞大,有非常多的属性和方法,这是可以采用上述方法,将类的一部分作为一个独立的类单独提取出来
上边新建了一个Battery类,以后想要再对电池做分析就更简洁了
class Battery():def __init__(self,battery_size=70):'''初始化电瓶的属性'''self.battery_size = battery_sizedef describe_battery(self):print("This car has a " + str(self.battery_size) + '-kWh battery.')def get_range(self):if self.battery_size == 70:range = 240elif self.battey_size == 80:range = 270message = "This car can go approximately " + str(range)message += " miles on a full charge."print(message)
导入类
-
为了使文件更简洁,Python允许将类存储在模块中,然后在主程序中导入所需的模块
-
可以把多个类放在一个模块中
# car.py class Car():---snip---class Battery():---snip---class ElectricCar(Car):---snip---
-
导入单个类
from car import Car # 从 car.py 文件中导入单个类 Car
-
导入多个类
from car import Car,ElectricCar # 多个类之间用逗号分隔
-
导入整个模块
import carmy_tesla = car.ElectricCar("tesla",'model y', 2018) # 需要用句点表达式的方式来访问需要的类
使用
module_name.class_name
的方式访问需要的类 -
导入模块中的所有类
from car import *
不推荐使用这种方法,因为可能发生类名冲突
-
从一个模块中导入很多类时,最好是导入整个模块,然后在接下来的代码中使用
module_name.class_name
的方式访问需要的类 -
还可以从一个模块中导入另外一个模块
# car.py 模块 class Car():---snip---
# electric_car.py 模块 from car import Car # 从 car.py模块中导入Car类class Battery():---snip---class ElectricCar(Car):---snip---
# my_cars.py from car import Car from electric_car import ElectricCarmy_beetle = Car("volk", 'beetle', 2018) print(my_beetle.get_descriptive_name())my_tesla = ElectricCar("tesla",'model y', 2018) print(my_tesla.get_descriptive_name())
自定义工作流程
- 一开始应该尽可能的让结构简单,先尽可能的在一个文件中完成所有的工作,确定一切都能够正常运行后,再将类移到独立的模块中
文件
从文件中读取数据
with open('.//FileOP//pi_digits.txt') as file_object:contents = file_object.read() print(contents)-->
3.141592653589793238462643383279# 多了一个空行
-
使用 open() 函数打开文件,并返回一个表示该文件的对象
-
关键字 with 在不再需要访问打开的文件后关闭该文件,就不用手动用 close() 函数关闭文件,但是不推荐这种做法,因为有的时候程序不能正常运行到 close() 这里导致文件不能够正确的关闭从而导致文件数据受损
-
所以使用 with 结构来让 Python 自己决定在合适的时候关闭文件
-
使用 read() 方法读取目标文件的全部内容,并将其作为一个字符串
-
read() 方法到达文件末尾时返回一个空字符串,因此打印出来时会多一个空行,可以使用**rstrip()**去除字符串末尾的空白
文件路径
-
使用这种方法时,Python会在当前执行的文件所在的目录中查找文件
with open('pi_digits.txt') as file_object:---snip---
-
使用相对路径,这是Python会在当前执行的文件所在的目录中的FileOP文件夹中去找目标文件
with open('FileOP\pi_digits.txt') as file_object:---snip---
windows系统中,使用反斜杠(/)而不是斜杠(\),或者使用双斜杠
\\
,这样就可以防止被转义 -
使用绝对路径,因为绝对路径通常比较长,所以经常把它放在一个变量中
file_path = 'D:\GiteeRepository\python-project\jupyter\FileOP\pi_digits.txt' with open(file_path) as file_object:---snip---
逐行读取
-
对文件对象使用for循环,以每次一行的方式检查文件:
file_path = "FileOP/pi_digits.txt" with open(file_path) as file_object:for line in file_object:print("- " + line)---> - 3.1415926535- 8979323846- 2643383279
每行的末尾都有一个空白行,这是因为在文件中,每行的末尾都有一个换行符,而print语句也会自己加上一个换行符,所以答应出来有一个空行
可以使用**rstrip()**去除字符串末尾的空白
file_path = "FileOP/pi_digits.txt" with open(file_path) as file_object:for line in file_object:print("- " + line.rstrip())
-
创建一个包含文件多行的列表
file_path = "FileOP/pi_digits.txt" with open(file_path) as file_object:lines = file_object.readlines()print(lines) # ['3.1415926535\n', ' 8979323846\n', ' 2643383279\n']
readlines()方法从文件中读取每一行以列表的形式存储到lines中
-
Python读取我呢本文件时,对于所有的文本都解读为字符串,可以使用 int() 或 float() 函数转化成数字
写入文件
-
写入空文件,调用 open() 时,多提供一个参数 ‘w’ ,这个参数称为模式参数,告诉Python要写入文件
file_path = 'FileOP/programming.txt'with open(file_path, 'w') as file_obj: # 如果目标文件不存在,函数 open() 就新建一个文件file_obj.write('I love programming.')
-
打开文件时,可以指定写入模式:
读取模式(’r’)
、写入模式(‘w’)
、附加模式(‘a’)
、读取和写入模式(‘r+’)
-
以
写入模式(‘w’)
打开文件时,如果目标文件中存在内容,Python在返回该文件对象时会清空该文件里的内容 -
python只能将字符串写入到文本文件,如果是数值型数据,必须要用 str() 转换成字符串格式
-
写入多行,write函数不会自动添加换行符,需要自己手动加上
file_path = 'FileOP/programming.txt'with open(file_path, 'w') as file_obj:file_obj.write('I love programming.\n')file_obj.write('I love creating new games.\n')
-
附加到文件,使用 附加模式
file_path = 'FileOP/programming.txt'with open(file_path, 'a') as file_obj:file_obj.write('I also love finding meaning in large datasets.\n')file_obj.write('I love creating apps that can run in a browser.\n')
异常
-
Python使用被称为异常的特殊对象来管理程序执行期间发生的错误
-
如果代码中没有处理异常的代码块,程序会显示一个traceback
-
异常是使用
try-except
代码块处理的# 处理 ZeroDivisionError: try:print(5/0) except ZeroDivisionError:print("You can't divide by zero.")
这样就可以处理特定的异常,在上面代码中,可以处理
ZeroDivisionError
异常如果 try 代码块中的代码没有问题,Python将跳过except代码块,否则,将查找这样的except代码块:except 指定的错误与引发的错误相同,并运行其中的代码
-
else 代码块:
print("Give me two numbers, and I'll diveide them.") print("Enter 'q' to quit.")while True:first_num = input('first_num: ')if first_num == 'q':breaksecond_num = input('second_num: ')if second_num == 'q':breaktry:answer = int(first_num) / int(second_num)except ZeroDivisionError:print("You can't divide by zero.")else:print("Answer: ", answer)
在上述代码中,
try
代码块中只包含可能导致错误的代码,如果发生错误将试图和except
代码块中的错误匹配,如果没有错误就执行else
代码块中的内容excpet代码块的作用是告诉Python,在遇到了指定的异常应该怎么办
-
处理
FileNotFoundError
异常file_name = 'alice.txt'with open(file_name) as f_obj:contents = f_obj.read() # FileNotFoundError: [Errno 2] No such file or directory: 'alice.txt'
这个异常是
open
函数导致的,可以把open
函数包含在try
代码块中:file_name = 'alice.txt'try:with open(file_name) as f_obj:contents = f_obj.read() except:msg = "Sorry, the file '" + file_name + "' does not exist."print(msg)
-
分析文本
title = 'Alice in Wonderland.'title.split() # ['Alice', 'in', 'Wonderland.']
split()
方法以空格为分隔符将字符串分拆成多个部份,并将这些部份都存储到一个列表中file_name = 'Alice in Wonderland.txt'try:with open(file_name) as f_obj:contents = f_obj.read() except:msg = "Sorry, the file '" + file_name + "' does not exist."print(msg) else:words = contents.split()num_words = len(words)print("Total words nums: " + str(num_words))
-
使用多个文件(包装成一个函数)
def count_words(file_path):"""计算一个文件大致包含多少个单词"""try:with open(file_path) as f_obj:contents = f_obj.read() except:msg = "Sorry, the file '" + file_name + "' does not exist."print(msg)else:words = contents.split()num_words = len(words)print("Total words nums: " + str(num_words))file_path = "./FileOP/alice.txt" count_words(file_path)
-
使用
pass
语句跳过对捕捉异常的处理部份def count_words(file_path):try:with open(file_path) as f_obj:contents = f_obj.read() except FileNotFoundError:passelse:words = contents.split()num_words = len(words)print("Total words nums: " + str(num_words))file_path = "./FileOP/alice.txt" count_words(file_path)
pass
语句充当了占位符,提醒自己在某个地方什么都没做
存储数据
-
使用
json
格式存储数据 -
使用
json.jump()
存储数据import jsonnumbers = [1, 2, 3, 4, 5] file_path = "./FileOP/numbers.json" with open(file_path, 'w') as file_obj:json.dump(numbers, file_obj)
-
使用
json.load()
读取数据import json file_path = "./FileOP/numbers.json" with open(file_path) as file_obj:numbers = json.load(file_obj)print(numbers)
-
一次实例:
# rember_me.py import json file_path = "./FileOP/username.json" try:with open(file_path) as f_obj:user_name = json.load(f_obj) except FileNotFoundError:username = input("Tell me your name: ")with open(file_path, 'w') as f_obj:json.dump(username, f_obj)print("We will rember you, Dear " + username) else:print("Welcome back, " + username)
测试
- Python标准库中的模块
unittest
提供了代码测试工具 - 单元测试用于核实函数的某个方面没有问题
- 测试用例是一组单元测试,这些单元测试一起核实函数在各种情况下都符合要求
- 全覆盖式测试用例包含一整套单元测试,涵盖了各种可能的函数使用方式
测试函数
-
要为函数编写测试用例,需要先导入模块
unittest
以及要测试的函数,在创建一个继承unitest.TestCase
的类# name_function.pydef get_fullname(first,last):fullname = first + " " + lastreturn fullname.title()
# test_name_function.py import unittest from name_function import get_fullnameclass NamesTestCase(unittest.TestCase): # 类名可以自定义,但是应尽量包含Test,而且必须继承 unittest.TestCase 类""" 测试name_function.py """def test_first_last_name(self):fullname = get_fullname('jains', 'joplin')self.assertEqual(fullname, 'Jains Joplin')unittest.main()
-
一个新的案例:
# name_function.pydef get_fullname(first, last, middle=''):if middle:fullname = first + " " + middle + " " + lastelse:fullname = first + " " + lastreturn fullname.title()
# test_name_function.py import unittest from name_function import get_fullnameclass NamesTestCase(unittest.TestCase):""" 测试name_function.py """def test_first_last_name(self):fullname = get_fullname('jan', 'joplin')self.assertEqual(fullname, 'Jan Joplin')def test_first_last_middle_name(self):fullname = get_fullname('wolf', 'dog', 'amazes')self.assertEqual(fullname, 'Wolf Dog Amazes')unittest.main()
-
一个新的案例
# city_functions.pydef get_formatted_city(city, country, population=''):if population:res = city + ', ' + country + '-' + str(population)else:res = city + ', ' + countryreturn res.title()
# test_cities.pyimport unittest from city_functions import get_formatted_city as gfcclass CitiesTestCase(unittest.TestCase):""" 测试city_functions.py """def test_city_country(self):res = gfc('xian', 'china')self.assertEqual(res, 'Xian, China')def test_city_country_population(self):res = gfc('santiago', 'chile', 25000)self.assertEqual(res, 'Santiago, Chile-25000')# unittest.main()
测试类
-
unittest.TestCase
中常用的断言方法方法 用途 assertEqual(a, b)
验证 a == b
assertNotEqual(a, b)
验证 a != b
assertTrue(x)
验证 x
为True
assertFalse(x)
验证 x
为False
assertIs(a, b)
验证 a is b
(对象身份相同)assertIn(item,list)
验证 item
在list
中assertNotIn(item,list)
验证 item
不在list
中assertIsNot(a, b)
验证 a is not b
assertIsNone(x)
验证 x
是None
assertIsNotNone(x)
验证 x
不是None
assertIn(a, b)
验证 a
包含在b
中(a in b
)assertNotIn(a, b)
验证 a
不包含在b
中(a not in b
)assertIsInstance(obj, cls)
验证 obj
是cls
的实例assertNotIsInstance(obj, cls)
验证 obj
不是cls
的实例assertAlmostEqual(a, b, places=7)
验证浮点数 a
和b
近似相等(精度为小数点后places
位)assertNotAlmostEqual(a, b, places=7)
验证浮点数 a
和b
不近似相等assertGreater(a, b)
验证 a > b
assertGreaterEqual(a, b)
验证 a >= b
assertLess(a, b)
验证 a < b
assertLessEqual(a, b)
验证 a <= b
assertListEqual(a, b)
验证列表 a
和b
内容及顺序一致assertDictEqual(a, b)
验证字典 a
和b
键值对完全一致assertTupleEqual(a, b)
验证元组 a
和b
内容及顺序一致assertSetEqual(a, b)
验证集合 a
和b
内容相同(忽略顺序)assertMultiLineEqual(a, b)
验证多行字符串 a
和b
完全一致 -
类的测试大部分工作是测试类中方法的行为:
# suvery.py class AnonymousSurvey():""" 收集匿名调查问卷的答案 """def __init__(self, question):"""存储一个问题,并为存储答案做准备"""self.question = questionself.responses = []def show_question(self):"""显示调查问卷"""print(self.question)def store_responses(self, new_response):"""存储单份调查问卷"""self.responses.append(new_response)def show_results(self):"""显示收集到的所有答案"""print("Survey results: ")for res in self.responses:print('-' + res)
# language_survey.py from survey import AnonymousSurvey as AS# 定义一个问题,并创建一个表示调查的AnonymousSurvey对象 question = "What's your favorite language?" my_survey = AS(question)# 显示问题并存储答案 my_survey.show_question() print("Enter 'q' to quit. ") while True:response = input("Please tell me your answer: ")if response == 'q':breakelse:my_survey.store_responses(response)# 显示调查结果 print("\n Thank you: ") my_survey.show_results()
-
开始测试
AnonymousSurvey
类-
验证:如果用户面对调查问题时,只提供了一个答案,是否能够准确地存储
# test_survey.py import unittest from survey import AnonymousSurveyclass TestAnonymousSurvey(unittest.TestCase):"""测试AnonymousSurvey类"""def test_store_single_response(self):question = "What your favorite language?"my_survey = AnonymousSurvey(question)my_survey.store_responses('English')self.assertIn('English', my_survey.responses)
-
验证:如果用户提供了多个答案时,是否能够准确的存储:
# test_survey.py import unittest from survey import AnonymousSurveyclass TestAnonymousSurvey(unittest.TestCase):"""测试AnonymousSurvey类"""def test_store_single_response(self):question = "What your favorite language?"my_survey = AnonymousSurvey(question)my_survey.store_responses('English')self.assertIn('English', my_survey.responses)def test_store_three_responses(self):question = "What your favorite language?"my_survey = AnonymousSurvey(question)responses = ['C++', 'C', 'Java']for res in responses:my_survey.store_responses(res)for res in responses:self.assertIn(res, my_survey.responses)
-
-
使用方法
setUp()
,在上边的TestAnonymousSurvey
类中,每个测试方法都创建了一次AnonymousSurvey
的实例,使用setUp()
方法可以让我们只需创建一次实例对象,然后在每个测试方法中使用它:import unittest from survey import AnonymousSurveyclass TestAnonymousSurvey(unittest.TestCase):"""测试AnonymousSurvey类"""def setUp(self) -> None:"""创建一个调查对象和一组答案,供使用的测试方法使用"""question = "What your favorite language?"self.my_survey = AnonymousSurvey(question) self.responses = ['C++', 'C', 'Java']def test_store_single_response(self):"""测试单个答案会被妥善的存储"""self.my_survey.store_responses(self.responses[0])self.assertIn(self.responses[0], self.my_survey.responses)def test_store_three_responses(self):"""测试多个答案会被妥善的存储"""for res in self.responses:self.my_survey.store_responses(res)for res in self.responses:self.assertIn(res, self.my_survey.responses)
在方法
setUp
中创建了一个调查对象my_survey
和一个答案列表responses
, 并且都添加了前缀self
(即存储在属性中),因此可在这个类的任何地方使用
相关文章:
Python学习笔记(第三部分)
接续 Python.md 文件的第三部分 类 类的创建的基本使用 创建一个类 class Dog(): 文档字符串:这是一次模拟小狗的简单尝试 def __init__(self,name,age):self.name nameself.age agedef sit(self):print(self.name.title() " is now sitting.")def ro…...
【浅尝Java】Java简介第一个Java程序(含JDK、JRE与JVM关系、javcdoc的使用)
🍞自我激励:每天努力一点点,技术变化看得见 文章目录 Java语言概述Java是什么Java语言的重要性Java语言发展简史Java语言特性 第一个Java程序main方法示例运行Java程序JDK、JRE、JVM之间的关系注释基本规则注释规范 标识符关键字 Java语言概述…...
【FreeRTOS-列表和列表项】
参照正点原子以及以下gitee笔记整理本博客,并将实验结果附在文末。 https://gitee.com/xrbin/FreeRTOS_learning/tree/master 一、列表和列表项的简介(熟悉) 1、什么是列表 答:列表是FreeRTOS中的一个数据结构,概念上和链表有点类似&#…...
22.2Linux的I2C驱动实验(编程)_csdn
我尽量讲的更详细,为了关注我的粉丝!!! 这里我们用到的是stm32mp157的板子,所以我们看一下I2C用到的引脚。 1、硬件原理图分析 可以看到在这块板子上面用的SDA和SCL总线是PA11,PA12。所以要修改设备树和镜像文件&…...
socket-IO复用技术
五个I/O模型 1、阻塞I/O 2、非阻塞I/O 3、I/O复用(select和poll) 4、信号驱动I/O 5、异步I/O I/O复用 是一种在单线程或单进程环境下,同时监听多个 I/O 事件的技术。它允许程序高效地处理多个输入输出流(如网络套接字、文件描…...
上位机知识篇---二进制操作
文章目录 前言接收数据示例:0xAA 0x12 0x34 0x55合并高/低字节数据RGB565颜色值:0xF800(红色)Python中负数右移接收帧:01 03 02 12 34 CRC前言 本文简单对单片机、上位机中的映射(Mapping)和位移操作符(Bit Shifting)等相关知识进行了简单介绍. 一、单片机与上位机中…...
openEuler 22.03 安装 Mysql 5.7,TAR离线安装
目录 一、检查系统是否安装其他版本Mariadb数据库二、环境检查2.1 必要环境检查2.2 在线安装(有网络)2.3 离线安装(无网络) 二、下载Mysql2.1 在线下载2.2 离线下载 三、安装Mysql四、配置Mysql五、开放防火墙端口六、数据备份七、…...
《排序算法总结》
引言: 编程学到现在,我们已经接触了很多种排序算法,这篇文章我就对常见的几种排序算法进行一个小结。 一: 排序算法分类: 二: 插入排序: 直接插入排序: 1. 概念: 直…...
【Java学习笔记】递归
递归(recursion) 思想:把一个复杂的问题拆分成一个简单问题和子问题,子问题又是更小规模的复杂问题,循环往复 本质:栈的使用 递归的注意事项 (1)需要有递归出口,否者就…...
体系学习1:C语言与指针1——预定义、进制打印、传参为数组
1、不对一段代码进行编译 #if 0 statement #endif2、输出地址 int d[3]{1,2,3}; printf("%p",(void*)d);//p期待的是void*类型的数据3、不同进制的打印 int data 1200; char hed[9];//为\0预留位置!!! sprintf(hed,"%08X&…...
使用Java正则表达式进行分组与匹配文本提取
在Java开发中,正则表达式(Regex)是处理字符串的强大工具,广泛应用于数据验证、文本解析和格式转换等场景。通过正则表达式的分组功能,开发者可以精确地提取匹配模式的子部分,而不仅仅是整个匹配内容。Java的…...
RAGFlow上传3M是excel表格到知识库,提示上传的文件总大小过大
环境: Ragflowv0.17.2 问题描述: RAGFlow上传3M是excel表格到知识库,提示上传的文件总大小过大 解决方案: 定位问题: 1.查询Nginx 日志 Nginx 日志 检查 Nginx 配置中日志路径是否正确,确保日志文件有…...
2025年4月文章一览
2025年4月编程人总共更新了30篇文章: 1.2025年3月文章一览 2.《Operating System Concepts》阅读笔记:p528-p544 3.《Operating System Concepts》阅读笔记:p545-p551 4.《Operating System Concepts》阅读笔记:p552-p579 5.…...
2025大模型微调视频课程全套(附下载)
2025大模型微调视频课程全套,共10课。主要内容如下: 1、大模型的发展 2、Transformer & LLMs 3、大模型微调预览&Lora微调&Alpaca模型微调 4、Alpaca&AdaLoRA&QLoRA模型微调 5、Efficient Fine-tuning&Efficient Inference&…...
【Python Web开发】04-Cookie和Session
文章目录 1. Cookie1.1 定义1.2 工作原理1.3 用途1.4 优缺点 2. Session2.1 定义2.2 工作原理2.3 用途2.4 优缺点 3. Cookie 与 Session 的关系4. 安全性考量5. Python 中使用 Cookie 和 Session 在 HTTP 协议里,Cookie 和 Session 是用于管理客户端与服务器之间会话…...
从股指到期指,哪些因素影响基差?
当我们谈论股指期货(简称“期指”)与股票现货指数(简称“股指”)的基差时,其实是在探讨期货价格与现货价格之间的“差价”。这个差价受多种因素影响,时而扩大,时而缩小,甚至可能“翻…...
n8n 中文系列教程_15. 【工具篇】n8n中文版与汉化指南:从原理到实践
n8n 作为一款强大的开源自动化工具,目前尚未推出官方中文版,但社区提供了汉化方案。不过,对于技术用户,我们更推荐使用英文原版,以便更好地查阅文档和解决问题。如果你仍希望尝试汉化,本文将详细介绍如何通…...
3D版同步帧游戏
以下是实现一个3D版同步帧游戏的详细步骤与完整代码示例。我们将以第一人称射击游戏(FPS)为原型,重点讲解3D空间中的同步机制优化。 项目升级:3D版核心改动 1. 3D坐标系与消息结构 // common/messages.go type Vector3 struct {X float32 `json:"x"`Y float32 `…...
C语言中数字转化为字符串的方法
C语言中数字转化为字符串的方法 1. 使用 sprintf 函数 这是 stdio.h 头文件中的标准库函数 ,功能类似于 printf ,但不是输出到控制台,而是将格式化后的内容输出到字符数组(字符串)中。 示例代码: c #inc…...
使用MGeo模型高精度实现文本中地址识别
一、功能与安装 1、模型地址 模型是阿里开发的门址高精度识别模型。 https://modelscope.cn/models/iic/mgeo_geographic_elements_tagging_chinese_base/summary 注意:不能自己安装包,没法解决依赖问题,直接按照官方要求安装下面的包&am…...
OpenGL-ES 学习(15) ----纹理
目录 纹理简介纹理映射纹理映射流程示例代码:纹理的环绕和过滤方式纹理的过滤方式 纹理简介 现实生活中,纹理(Texture) 类似于游戏中皮肤的概念,最通常的作用是装饰 3D 物体,它像贴纸一样贴在物体的表面,丰富物体的表…...
类成员函数编译链接的过程
1.静态成员函数和普通成员函数 源文件编译成目标文件,静态成员函数和普通成员函数在目标文件代码段,函数添加进了符号表,地址是在代码段的相对地址,这个地址只是一个临时地址因为后面链接时还要合并代码段,函数地址还…...
PostgreSQL:pgAdmin 4 使用教程
pgAdmin 4 是一个用于管理和维护 PostgreSQL 数据库的强大工具。它提供了一个图形化界面,使用户能够轻松地连接到数据库、创建表、运行 SQL 语句以及执行其他数据库管理任务。 安装和使用 安装 pgAdmin 4 安装 pgAdmin 4 非常简单。下载并运行安装程序࿰…...
*(解引用运算符)与 ++(自增运算符)的优先级
在 C 和 C 等编程语言里,*(解引用运算符)与 (自增运算符)的执行优先级高低,要依据 是前缀形式还是后缀形式来确定。下面为你详细分析: 1. 后缀 运算符 后缀 运算符的优先级比 *(…...
二叉搜索树中的搜索(递归解决)
700. 二叉搜索树中的搜索 - 力扣(LeetCode) 二叉搜索树(BST):以任意节点为根节点的数值大于其左子树所有节点的值,小于右子树所有节点的值。 查找二叉搜索树中的值,要利用节点之间的大小关系。…...
idea安装
1.卸载 2.安装 3.ssh...
在ASP.NET MVC中使用Repeater指南
虽然ASP.NET MVC框架本身不包含Web Forms中的Repeater控件,但您可以通过几种方式实现类似的功能。以下是几种在MVC中实现Repeater效果的方法: 1. 使用foreach循环 最简单的方法是直接在视图中使用Razor的foreach循环: csharp model IEnumer…...
【C语言常用字符串解析】
总结一下在 C 语言中用于字符串解析(特别是从文件中读取行并提取数据)的常用函数、 核心任务: 通常是从文件中读取一行文本(一个字符串),然后从这个字符串中提取出需要的数据(比如数字、单词等…...
基于深度学习农作物叶部病害实时检测系统研究(源码+定制+开发)
博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…...
『MCP』初体验
『MCP』初体验 介绍 MCP 其实就是 Function Calling 的一个统一接口协议,网上介绍会有很多,所以这里不就重复介绍,这里主要是想记录说明一下 MCP 使用体验,可以帮助新人入门一下 安装 VSCode 以及 MCP client VSCode 自行安装…...
前端面试宝典---webpack原理解析,并有简化版源码
前言 先看一下webpack打包后的bundle.js,前边的直接扫一眼就过,可以发现这个立即执行函数的形参就是一个,key为引入文件路径,value为该模块代码的函数。 所以比较重要的就是通过webpack的配置文件中的entry的入口文件,…...
负载均衡深度实践:基于Nginx+Keepalived的高可用方案与Zabbix监控设计
目录 综合实践-部署负载均衡 1 环境准备 2 zabbix监控nginx和keeplive 2.1 nginx安装 2.2 安装keepalived 2.3 部署vue 2.4 安装agent 2.5 zabbix监控nginx配置 2.6 zabbix监控keeplived 3 zabbix监控jar 3.1 安装agent 3.2 安装jdk 3.3 部署jar包 3.4 配置web 4…...
深度学习基础--目标检测入门简介
博主简介:努力学习的22级本科生一枚 🌟 博客主页:羊小猪~~-CSDN博客 内容简介:探索AI算法,C,go语言的世界;在迷茫中寻找光芒🌸 往期回顾:yolov5基础–一步一步教…...
Redis ⑧-RESP | 渐进式遍历 | 数据库管理
Redis data-types 除了之前学习的 string、hash、list、set、Zset 五种数据结构之外,Redis 还提供了 bitmap、bitfield、 hyperloglog、geospatial、stream 等数据结构。 另外的一些数据结构,都是在某些特定环境下才会使用,使用频率不高&…...
【Android】四大组件之ContentProvider
目录 一、什么是 ContentProvider 二、创建和使用 ContentProvider 三、跨应用权限控制 四、数据变更通知 五、多表关联与视图 六、异步处理 你手机里的通讯录,存储了所有联系人的信息。如果你想把这些联系人信息分享给其他App,就可以通过ContentP…...
Qwen3 发布:优化编码与代理能力,强化 MCP 支持引领 AI 新潮流
人工智能领域的每一次重大突破都如同璀璨星辰,照亮了人类前行的道路。2025 年 4 月 29 日凌晨,阿里巴巴旗下的 Qwen 官方团队正式发布了最新一代大语言模型 ——Qwen3,犹如一颗重磅炸弹,在 AI 领域掀起了惊涛骇浪。此次发布&#…...
LEETERS题解
【题目描述】 给出一个rowcolrowcol的大写字母矩阵,一开始的位置为左上角,你可以向上下左右四个方向移动,并且不能移向曾经经过的字母。问最多可以经过几个字母。 【输入】 第一行,输入字母矩阵行数RR和列数SS,1≤R,S≤…...
图像加密算法概述
版本: 1.0 日期: 2025年5月1日 目录 引言 1.1 什么是图像加密?1.2 为什么需要图像加密?1.3 图像数据的特点与加密挑战加密基础概念 2.1 明文与密文2.2 加密与解密2.3 密钥2.4 对称加密与非对称加密为什么传统文本加密算法不完全适用于图像? 3.1 数据量巨大3.2 高度冗余性…...
loads、dumps、jsonpath使用场景
在处理JSON数据时,loads、dumps 和 jsonpath 是三个非常有用的工具或概念。它们各自在不同的场景下发挥作用,让我们一一来看: 1. loads loads 函数是 Python 中 json 模块的一部分,用于将 JSON 格式的字符串解析成 Python 的数据…...
Winform(7.序列化方式整理)
今天我又对序列化方式进行了整理,可以与上一篇序列化方式一起看 一.序列化方式(四种) 1.二进制序列化 //定义 Person 类,需要标记为可序列化 [Serializable] public class Person { public string Name{get;set;} public int Age{get;set;} } 在进行二进制序列化…...
通过AI的联网功能提升搜索检索能力
以百度ai搜索(百度AI搜索 - 办公学习一站解决)为例,ai会自动根据问题搜集现有互联网文章,避免人工通过传统检索引擎的结果逐个去查找,这种方式文章的相关性会更高。 tip:快速查看每篇文档,仅关…...
Spring IoC容器的设计与实现
Spring整体架构与模块划分 核心容器(Core Container) spring-core 基础工具类:如资源加载(Resource接口)、反射工具(ReflectionUtils)、类型转换(ConversionService)。…...
使用vue的插值表达式渲染变量,格式均正确,但无法渲染
如图,作者遇到的问题为,输入以下代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…...
数据库 AI 助手测评:Chat2DB、SQLFlow 等工具如何提升开发效率?
一、引言:数据库开发的 “效率革命” 正在发生 在某互联网金融公司的凌晨故障现场,资深 DBA 正满头大汗地排查一条执行超时的 SQL—— 该语句涉及 7 张核心业务表的复杂关联,因索引缺失导致全表扫描,最终引发交易系统阻塞。这类场景在传统数据库开发中屡见不鲜:据 Gartne…...
21.1Linux中的LCD驱动实验(知识)_csdn
1、LCD 和 LTDC 简介 1.1、LCD 简介 1.1.1、分辨率 1.1.2、像素格式 可以看到红、绿、蓝每个8位,还有一位是A7~A0就是透明通道,32位ARG8888。 1.1.3、LCD 屏幕接口 1.1.4、LCD 时间参数 如果将 LCD 显示一帧图像的过程想象成绘画,那么…...
Angular教程前言:历史、安装与用途
Angular 是一个强大且流行的开源前端 Web 应用程序框架,由 Google 开发并维护 1。它在现代 Web 开发中占据着重要的地位,尤其在构建动态、高效且可扩展的 Web 应用程序方面表现出色,特别适用于单页应用程序 (SPA) 和复杂的用户界面 1。本教程…...
node.js模块化步骤(各标准区别)CommonJS规范、AMD规范、UMD规范、ES Modules (ESM)
前后端建议统一使用ESM 文章目录 Node.js模块化发展历程与标准对比一、模块化的意义1.1 解决的核心问题1.2 没有模块化的问题 二、CommonJS规范2.1 核心特征2.2 实现示例 三、AMD (Asynchronous Module Definition)3.1 特点3.2 代码示例 四、UMD (Universal Module Definition)…...
Unity图片导入设置
🏆 个人愚见,没事写写笔记 🏆《博客内容》:Unity3D开发内容 🏆🎉欢迎 👍点赞✍评论⭐收藏 🔎Unity支持的图片格式 ☀️BMP:是Windows操作系统的标准图像文件格式,特点是…...
MySQL与分布式架构的碰撞
目录 一、分布式架构的核心挑战与MySQL的应对策略 1.1 高并发与扩展性 1.3 高可用与容灾 二、MySQL分布式架构的核心技术实现 2.1 读写分离与主从复制(扩展) 2.2 数据分片与分布式存储(扩展) 2.3 MySQL Cluster与NDB引擎&am…...
python-MySQL鏈接
python鏈接MySQL,主要利用庫 pip install mysql-connector-pythonimport mysql.connector# 配置连接参数 config {"user": "your_username","password": "your_password","host": "localhost", # 或…...