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

Python 学习笔记【1】

此笔记仅适用于有任一编程语言基础,且对面向对象有一定了解者观看

文章目录

  • 数据类型
    • 字面量
    • 数字类型
    • 数据容器
      • 字符串
      • 列表
      • 元组
    • type()方法
    • 数据类型强转
  • 注释
    • 单行注释
    • 多行注释
  • 输出
    • 基本输出
    • 连续输出,中间用“,”分隔
    • 更复杂的输出格式
  • 变量
    • 定义
    • del方法
  • 标识符
  • 运算符
    • 比较运算符
    • 逻辑运算符
  • 输入
    • input()
    • 正常输入
    • 连续输入
  • 控制语句
    • 自上而下的控制语句
    • if条件语句
    • 循环语句
      • for循环
        • range()
        • for循环临时变量作用域
      • while循环
      • break
      • continue
      • else
  • 函数
    • 定义函数
    • 调用函数
    • 传参
      • 位置参数
      • 关键字参数
      • 位置参数和关键字参数混用
      • 缺省参数
      • 可变参数(不定长)
        • 位置传递不定长
        • 关键字传递不定长
    • 多个返回值
    • 函数作为传参
    • 匿名函数
      • 介绍
      • 基本语法
      • 演示案例
  • 数据容器
    • 概述
    • 列表(list)
      • 介绍
      • 基本语法
      • 列表下标(索引)
      • 列表方法
        • 查询某元素下标
        • 修改对应下标的元素值
        • 在指定下标插入新元素
        • 追加元素
        • 删除指定下标元素
        • 删除某元素在列表的第一个匹配项
        • 清空列表
        • 统计某元素在列表中数量
        • 统计列表中所有元素数量
        • 排序
        • 列表拼接
    • 元组(tuple)
      • 介绍
      • 基本语法
        • 元组方法
    • 字符串(str)
      • 简介
      • 基本语法
      • 字符串方法
    • 数据容器的切片
      • 序列
      • 切片
    • 集合(set)
      • 介绍
      • 基本语法
      • 集合方法
      • 遍历集合
    • 字典(dict)
      • 介绍
      • 基本语法
      • 常用操作
      • 遍历字典
    • 容器通用函数
  • 迭代器和生成器
    • 迭代器
      • 简介
      • 创建迭代器
      • 迭代迭代器
    • 生成器
      • 简介
      • 创建生成器
      • 迭代生成器
  • Python3 内置函数
    • zip
    • enumerate
  • 文件操作
    • 文件编码
    • 文件基础操作
      • 打开文件
      • 关闭文件
      • 读操作
      • 写操作
    • CSV文件
  • 异常
    • 介绍
    • 捕获异常
      • 是什么
      • 为什么
      • 怎么做
      • 异常else
      • 异常finally
    • 异常传递
      • 介绍
  • 模块
    • 介绍
    • 导入模块
    • name变量
      • all变量
    • 自定义模块
      • 创建
      • 导入
    • 介绍
    • 创建包
    • 导入包
    • init.python文件
    • 第三方包
      • 如何安装第三方包
  • pyecharts模块
    • 介绍
    • 快速入门
      • 简单的画一个图
      • 全局配置
  • Numpy模块
    • 基础知识
    • 创建数组
    • 打印数组
    • 基本操作
    • 通函数
    • 索引、切片和迭代
  • datetime包
  • 类与对象
    • 基本操作
    • 构造方法(构造器)
    • 魔术方法
      • 介绍
      • str方法
      • lt方法
      • le方法
      • eq方法
    • 封装
      • 私有成员

数据类型

字面量

字面量就是非变量,直接以值的方式存在于程序中

数字类型

  • 整数
  • 浮点
  • 复数
  • 布尔

数据容器

字符串

三种定义方式

str1 = 'str1'
str2 = "str2"
str3 = """str3"""

列表

在后面列一个章节介绍

元组

在后面列一个章节介绍

type()方法

将变量 or 自变量放入“()”内,type()的返回值就是对应数据类型

数据类型强转

str = "123"# 这时str是字符串类型
str = (int)str# 这句话执行完str就成了int类型

注释

单行注释

# 这是单行注释
# #号和注释间一般用一个空格隔开

多行注释

"""这是多行注释这是多行注释这是多行注释
"""

输出

基本输出

连续输出,中间用“,”分隔

print(1,2,"3",4,5)#输出逗号默认为空格

更复杂的输出格式

  • 输出多个结果时,使用“,”分隔符

    print(1,2,3,sep=",")# 用分隔符“,”区分输出结果
    
  • 输出不换行

    print(x,end="")
    print(y)
    
  • %d、%s、%e的格式化输出

    print('%d'%3.1415926)# 仅输出整数部分
    print('%10s'%'Monday')# Monday右对齐,取十位,不够则补位
    print('%.3e'%3.1415926)# 3.1415926取3位小数,用科学计数法计数
    print('%.2f'%4.1415)# 保留两位小数
    
  • format的输出格式

    print('{}{}{}'.format
    ('Monday','Tuesday','Wednesday'))
    # 带关键字
    # "and"拼接
    
  • 自动格式化输出

    a = 180
    b = "roland"
    print(f"{b}的身高{a}")
    

变量

定义

变量名 = 变量值

bianliang = 1

del方法

使一个变量恢复到未定义状态

标识符

python中只支持:

  • 英文
  • 中文
  • 数字
  • 下划线 “_”

这四类元素

且,

  • 不推荐中文
  • 数字不能在开头
  • 区分大小写

运算符

加:+
减:-
乘:*
除:/ (计算完自动转化成浮点型)
整除://
取余:%
指数:**

比较运算符

运算符作用
>大于
<小于
==等于
!=不等于
>=大于等于
<=小于等于

逻辑运算符

逻辑运算符功能
and与运算
or或运算
not非运算

输入

input()

传参是字符串,此函数执行时会打印括号内的内容,并等待键盘的输入。接收完输入后会以字符串的形式返回程序

正常输入

x = int (input("请输入梯形的上底长度"))

连续输入

#多数据输入中间用空格间隔
x,y,z=map(int,input(“请输入梯形的上下底长和
高“).split())
#多数据输入中间用逗号间隔
x,y,z=map(int,input(“请输入梯形的上下底长和
高”).split(”,"))

控制语句

缩进为四个空格!!!

自上而下的控制语句

if条件语句

特点:if后条件不需要用空格包住,
用:代替{}
else if 变成elif

if 1>2:print("数学崩塌了")
elif 1>3:print("数学真崩塌了")
else:print("数学还是正常的")

循环语句

for循环

for 临时变量 in 序列类型:
执行语句

序列类型指,其内容可以一个个依次取出的一种类型,包括【字符串 列表 元组 ……】

Python的for循环是一个轮询的机制,轮询 in 后的列表

name = "Roland"
for x in name:print(x)"""输出结果如下:
R
o
l
a
n
d
"""

理论上Python中的for循环无法构成无限循环(序列类型(被处理的数据集)不可能无限大)

range()
  • 语法1

    range(5)# 获得一个从0到5(不含5)的数字序列(0,1,2,3,4)
    
  • 语法2

    range(1,5)# 获得一个从1到5(不含5)的数字序列(1,2,3,4)
    
  • 语法3

    range(1,10,2)# 获得一个从1到10(不含10),步长为2的数字序列(1,3,5,7,9)
    

将range融合进for循环

for i in range(1,10,2):print (i)
for循环临时变量作用域

实际上可以在外部访问

但在编程规范上,不允许

while循环

i = 6
while(i > 0):print("i = ",i)i--

break

跳出循环

continue

中断本次循环,进入下次循环

如果没有下次了,那就跳出循环

else

在 python 中,while … else 在循环条件为 false 时执行 else 语句块:

count = 0
while count < 5:print count, " is  less than 5"count = count + 1
else:print count, " is not less than 5"'''----------------------------------------------'''
# 注意,break退出循环不会触发else
count = 0
while count < 5:print count, " is  less than 5"count = count + 1break
else:print count, " is not less than 5"

函数

定义函数

def 函数名 (参数列表):
函数体
return 返回值

# 此函数根据传参大小,打印Hello n次,并返回"Over"
def SayHello(n):# 传参列表可以空着for i in range(n):print("Hello")return "Over" #可以不写return,不写return就是等于写了一个 return None

调用函数

print(SayHello(3))# 打印三次Hello

传参

位置参数

就是c语言的传参机制

关键字参数

即函数调用时通过 “键 = 值”形式传递参数

作用:可以让函数更加清晰、更容易使用,同时也清除了参数的顺序需求

def user_info(name,age,gender):print(f"您的名字为{name},年龄为{age},性别是{gender}")user_info(name = "Roland", age = 3, gender = "男")
user_info(name = "Roland", gender = "男", age = 3)
user_info(age = 3, gender = "男", name = "Roland") 
#上面三次调用都是一样的传参效果

位置参数和关键字参数混用

def user_info(name,age,gender):print(f"您的名字为{name},年龄为{age},性别是{gender}")user_info(name = "Roland", age = 3, gender = "男")
user_info("Roland", gender = "男", age = 3)
#上面三次调用都是一样的传参效果

缺省参数

也叫默认参数,意思就是为参数提供默认值,如果传参没有传该参数,则函数自己使用默认的参数,如果有传,则使用传参

def user_info(name,age,gender = "男"):print(f"您的名字为{name},年龄为{age},性别是{gender}")user_info("Roland",age = 3)
user_info("Rose",18,"女")

可变参数(不定长)

位置传递不定长

def user_info(*args):# 这里注意下,args是一个默认的惯例,可以叫别的,但最好叫这个

传进的参数都会被 *args接收,作为一个元组存储,这也叫做位置传递

关键字传递不定长

def user_info(**kwargs):# 这里注意下,kwargs是一个默认的惯例,可以叫别的,但最好叫这个

传进的参数都会被 **kwargs接收,作为一个字典存储,这也叫做关键字传递,所以传递的参数得以字典的形式

多个返回值

# 此函数根据传参大小,打印Hello n次,并返回"Over"
def SayHello(n):# 传参列表可以空着for i in range(n):print("Hello")return "Over",6 # 多个返回值之间用逗号分隔a,b = SayHello(3)# 接收多个返回值也是用逗号分隔
print(a,b)

函数作为传参

函数1作为参数传递给函数2,其实函数2写来就是为了让使用者传递一个函数1,然后有函数2来调用。

当然,函数1所赋予的传参是由函数2给的,并不是使用者

这算是传入计算逻辑,而非传入数据

挺绕的,自己写了就清楚了

# 对1和2进行计算,至于怎么计算,根据传入的函数决定
def calc_1_and_2(Handle):x = Handle(1,2)return x#计算a+b
def math_plus(a,b):return a+b#计算a-b
def math_minus(a,b):return a-bprint(calc_1_and_2(math_plus))
print(calc_1_and_2(math_minus))

匿名函数

介绍

函数的定义中

  • def关键字,可以定义带有名称的函数,可重复使用
  • lambda关键字,可以定义匿名函数(无名称),只可临时使用一次
  • 可以用来测试某个参数是函数的函数的功能

基本语法

lambda 传入参数:函数体 # 注意函数体内只能写一行

演示案例

def test_func(computer):result = computer(1,2)print(result)test_func(lambda x,y: x + y)# 在这里就是把新定义的匿名函数的逻辑传给了test_func

数据容器

概述

一种可以同时存储多个(种)元素的python数据类型

根据是否支持重复元素、是否可以修改、是否有序等,分为5类:

  • 列表(list)
  • 元组(tuple)
  • 字符串(str)
  • 集合(set)
  • 字典(dict)

数据容器变量名是指针:也就是先定义了list1,然后list2=list1,则修改list1后,list2内容也是同步变化的

列表(list)

介绍

列表内的每一个数据称为元素

列表中可以存储不同的数据类型

列表中可以存储相同的数据

说白了就是数组Pro

基本语法

# 字面量
# [元素1,元素2,元素……]# 定义变量
# 第一种
myList = [1, 2, 3, 4, 5]
# 第二种
myList = [i for i in range(1, 6)]
# 上面两个结果一致# 定义空列表
myList = []
myList = list()# 列表嵌套
myList = [列表1,列表2]

案例演示

my_list = ["Roland", 3, True]
print(type(my_list))
print(my_list)
my_list_list = [my_list,["Roland", 3, False]]
print(my_list_list)

列表下标(索引)

my_list = ["Roland", 3, True]
# 正向索引
print(my_list[0],my_list[1],my_list[2])
# 反向索引(-1是倒数第一个,-2是倒数第二)
print(my_list[-1],my_list[-2],my_list[-3])

列表方法

查询某元素下标
列表对象.index(元素)

案例演示

my_list = ["Roland", 3, True]
print(my_list.index(3))
修改对应下标的元素值

同数组的修改元素方式,我觉得不应该叫方法

在指定下标插入新元素
列表对象.insert(下标,元素)

案例演示

my_list = ["Roland", 3, True]
my_list.insert(1,2)
print(my_list)
追加元素
列表对象.append(元素)# 将新元素追加到列表尾部
列表对象.extend(其他数据容器)# 将其他数据容器内容取出,依次追加到列表尾部

案例演示

my_list = ["Roland", 3, True]
my_list.append(2)
print(my_list)
my_list2 = ["Steve", 2, False]
my_list.extend(my_list2)
print(my_list)
删除指定下标元素
del 列表[下标]
列表对象.pop(下标)

案例演示

my_list = ["Roland", 3, True]
my_list.pop(2)
print(my_list)my_list2 = ["Steve", 2, False]
del my_list2[0]
print(my_list2)
删除某元素在列表的第一个匹配项
列表对象.remove(元素)

案例演示

my_list = ["Roland", 3, True]
my_list.remove(3)
print(my_list)
清空列表
列表对象.clear()

案例演示

my_list = ["Roland", 3, True]
my_list.clear()
print(my_list)
统计某元素在列表中数量
列表对象.count(元素)

案例演示

my_list = ["Roland", 3, True]
print(my_list.count(True))
统计列表中所有元素数量
len(列表对象)

案例演示

my_list = ["Roland", 3, True]
print(len(my_list))
排序
list.sort(cmp=None, key=None, reverse=False) # reverse=true:降序
列表拼接

元组(tuple)

介绍

元组与列表的唯一区别——不可修改

基本语法

# 定义元组字面量
(元素,元素,……)# 定义元组变量
变量名称 = (元组,元组,……)# 定义单元素元组变量(要写个逗号)
变量名称 = (元组,)# 定义空元组
变量名称 = ()
变量名称 = tuple() # 元组嵌套
元组方法
  • index
  • count
  • len

字符串(str)

简介

字符串时字符的数据容器,只能存字符

不可修改的

基本语法

# 通过下标取值
mystr = "Roland"
print(mystr[3])

字符串方法

  • .index 这里注意下,index不只是只能查单个字符的位置,也可以查一个小字符串出现的起始下标

  • .replace(字符串1,字符串2) 将调用此方法的字符串中的字符串1替换成字符串2,并以返回值的方式返回(需要一个新的变量来接收)

  • .split(“分隔符字符串”) 将调用此方法的字符串用分割字符串分割成多个元素,并存入一个列表,并以返回值的方式返回(需要一个新的变量来接收)

    # 这个方法不好描述,直接上代码
    myStr = "Hello this is Roland"
    mylist = myStr.split(" ")
    print(mylist)
    
  • .strip() 字符串规整操作,去除字符串的前后空格。传参还可以传入字符串,意思就是去除原字符串的前后被传入的字符串,当然还是将新字符串以返回值的方式返回

  • .count

  • len

数据容器的切片

序列

内容连续、有序,可使用下标索引的一类数据容器(列表、元组、字符串)

切片

从一个序列中取出一个子序列

语法:序列[起始下标:结束下标]
序列[起始下标:结束下标:步长]

arr[::-1] # 将数据容器内容倒序

注意:

  • 不含结束下标
  • 步长为负数表示反向取,呢么起始下标和结束下标也要反向标记
  • 是以返回值的方式返回新的序列
  • 传参不传步长的话就是默认步长为1

集合(set)

介绍

  • 无序、无下标
  • 不可重复
  • 可不同数据类型
  • 可修改
  • 支持for循环不支持while循环遍历

基本语法

# 定义集合字面量
{元素,元素,……}# 定义集合变量
变量名称 = {元素,元素,……}# 定义空集合
变量名称 = set()

集合方法

  • .add(元素) 将指定元素添加到自身集合内
  • .remove(元素) 删除指定元素
  • .pop()随机取一个元素通过返回值返回,同时删除此元素
  • .clear()
  • 集合1.difference(集合2) 取两个集合的差集,将新集合返回,原集合不发生变化
  • 集合1.difference_update(集合2) 在集合1内,删除和集合2相同的元素。集合1可能发生变化,集合2不变
  • 集合1.union(集合2) 将集合1和集合2合并,并以返回值的方式返回新集合
  • len(集合) 统计集合元素数量

遍历集合

由于集合没有下标,所以不能用while()遍历

可以用for循环遍历,但不能保证遍历顺序

myset = {1,2,5,6}
for i in myset:print(i)

字典(dict)

介绍

生活中的字典:【字】:含义

Python中的字典:【Key】:value

  • 无序、无下标
  • Key 不可重复(重复添加等于覆盖原有数据)
  • 值可以取任何数据类型,但键必须是不可变的,如字符串,数字或元组。
  • 可修改
  • 支持for循环,不支持while循环遍历

基本语法

# 字面量
{key:value, key:value, ……}
# 变量
mydict = {key:value, key:value, ……}
# 空字典
my_dict = {}
my_dict = dict()# 从字典中基于Key获取Value
my_dict = {"Roland":180,3:170,"Rola":160}
print(my_dict["Roland"])# 字典的嵌套(Key不可为字典)
score = {"高数":100,"大英":99,"离散":100}
student = {"Roland":score}
print(student)
print(student["Roland"])
print(student["Roland"]["高数"])

常用操作

  • 新增/更新元素

    my_dict = {	"Roland":180,"Steve":170}
    my_dict["Rola"] = 160 # 第一次使用表示新增Rola这个Key,Value为160
    print(my_dict)
    my_dict["Rola"] = 150 # 第二次使用表示修改Rola这个Key,Value为150 
    print(my_dict)
    
  • .pop(key) 获得指定Key的Value,通过返回值返回,同时删除这个key和对应的value

  • .clear() 清空字典

  • .keys() 获取所有的key(不含value)

  • len(字典) 获取字典中key的数量

  • .get(key) 获取key的值

遍历字典

my_dict = {	"Roland":180,"Steve":170,"Rola":160}
keys = my_dict.keys()
for key in keys:print(key)
for key in my_dict:# 其实这种写法和上面的的for一样,都是拿出my_dict中的所有keyprint(key)

容器通用函数

  • len
  • max
  • min

迭代器和生成器

迭代器

简介

迭代器(interation)是一个可以记住遍历的位置的对象。

迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

创建迭代器

# 使用iter方法创建
myList = [0, 1, 2, 3, 4]
myIter = iter(myList) # 等效下一行代码
myIter = iter([i for i in range(5)]) # 等效上一行代码

迭代迭代器

# 先创建一个迭代器
myIter = iter([i for i in range(5)])# 使用next方法进行迭代,每执行一次next,迭代一次,当超出了迭代返回,会由一个 StopIteration 异常结束程序
print (next(myIter))
print (next(myIter))
print (next(myIter))
print (next(myIter))
print (next(myIter))
print (next(myIter))

生成器

简介

生成器(generator)是使用了 yield 的函数 或是 由循环表达式生成的。

没错,所有函数都能成为生成器,只需要在函数内部写到 yield 关键字

生成器函数还包括以下内容:

  • 通用生成器
  • 协程生成器
  • 委托生成器
  • 子生成器

创建生成器

生成器有两种创建方式表示:

  • 生成器表达式

    # 生成器表达式是用圆括号来创建生成器
    myGenerator = (i for i in range(5)) # 与列表的创建很想,是把方括号改成圆括号
    
  • 生成器函数

    # 创建 生成器函数
    def countdown(n):while n > 0:yield nn -= 1# 创建生成器对象
    generator = countdown(5)
    

迭代生成器

 # 创建 生成器函数
def countdown(n):while n > 0:yield nn -= 1# 创建生成器对象
generator = countdown(5)# 通过迭代生成器获取值
print(next(generator))  # 输出: 5
print(next(generator))  # 输出: 4
print(next(generator))  # 输出: 3# 使用 for 循环迭代生成器
for value in generator:print(value)  # 输出: 2 1

Python3 内置函数

zip

zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象

我们可以使用 list() 转换来输出列表。

enumerate

enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。

seasons = ['Spring', 'Summer', 'Fall', 'Winter']
print(list(enumerate(seasons)))
print(list(enumerate(seasons, start=1)))# 下标从 1 开始

文件操作

文件编码

编码技术即翻译的规则

如:

  • UTF-8

  • GBK

  • Gig5

文件基础操作

打开文件

"""name:要打开的目标文件名的字符串mode:设置打开文件的模式(访问模式):只读、写入、追加等r:只读w:只写,清空文件,从头开始编辑;如果文件不存在,则创建新文件a:追加新内容写到已有内容之后;如果文件不存在,则创建新文件encoding:编码格式(字符串)
"""
open(name, mode, encoding)# 打开一个已存在的文件,或者创建一个新文件;并返回一个文件对象,可以理解成C语言中的FILE类型变量#示例
f = open("F:\Pyworks\Demo1\demo.txt","r",encoding="UTF-8")# 这里要注意,encoding在函数定义处不是第三位传参,所以要用关键字传参

关闭文件

  • .close()方式

    f = open("F:\Pyworks\Demo1\demo.txt","r",encoding="UTF-8")
    f.close()# 解除文件占用
    
  • with open语法

    with open("F:\Pyworks\Demo1\demo.txt","r") as f:print(f.readlines())
    # 通过在with open的语句块中对文件进行操作
    # 可以在操作完成后自动close文件,避免遗忘掉close方法
    

读操作

  • 文件对象.read(num) 从文件对象中读取指定长度的内容(num的单位是字符个数,如果不写num,则效果等于readlines() )(这里注意,读取的时候是有个指针的概念的,一开始指针指向第一个字符,假设第一次读取到第4个字符(第4未读出),则下次读取是从第4个字符开始)
  • 文件对象.readline() # 按照行的方式对文件内容读取一行,并返回一个字符串
  • 文件对象.readlines() # 按照行的方式对文件内容进行一次性读取,并返回一个列表,文件中每行数据作为一个元素
# 示例1
f = open("F:\Pyworks\Demo1\demo.txt","r",encoding="UTF-8")
print(f.read(10))# 示例2
f = open("F:\Pyworks\Demo1\demo.txt","r",encoding="UTF-8")
print(f.readlines())

for循环遍历文件内容

f = open("F:\Pyworks\Demo1\demo.txt","r",encoding="UTF-8")
for line in f: # 每次循环会从文件中拿一行数据以字符串形式给到lineprint(line)

写操作

# 只写的方式打开文件
f = open("F:\Pyworks\Demo1\demo.txt","w",encoding="UTF-8")
# 写入文件
f.write("你好世界")# 写入Python程序缓冲区
# 内容刷新(即Ctrl-S保存操作),可以不要这个内存刷新,当f.close被执行后或者程序关闭了,也是会自动刷新的
f.flush()# 真正写入文件中
# 追加的方式打开文件
f = open("F:\Pyworks\Demo1\demo.txt","a",encoding="UTF-8")
# 写入文件
f.write("你好世界")# 写入Python程序缓冲区
# 内容刷新(即Ctrl-S保存操作),可以不要这个内存刷新,当f.close被执行后或者程序关闭了,也是会自动刷新的
f.flush()# 真正写入文件中

CSV文件

import csvfilename='C:\\Users\\lenovo\\Desktop\\parttest.csv'
data = []
with open(filename) as csvfile:csv_reader = csv.reader(csvfile)  # 使用csv.reader读取csvfile中的文件#header = next(csv_reader)        # 读取第一行每一列的标题for row in csv_reader:            # 将csv 文件中的数据保存到data中data.append(row[5])           # 选择某一列加入到data数组中

异常

介绍

即bug,程序跑到某个位置时,编译器无法继续运行下去

捕获异常

是什么

世上没有完美的程序

我们要做的,不是力求程序完美运行,而是在力所能及的范围内,对可能出现的bug进行提前准备、提前处理

这种行为称为:异常处理:(捕获异常

为什么

当程序遇到BUG时,接下来有两种情况:

  1. 整个程序停止
  2. 对BUG进行提醒,整个程序继续运行

没有捕获异常的时候,程序是以 情况1 的方式处理bug的

但是在真实应用场景时,不可能因为一个bug就让程序停了,所以我们就需要捕获异常来实现 情况2

怎么做

  • 基本捕获语法

    try:可能发生错误的代码
    except:如果出现异常 执行的代码
    
  • 捕获指定的异常

    try:print(a)
    except NameError as e:# 这个e就是异常的对象,也就是系统自带的异常解释信息;可以不写as e,就是不接收异常对象罢了print("出现了变量未定义的异常")print(e)
    
  • 捕获多个异常

    try:print(1/0)
    except(NameError,ZeroDivisionError):print("ZeroDivision错误…")
    
  • 捕获所有异常并获取异常信息

    try:print(1/0)
    except Exception as e:print(e)
    

异常else

else表示没有异常的话要执行的代码

try:print(1/0)
except Exception as e:print(e)
else:print("没有异常~")

异常finally

finally表示无论有没有异常都要执行里面的代码

try:print(1/0)
except Exception as e:print(e)
else:print("没有异常~")
finally:print("离开异常判断区域")

异常传递

介绍

异常是具有传递性的

看看代码

def func1():return 1/0def func2():return func1()try:print(func2())
except:print("发现异常")

上述代码中func1中 0 作为除数会报异常,如果func1中没有处理这个异常的话,异常会传递到func2;如果func2也没有捕获异常的话,异常最终会传递到主程序中,如果主程序也没有捕获,那程序就停止了

模块

介绍

就是C语言的.c文件,在python中是一个.python文件,里面有定义好的函数,类,变量。

就是个工具包,直接拿过来用

导入模块

[from 模块名] import [模块 || 变量 | 函数 | *|] [as 别名][]”括起来的是可选的意思 “|” 是选其一的意思

常见的组合形式:

  • import 模块名
  • import 模块名1,模块名2
  • import 模块名 as 别名
  • from 模块名 import 类|变量|方法
  • form 模块名 import *
  • form 模块名 import 类|变量|方法 as 别名

使用import导入需要通过 . 才能使用全部功能,比如time.sleep()

使用from导入直接就能使用全部功能,比如sleep()

当导入不同模块的时候,如果有重名的函数之类的,程序会优先调用最后一次导入

name变量

如果导入的模块内有可立即执行代码,则程序运行import的时候就会直接执行模块内的代码,如下

"""这是模块文件.python"""
def test(a,b):return a+btest(a+b)
"""主程序文件.python"""
import 这是模块文件print("主程序")

如果不想执行模块内的代码呢?

这里就需要在模块内部的可执行代码前加东西了

"""这是模块文件.python"""
def test(a,b):return a+bif __name__ == '__main__': # __name__ 是一个Python内置变量,当我们运行某个.python文件是,该.python文件内的 __name__ 就会被赋值为 '__main__' 可以理解成Python的入口文件,很类似c语言的int main(){}test(a+b)
"""主程序文件.python"""
import 这是模块文件print("主程序")

all变量

如果一个模块文件中有 all 变量,当使用 from xxx import * 导入的时候,只能导入在这个列表中的元素

"""这是模块文件.python"""
__all__ = ['test_a'] # 这时候如果 from 这是模块文件 import * 的话,只能使用test_a函数,用其他导入语句的话就没关系,不用看这个all
def test_a(a,b):return a+bdef test_b(a,b):return a-b
"""主程序文件.python"""
import 这是模块文件print("主程序")
test_a(1,2)
test_b(1,2)

自定义模块

创建

只需要新建.python文件,定义对应函数,就可以了

导入

在同一个文件夹直接import或者from文件名就可以

介绍

模块可以理解成文件,包就是文件夹

相较于文件夹,包还多了一个叫 __init__.python 的文件,有了这个文件,文件夹才叫做包

创建包

  1. 新建文件夹
  2. 新建文件 __init__.python
  3. 好了

导入包

  • 方式一

    import 包名.模块名# 导入
    包名.模块名.目标 # 使用
    
  • 方式二

    from 包名 import 模块名# 导入
    模块名.目标# 使用
    

init.python文件

 __all__  = ['my_module1']#此时如果使用import *这个包时,就只能使用my_module1这个模块

第三方包

如何安装第三方包

  1. 进入cmd
  2. 输入pip install 包名
    也可以pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 包名
    没有科学上网的话第二个可以改善下载速度

pyecharts模块

介绍

可以做出数据可视化效果图的一个模块

本体是 Echarts 框架,Echarts是百度开源的数据可视化框架,而pyecharts模块是专为Python设计的模块

官方网站

安装:pip install pyecharts

快速入门

简单的画一个图

# 导包,导入Line功能构建折线图对象
from pyecharts.charts import Line# 得到折线图对象
line = Line()# 添加x轴数据
line.add_xaxis(["中国","美国","日本"])# 添加y轴数据
line.add_yaxis("GDP",[30,20,10])#生成图标
line.render()

全局配置

set_global_opts()

该方法可配置的基础配置(所谓基础配置即无论是什么图都会有的配置)如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

不学了,没用

Numpy模块

[官方链接](NumPy 介绍 | NumPy)

基础知识

NumPy的主要对象是同构多维数组。它是一个元素表(通常是数字),所有类型都相同,由非负整数元组索引。在NumPy维度中称为

NumPy的数组类ndarray被调用。它也被别名 array所知。请注意,numpy.array这与标准Python库array.array类不同,后者只处理一维数组并提供较少的功能。ndarray对象更重要的属性是:

  • ndarray.ndim - 数组的轴(维度)的个数。在Python世界中,维度的数量被称为rank
  • ndarray.shape - 数组的维度。这是一个整数的元组,表示每个维度中数组的大小。对于有 n 行和 m 列的矩阵,shape 将是 (n,m)。因此,shape 元组的长度就是rank或维度的个数 ndim
  • ndarray.size - 数组元素的总数。这等于 shape 的元素的乘积
  • ndarray.dtype - 一个描述数组中元素类型的对象。可以使用标准的Python类型创建或指定dtype。另外NumPy提供它自己的类型。例如numpy.int32、numpy.int16和numpy.float64。
  • ndarray.itemsize - 数组中每个元素的字节大小。例如,元素为 float64 类型的数组的 itemsize 为8(=64/8),而 complex32 类型的数组的 itemsize 为4(=32/8)。它等于 ndarray.dtype.itemsize
  • ndarray.data - 该缓冲区包含数组的实际元素。通常,我们不需要使用此属性,因为我们将使用索引访问数组中的元素

创建数组

# 使用array函数从常规Python列表或元组中创建数组
import numpy as npy# 一维数组
a = npy.array([2,3,4]) 
print(a)# 二维数组
b = npy.array([[1,2,3],[4,5,6],[7,8,9]])
print(b)# 在创建时显示指定数组的类型
c = npy.array([6,6,6], dtype=complex)# complex是虚数
print(c)# 创建一个全是0的数组
d = npy.zeros([3,4])
print(d)# 创建一个全是1的数组
e = npy.ones([3,4], dtype=npy.int16)
print(e)# 创建一个数组,其初始内容是随机的,取决于内存的状态。(dtype默认是float64)
f = npy.empty([3,4])
print(f)# 创建整数组成的数组
g = npy.arange(10,100,20) #从10到100,步长为20
print(g)# 创建浮点数组成的数组
h = npy.linspace(0,2,9) # 获取0到2之间的9个数# 根据π做一些操作
from numpy import pi
i = npy.linspace(0,2*pi,100) # 获取0到2π间的100个数
print(i)
j = npy.sin(i) # 将数组i中的所有元素进行正弦转化
print(j)

打印数组

numpy中的数组有一定的固定布局:

  • 最后一个轴从左到右打印,
  • 倒数第二个轴从上到下打印,
  • 其余轴也从上到下打印,每个切片用空行分隔

[[[ 0  1  2  3][ 4  5  6  7][ 8  9 10 11]][[12 13 14 15][16 17 18 19][20 21 22 23]]]

如果数组太大而无法打印,NumPy会自动跳过数组的中心部分并仅打印角点:

>>> print(np.arange(10000))
[   0    1    2 ..., 9997 9998 9999]
>>>
>>> print(np.arange(10000).reshape(100,100))
[[   0    1    2 ...,   97   98   99][ 100  101  102 ...,  197  198  199][ 200  201  202 ...,  297  298  299]...,[9700 9701 9702 ..., 9797 9798 9799][9800 9801 9802 ..., 9897 9898 9899][9900 9901 9902 ..., 9997 9998 9999]]

要禁用此行为并强制NumPy打印整个数组,可以使用更改打印选项set_printoptions

>>> np.set_printoptions(threshold=sys.maxsize)     

基本操作

数组上的算术运算符会应用到 元素 级别。即所有的元素都会收到运算符的影响

>>> a = np.array( [20,30,40,50] )
>>> b = np.arange( 4 )
>>> b
array([0, 1, 2, 3])
>>> c = a-b
>>> c
array([20, 29, 38, 47])
>>> b**2
array([0, 1, 4, 9])
>>> 10*np.sin(a)
array([ 9.12945251, -9.88031624,  7.4511316 , -2.62374854])
>>> a < 35 # 比较运算符都可以
array([ True, True, False, False])>>> A = np.array( [[1,1],
...             [0,1]] )
>>> B = np.array( [[2,0],
...             [3,4]] )
>>> A * B                       # 乘积运算符
array([[2, 0],[0, 4]])

与许多矩阵语言不同,乘积运算符*在NumPy数组中按元素进行运算。即 aij * bij

而矩阵乘积是使用@或者 dot函数

>>> A = np.array( [[1,1],
...             [0,1]] )
>>> B = np.array( [[2,0],
...             [3,4]] )>>> A @ B                       # matrix product
array([[5, 4],[3, 4]])
>>> A.dot(B)                    # another matrix product
array([[5, 4],[3, 4]])                       

当使用不同类型的数组进行操作时,结果数组的类型对应于更一般或更精确的数组(称为向上转换的行为)。

许多一元操作,例如计算数组中所有元素的总和,都是作为ndarray类的方法实现的。

  • 注意,以下几个方法有个传参叫axis,axis = 0表示对列进行操作,axis = 1表示对行进行操作
  • .sum
  • .min
  • .cumsum
  • 等……

通函数

如sin,cos,exp……这些函数也都是在数组上按元素进行运算,产生一个数组作为输出

索引、切片和迭代

一维的数组可以进行索引、切片和迭代操作的,就像 列表 和其他Python数据容器类型一样

多维的数组每个轴可以有一个索引。这些索引以逗号分隔的元组给出:

array([[ 0,  1,  2,  3],[10, 11, 12, 13],[20, 21, 22, 23],[30, 31, 32, 33],[40, 41, 42, 43]])
>>> b[2,3]
23

当提供的索引少于轴的数量时,缺失的索引被认为是完整的切片 :

>>> b[-1]                                  # the last row. Equivalent to b[-1,:]
array([40, 41, 42, 43])

如果想要对数组中的每个元素执行操作,可以使用flat属性,该属性是数组的所有元素的迭代器

for element in b.flat:print(i)

datetime包

示例代码

import numpy as np
import pandas as pd
from datetime import *# 输入2个日期
date1 = "2022.05.11 13:30:00"
date2 = "2022.05.10 12:00:00"# 创建时间点对象(不能进行减法运算)
realTime = datetime.time(10, 30, 0) # 10:30:00# 创建具体时间对象(可以进行减法运算)
realTime_dt = datetime.datetime(2021, 1, 1, realTime.hour, realTime.minute, realTime.second)# 将输入的日期转换为“datetime.datetime”类型
# 由于日期的类型是字符串,因此不能直接进行计算,会报错
date1 = datetime.strptime(date1, "%Y.%m.%d %H:%M:%S")
date2 = datetime.strptime(date2, "%Y.%m.%d %H:%M:%S")
print(" date1:", date1, "\n" ,"date2:", date2)
print(" 2个日期的类型分别是:\n", type(date1), type(date2))# 计算时间差:时间差的类型为“datetime.timedelta”类型
duration = date1 - date2
duration# 对计算差值进行天数(days)和秒数(seconds)的提取,并将秒数转换为小时数
day = duration.days
hour = duration.seconds/3600
print("days:", day)
print("hours:", hour)

类与对象

基本操作

主要要了解self

"""设计类"""
class Student:"""类的属性(变量)"""name = Noneage = None"""类的行为(方法)"""def say_hi(self,myname):# self关键字必须存在,其余定义方式和普通的函数一样print(f"hi,大家好,我是{self.name}")# 如果成员方法要直接使用成员变量,也需要在变量前加上self.print(f"hi,大家好,主人也叫我{myname}")"""创建对象"""    
stu1 = Student()
stu2 = Student()"""为对象赋值"""
stu1.name = "Roland"
stu2.name = "Rola""""获取对象信息"""
print(stu1.name)"""调用成员方法"""
stu1.say_hi("Steve")# self虽然是定义法时的形参,但是调用方法时完全可以忽略这个形参

构造方法(构造器)

类中如果有了构造方法,那么可以实现:

  • 在创建类对象 (构造类) 的时候,会自动执行
  • 在创建类对象(构造类) 的时候——new,将传入参数自动传递给构造方法使用
# 在Python中,__init__()就是构造方法也就是java中的构造器
class Student:"""类的属性(变量)"""name = Noneage = None"""构造方法"""def __init__(self,name,age):self.name = nameself.age = age"""类的行为(方法)"""def say_hi(self,myname):# self关键字必须存在,其余定义方式和普通的函数一样print(f"hi,大家好,我是{self.name}")# 如果成员方法要直接使用成员变量,也需要在变量前加上self.print(f"hi,大家好,主人也叫我{myname}")"""创建对象"""    
stu1 = Student("Roland",18)
# stu2 = Student()"""获取对象信息"""
print(stu1.name)
stu1.say_hi("Steve")

魔术方法

介绍

Python类中有很多内置方法,即无论是什么类,都会有的方法,上面所说的 init 构造方法就是魔术方法

魔术方法的命名规范:方法单词前后都有两个 “_”

有:

  • init——构造方法
  • str——字符串方法
  • lt——小于、大于符号比较
  • le——小于等于、大于等于符号比较
  • eq——==符号比较
  • 等等……

str方法

字符串方法

当类对象需要被转换为字符串时,会调用str方法,而str方法实际上就是返回一串字符串。

如果没有重写方法的话,Python内置的是返回对象的内存地址,如果重写了,那么会返回重写方法中return 的值

"""这是没有重写str方法时"""
class Student:"""类的属性(变量)"""name = Noneage = None"""构造方法"""def __init__(self,name,age):self.name = nameself.age = age"""创建对象"""    
stu1 = Student("Roland",18)"""输出对象信息(两个语句等价)"""
print(stu1)
print(str(stu1))
"""这是重写str方法时"""
class Student:"""类的属性(变量)"""name = Noneage = None"""构造方法"""def __init__(self,name,age):self.name = nameself.age = agedef __str__(self):return f"这个对象的name={self.name},age={self.age}"
"""创建对象"""    
stu1 = Student("Roland",18)"""输出对象信息"""
print(stu1)
print(str(stu1))

lt方法

支持小于或大于符号( “<、>” )比较方法

即使两个对象可以进行比较,这个是需要我们自己写的,程序内没有内置。如果没有写这个方法,但是还是使用小于号比较了两个对象,则会报错

"""案例演示"""
class Student:"""类的属性(变量)"""name = Noneage = None"""构造方法"""def __init__(self,name,age):self.name = nameself.age = agedef __lt__(self,other):# 这里other代表着另一个对象return self.age < other.agestu1 = Student("Roland",18)
stu2 = Student("Steve",19)print(stu1 < stu2)

le方法

将我对lt方法的描述中的“小于或大于”替换成“小于等于或大于等于”

eq方法

将我对lt方法的描述中的“小于或大于”替换成“等于”

封装

封装是一个思想,就是下列代码

class Student:"""类的属性(变量)"""name = Noneage = None"""构造方法"""def __init__(self,name,age):self.name = nameself.age = agedef __lt__(self,other):# 这里other代表着另一个对象return self.age < other.age

私有成员

封装一个类时,有时会有一些变量,不公开给外部使用,只给内部的方法自己调用,这时就需要私有成员的形式

相关文章:

Python 学习笔记【1】

此笔记仅适用于有任一编程语言基础&#xff0c;且对面向对象有一定了解者观看 文章目录 数据类型字面量数字类型数据容器字符串列表元组 type()方法数据类型强转 注释单行注释多行注释 输出基本输出连续输出&#xff0c;中间用“,”分隔更复杂的输出格式 变量定义del方法 标识符…...

Git系列:rev-parse 使用技巧

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…...

【Java数据结构】详解LinkedList与链表(一)

&#x1f512;文章目录&#xff1a; 1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; 2.ArrayList的缺陷 3.链表的概念及结构 4.无头单向非循环链表的实现 4.1成员属性 4.2成员方法 createList display——打印链表 addFirst——头插 addLast…...

PDF高效编辑器革新:一键智能转换PDF至HTML,轻松开启文件处理全新时代!

信息爆炸的时代&#xff0c;PDF文件因其跨平台、不易修改的特性&#xff0c;成为了商务、教育、出版等领域不可或缺的文件格式。然而&#xff0c;PDF文件的固定性也带来了诸多不便&#xff0c;特别是在需要对其内容进行编辑或格式转换时。这时&#xff0c;一款高效、易用的PDF编…...

JDBC知识

JDBC是什么? 这工作中我们针对数据库的操作,实际上很少会用到SQL语句,通过命令行/图形化来操作数据库,更多的是通过主流的编程语言来对数据库进行操作,即使通过代码来操作数据,我们还是会使用到SQL语句,所以掌握SQL语句也是很重要的. 如何通过代码操作数据库? 通过代码操作…...

C++操纵符用法

C中的操纵符&#xff08;Manipulators&#xff09;是用于格式化输入输出的特殊工具。它们可以在输出流中控制各种格式&#xff0c;如设置字段宽度、精度、填充字符等。以下是一些常用的操纵符及其用法&#xff1a; setw(int width): 设置字段宽度为width个字符。 cout <<…...

【一步一步了解Java系列】:子类继承以及代码块的初始化

看到这句话的时候证明&#xff1a;此刻你我都在努力 加油陌生人 个人主页&#xff1a;Gu Gu Study专栏&#xff1a;一步一步了解Java 喜欢的一句话&#xff1a; 常常会回顾努力的自己&#xff0c;所以要为自己的努力留下足迹 喜欢的话可以点个赞谢谢了。 作者&#xff1a;小闭 …...

探索Expect Python用法:深入解析与实战挑战

探索Expect Python用法&#xff1a;深入解析与实战挑战 在自动化和脚本编写领域&#xff0c;Expect Python已经成为了一种强大的工具组合。它结合了Expect的交互式会话处理能力和Python的编程灵活性&#xff0c;为开发者提供了一种全新的方式来处理复杂的自动化任务。然而&…...

【PostgreSQL17新特性之-explain命令新增选项】

EXPLAIN是一个用于显示语句执行计划的命令&#xff0c;可用于显示以下语句类型之一的执行计划&#xff1a; - SELECT - INSERT - UPDATE - DELETE - VALUES - EXECUTE - DECLARE - CREATE TABLE AS - CREATE MATERIALIZED VIEWPostgreSQL17-beta1版本近日发布了&#xff0c;新…...

JAVA实现人工智能,采用框架SpringAI

文章目录 JAVA实现人工智能,采用框架SpringAISpring AI介绍使用介绍项目前提项目结构第一种方式采用openai1. pom文件&#xff1a; 2. application.yml 配置3.controller 实现层 项目测试 JAVA实现人工智能,采用框架SpringAI Spring AI介绍 Spring AI是AI工程师的一个应用框架…...

基础—SQL—DQL(数据查询语言)分组查询

一、引言 分组查询的关键字是&#xff1a;GROUP BY。 二、DQL—分组查询 1、语法 SELECT 字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名 [ HAVING 分组后过滤条件 ]; 注意&#xff1a; 1、[ ] 里的内容可以有可以没有。 2、这条SQL语句有两块指定条件的地方&#…...

从CSV到数据库(简易)

需求&#xff1a;客户上传CSV文档&#xff0c;要求CSV文档内容查重/插入/更新相关数据。 框架&#xff1a;jdbcTemplate、commons-io、 DB&#xff1a;oracle 相关依赖&#xff1a; 这里本来打算用的2.11.0&#xff0c;无奈正式项目那边用老版本1.3.1&#xff0c;新版本对类型…...

K210视觉识别模块学习笔记3:内存卡写入拍摄图片_LED三色灯的操作_按键操作_定时器的配置使用

今日开始学习K210视觉识别模块: LED三色灯的操作_按键操作_定时器的配置使用_内存卡写入拍摄图片 亚博智能的K210视觉识别模块...... 固件库版本: canmv_yahboom_v2.1.1.bin 本文最终目的是编写一个按键拍照的例程序&#xff1a; 为以后的专用场景的模型训练做准备&#xf…...

如何定义“智慧校园”这个概念

在信息爆炸的时代&#xff0c;教育面临着前所未有的挑战&#xff1a;如何让每个学生在海量知识中找到属于自己的路径&#xff1f;如何让教师的智慧与科技的力量相得益彰&#xff1f;如何让校园成为培养创新思维的摇篮&#xff1f;智慧校园&#xff0c;这一概念的提出&#xff0…...

OpenSSL自签名证书

文章目录 生成1. 生成根证书的私钥&#xff08;root_private_key.pem&#xff09;2. 创建根证书的CSR和自签名证书&#xff08;root_csr.pem&#xff09;3. 生成服务器证书的私钥&#xff08;server_private_key.pem&#xff09;4. 创建服务器证书的CSR&#xff08;server_priv…...

QtCreator调试运行工程报错,无法找到相关库的的解决方案

最新在使用国产化平台做qt应用开发时&#xff0c;总是遇到qtcreator内调试运行 找不到动态库的问题&#xff0c;为什么会出现这种问题呢&#xff1f;明明编译的时候能够正常通过&#xff0c;运行或者调试的时候找不到相关的库呢&#xff1f;先说结论&#xff0c;排除库本身的问…...

【Python系列】Python 元组(Tuple)详解

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

特征融合篇 | YOLOv8 引入动态上采样模块 | 超过了其他上采样器

1. 介绍 本篇介绍了一种将动态上采样模块引入 YOLOv8 目标检测算法的新方法&#xff0c;该方法在 COCO 数据集上获得了 55.7% 的 mAP&#xff0c;超越了其他上采样器。该方法将动态上采样模块引入到 YOLOv8 的特征融合阶段&#xff0c;能够根据输入图像的特征分辨率动态调整上…...

​​​​​​​Beyond Compare 3密钥被撤销的解决办法

首先&#xff0c;BCompare3的链接如下 链接&#xff1a;https://pan.baidu.com/s/1vuSxY0cVQCt0-8CpFzUhvg 提取码&#xff1a;8888 --来自百度网盘超级会员V7的分享 1.问题现象 激活之后在使用过程中有时候会出现密钥被撤销的警告&#xff0c;而且该工具无法使用&#xff…...

知识见闻 - 人和动物的主要区别

人类和动物的主要区别之一确实在于理性&#xff0c;但这只是众多区别中的一个方面。以下是一些更全面的比较&#xff0c;突出人类和动物之间的主要区别&#xff1a; 理性和抽象思维&#xff1a; 人类&#xff1a;人类具有高度发展的理性能力&#xff0c;可以进行抽象思维、逻辑…...

Javaweb基础之工程路径

大家好&#xff0c;这里是教授.F 引入&#xff1a; 工程路径有一个知识点需要注意&#xff1a;就是相对路径。所谓相对路径就是依赖当前位置&#xff1a; 相对路径的定位依赖于当前位置或参考位置。 使用相对路径来解决&#xff0c; 一个非常重要的规则&#xff1a;页面所有的…...

国际荐酒师(香港)协会受邀出席广州意大利国庆晚宴

2024年5月30日&#xff0c;意大利驻广州总领事馆举办的2024年意大利国庆招待会及晚宴&#xff0c;庆祝意大利共和国成立。此次晚宴旨在促进中意两国之间的文化交流与合作。国际荐酒师&#xff08;香港&#xff09;协会受主办方邀请参与了这一重要活动。 国际荐酒师&#xff08;…...

让驰骋BPM系统插上AI的翅膀

让驰骋BPM系统插上AI的翅膀 在当今日益复杂多变的商业环境中&#xff0c;业务流程管理&#xff08;BPM&#xff09;系统的应用愈发广泛&#xff0c;成为企业提高效率、优化流程、降低成本的重要工具。驰骋BPM系统凭借其出色的性能和丰富的功能&#xff0c;赢得了众多企业的青睐…...

排队论 | 基于排队机制实现智能仓储机器人巡逻及避碰

研究背景: 智能仓储机器人在现代物流行业中扮演着重要的角色,能够提高仓库的运作效率和准确性。然而,仓储机器人在巡逻过程中可能会遇到其他机器人或障碍物,这就需要解决排队和避碰问题,以确保安全和高效的运作。 研究路线: 背景调研:了解智能仓储机器人的发展和应用…...

Node.js和npm常用命令

一、Node.js简介 Node.js是一个免费、开源、跨平台的JavaScript运行时环境&#xff0c;允许开发人员创建服务器、web应用程序、命令行工具和脚本。 点击查看node.js中文官网 点击查看node.js英文官网 二、npm简介 npm(Node Package Manager)是Node.js的软件包管理器&#xff0…...

pytest +allure在测试中的应用

一、allure配置&#xff1a; 1、安装allure库 pip install allure-pytest2、代码中导入 import allure3、常用命令&#xff1a; 1)、 pytest --alluredir报告目录 测试脚本.py比如&#xff1a;pytest --alluredir./allure_report &#xff08;未指定执行所有&#xff09; 2&…...

004 CentOS 7.9 mongodb7.0.11安装及配置

https://www.mongodb.com/try/download/shell https://www.mongodb.com/try/download/community 文章目录 /etc/mongod.conf在 /etc/systemd/system/ 目录下创建一个名为 mongod.service 的文件重新加载 systemd 配置&#xff1a;启用服务&#xff1a;现在&#xff0c;可以手动…...

Docker安装Redis(云服务器)

准备&#xff1a; 在云服务器中开启6370端口号 docker run -d --name redis -p 6379:6379 redis 这条命令使用docker运行一个名为"redis"的容器&#xff0c;映射容器的6379端口到主机的6379端口&#xff0c;并且使用redis镜像来运行容器。REDIS是一个开源的内存数据…...

springboot中抽象类无法注入到ioc容器

1、背景 在写代码时&#xff0c;发现service接口有两个实现类&#xff0c;并且两个实现类中没有对类名重命名&#xff0c;属性注入的时候也没有使用byName或Qualifier&#xff0c;正确情况下会发生多实现报错的问题&#xff0c;以前对这个问题进行解析过。 2、调试过程 我想…...

Java关键字大冒险:深入浅出地理解Java的精髓

Java编程语言中的关键字就像是魔法咒语&#xff0c;每一个都有自己独特的作用。在这篇博客中&#xff0c;我们将探讨Java中最常见的关键字&#xff0c;并通过有趣的例子和形象的比喻&#xff0c;让你轻松掌握它们的用法。 1. public: 万能钥匙 public关键字是Java中的“万能钥…...

Android Kotlin 打开相册选择图片(多选)

1. 核心代码 打开系统相册功能&#xff0c;本代码使用两种方式打开本地相册&#xff0c;startActivityForResult 已经废弃&#xff0c;可以使用新的方式。 package com.example.facedetectordemoimport android.content.pm.PackageManager import androidx.appcompat.app.App…...

java学习路径

ProcessOn Mindmap...

[线程与网络] 网络编程与通信原理(四):深入理解传输层UDP与TCP协议

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏:&#x1f355; Collection与数据结构 (92平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 &#x1f9c0;Java …...

IEEE编程语言排行榜:深度解析编程语言的四大维度、五大趋势、六大热门与七大挑战

IEEE编程语言排行榜&#xff1a;深度解析编程语言的四大维度、五大趋势、六大热门与七大挑战 在信息技术领域&#xff0c;编程语言排行榜一直是衡量各种编程语言流行度和影响力的重要指标。IEEE&#xff08;电气电子工程师协会&#xff09;作为全球最具影响力的科技专业组织之…...

【C++面试50题】

以下是针对C程序员面试可能遇到的一些问题&#xff0c;涵盖了从基础语法、面向对象、STL、内存管理、模板、异常处理、并发编程等多个方面。 ### 基础概念与语法 1. C与C的主要区别是什么&#xff1f; 2. 什么是构造函数和析构函数&#xff1f;它们何时被调用&#xff1f; 3. 什…...

外汇天眼:ESMA发布针对在投资服务中使用人工智能的公司的指导意见

欧洲证券和市场管理局&#xff08;ESMA&#xff09;&#xff0c;欧盟的金融市场监管机构和监督机构&#xff0c;发布了一份声明&#xff0c;为在向零售客户提供投资服务时使用人工智能技术&#xff08;AI&#xff09;的公司提供初步指导。 尽管人工智能的普及仍处于初期阶段&am…...

【前缀和 记忆化搜索】LeetCode1444. 切披萨的方案数

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 动态规划 记忆化搜索 LeetCode1444. 切披萨的方案数 给你一个 rows x cols 大小的矩形披萨和一个整数 k &#xff0c;矩形包含两种字符&#xff1a; ‘A’ &#xff…...

异常处理1--5.31

try--catch--finally格式&#xff1a; try{ }catch(错误类型){ }finally{ } 执行情况&#xff1a; package javatest5;public class test {public static void main(String[] args) {int num115;int num20;try{System.out.println("商等于&#xff1a;"num1/num…...

AI免费插件 批量条码大师,支持100多种条码类型

没想到在网上看到一款和之前 悟空条码 类似的条码插件&#xff0c;叫批量条码大师&#xff0c;他做的比 悟空条码 功能更强&#xff0c;界面更美观&#xff0c;特分享出来给大家。 本插件采用了BWIPJS条码库&#xff0c;支持110种条码、二维码的生成; 支持批量生成&#xff0c;…...

使用 Django 连接 MySQL 数据库

文章目录 步骤一&#xff1a;安装必要的库和驱动步骤二&#xff1a;配置数据库连接步骤三&#xff1a;执行数据库迁移步骤四&#xff1a;开始使用 MySQL 数据库创建一个模型迁移模型到数据库使用模型进行数据操作创建新记录&#xff1a;查询记录&#xff1a;更新记录&#xff1…...

【谷歌开发者月刊】五月内容汇总,Google I/O 点燃您的创新灵感

五月因 Google I/O 大会的成功举办而备受瞩目&#xff0c;我们在为开发者们带来技术更新的同时&#xff0c;更提供了丰富的学习资源。一起在本期月刊中回顾精彩内容&#xff0c;带着学习热情继续探索技术的更新与发展吧&#xff01; 本月看点 精彩看点多多&#xff0c;请上下滑…...

wpf 实现长时间未操作自动退出登录

思路 在WPF应用程序中实现长时间未操作自动退出&#xff0c;主要思路是先收集用户操作行为&#xff0c;用一个全局变量记录用户最后操作时间&#xff0c;再用一个异步线程去监控用户的最后操作时间和当前时间进行比较如果超过了设定时间认为长时间未操作自动退出登录并显示相关…...

pytorch学习笔记3

标量数据 标量数据通常指的是单个数值&#xff0c;比如一个损失值、准确率、学习率等。这些单个的数值数据可以被记录下来&#xff0c;用于分析模型的训练过程、性能等。在代码中&#xff0c;writer.add_scalar() 的作用就是将这些标量数据添加到日志中&#xff0c;以便后续在可…...

开源监控工具monit安装部署

Monit 简介 Monit是一个轻量级(500KB)跨平台的用来监控Unix/linux系统的开源工具。部署简单&#xff0c;并且不依赖任何第三方程序、插件或者库。 Monit可以监控服务器进程、文件、文件系统、网络状态&#xff08;HTTP/SMTP等协议&#xff09;、远程主机、服务器资源变化等等。…...

Python 时间戳转时间

一、 10 位 时间戳 &#xff0c;秒级 转换为时间 方式一&#xff1a; import timetimeStamp 1717149862 timeArray time.localtime(timeStamp) timeStr time.strftime("%Y-%m-%d %H:%M:%S", timeArray) print(timeStr) 输出: 2024-05-31 18:04:22方式二&#xf…...

【网络层】IP地址基础 与 子网掩码

文章目录 IP地址基础IP地址概念IP地址分类公网地址和私网地址 子网掩码子网掩码作用默认子网掩码网络地址、主机地址、广播地址 IP地址基础 IP地址概念 IP地址&#xff1a;IP Address 在网络中&#xff0c;通信节点都需要有一个IP地址 IP地址以点分十进制表示&#xff0c;有…...

Cholesky分解(A=L * L^T)

Cholesky分解是一种用于解线性方程组和计算矩阵平方根的算法&#xff0c;特别适用于对称正定矩阵。这种方法相比于其他解法&#xff08;如高斯消元法&#xff09;在数值稳定性上通常有更好的表现&#xff0c;并且能够有效地利用矩阵的对称性和正定性。下面简要介绍如何使用Chol…...

2024大模型新应用井喷即将到来,算力问题如何解决?

#大模型新应用 #NLP #智合同 随着人工智能技术的加速演进&#xff0c;AI大模型已成为全球科技竞争的新高地、未来产业的新赛道、经济发展的新引擎。大模型的快速发展&#xff0c;特别是在自然语言处理&#xff08;NLP&#xff09;和计算机视觉&#xff08;CV&#xff09;等…...

SpringBoot 七牛云 OSS 私有模式 获取访问链接

目录 一、问题引出 二、在SpringBoot中获取私有访问路径的操作 一、问题引出 由于七牛云OSS的公有模式存在被盗刷的风险&#xff0c;可能导致服务器额外的费用&#xff0c;于是我选择私有模式进行操作。私有模式的访问路径是一个问题&#xff0c;因为需要对应着token和e这两…...

python-模块-网络编程-多任务

一、模块 1-1 Python 自带模块 Json模块 处理json数据 {"key":"value"} json不是字典 本质是一个有引号的字符串数据 json注意点 {} 中的数据是字符串引号必须是双引号 使用json模块可以实现将json转为字典&#xff0c;使用字典的方法操作数据 。 或者将…...