Python 一篇入门

news2024/9/25 3:23:04

目录

Python 的简介与特点

Python支持多种编程风格

解释运行

跨平台

可扩展强

可嵌入

丰富的库

Python版本选择

Python开发环境搭建

认识Python解释器

快速入门

变量和赋值

动态类型

变量命名规则

认识 "数字"

认识 "字符串"

认识 "布尔类型"

输入输出

注释

操作符

作用域和生命周期

Python关键字

列表/元组/字典

理解 "引用"

代码块及缩进

if语句

while循环

 for循环

break和continue

pass语句

列表解析

函数

文件操作

模块

实用函数

特殊标识符

文档字符串

模块文档

Unix起始行 


Python 的简介与特点

Python支持多种编程风格

Python 支持面向过程的编程风格 . 如果你熟悉 C 语言 , 那么完全可以像写 C 一样写 Python
Python 支持面向对象的编程风格 . 数字 , 字符串 , 函数 , 模块 ... 都是 " 对象 ".
Python 支持函数式编程 . 其实这世界上只有两种编程语言 , C 类语言 , Lisp 类语言 . Python 也支持函数式编程.

解释运行

Python 是一种解释型的编程语言 . C/C++ 不同 , 不是先将源代码文件转化成可执行文件 , 再执行 ; 而是直接由 Python解释器一行一行的读取源代码, 每读一行就执行一行 . 但严格意义上讲, Python 算是一种 " 半编译 , 半解释 " 型的语言 . 一方面 , Python 解释器会按行读取源代码文件 , 然后会先将源代码转为供Python 解释器直接执行的 " 字节码 ". 然后再执行字节码 . 例如, 我们执行一个 .py 文件之后 , 会生成一个同名的 .pyc 文件 . 这个 .pyc 文件就是 Python 解释器生成的字节码文件 . 如果已经存在了.pyc 文件 , 那么就不需要再 " 翻译 " 一次了 , 这样也提高了执行效率

跨平台

Python 是基于 Python 的解释器来进行执行 . 只要某个操作系统 / 平台上能运行 Python 解释器 , 就可以完美的运行
Python 的源代码 . 主流的 Windows, Linux, Mac 等操作系统上都能够很好的支持 Python

可扩展强

Python 可以很容易的调用 C/C++ 语言 . 如果觉得哪里的逻辑性能不满足要求 , 可以用 C/C++ 重构这部分模块 , Python调用.

可嵌入

Python 的代码也可以很容易的嵌入到 C/C++ 中执行

丰富的库

君子性非异也 , 善假于物也 .
Python 标准库已经非常丰富强大 , 同时也有非常庞大的第三方库 . 几乎可以是上天入地 , 心随我意~

Python版本选择

Python当前主要有两个大版本分支:

Python2: 最新版本是 Python2.7.14
Python3: 最新版本是 Python3.6.2
Python3 虽然是 Python2 的升级版 , 但是很多语法并不兼容!
关于兼容性:
C++ 能非常好的兼容 C 语言 (C 语言写的代码可以直接使用 C++ 编译器进行编译 ), 但是也意味着 C++ 背负着很多C 语言的历史包袱 .
但是 Python3 Python2 很多地方不兼容 (Python2 写的代码 , 不能很顺利的在 Python3 的解释器上执行 ).
这样意味着很多已经用 Python2 写好的代码不会很顺利的升级到 Python3.
但是这样也意味着 Python3 可以不用背负历史包袱 , 大刀阔斧的把一些不合理的地方修改掉 .
官方的说法是 , Python2 最多维护到 2020 年便停止更新 .
但是有些企业中到的 Python 版本也是 Python2.7 甚至是 Python2.6( 幸好 , Python2.7 2.6 差别不大 ).
本主要学习的是Python3版本的内容

Python开发环境搭建

Windows/Linux: VSCode + Python 插件 ( 推荐 )
Windows/Linux: PyCharm ( 推荐 )

认识Python解释器

直接在命令行中敲 python 就进入了 Python 解释器 . 这时候我们看到了一个 Python shell.
首先 , 我们可以将这个解释器当做一个基本的计算器 .
当然 , 也可以执行任意的合法 Python 语句
ctrl + d 退出 python shell.
虽然我们可以通过 Python shell 来执行一些 python 语句 , 但是更多的是将 Python 代码写到一个 .py 后缀的文件中 , 通过Python 解释器解释这个 .py 文件来执行代码

快速入门

变量和赋值

Python 中的变量不需要声明 , 直接定义即可 . 会在初始化的时候决定变量的 " 类型 "
使用 = 来进行初始化和赋值操作
>>> counter = 0
>>> miles = 1000.0
>>> name = 'Bob'
>>> kilometers = 1.609 * miles
Python中不支持 ++/-- 这样的操作, 只能写成
>>> n += 1

动态类型

同一个变量 , 可以赋值成不同的类型的值
>>> a = 100
>>> print a
100
>>> a = 'hehe'
>>> print a
hehe

变量命名规则

变量名必须是字母 , 数字 , 下划线 . 但是不能用数字开头 ( 规则和 C 语言一样 ).
变量名大小写敏感 , case Case 是两个不同的变量 .

认识 "数字"

Python 没有 int, float, 这样的关键字 , 但是实际上数字的类型是区分 "int" "float" 这样的类型的 . 使用内建函数 type 可以查看变量的类型 .
>>> a = 1
>>> type(a)
<type 'int'>
>>> a = 1.0
>>> type(a)
<type 'float'>
Python 中的数字变量的取值范围 , 没有限制 ( 完全取决于你机器的内存多大 ), 而不是像 C 语言中 int 4 个字节表示.
Python 中还有一种 "复数" 类型 . 和数学中的 " 复数 " 是相同的概念
>>> a = 10 + 5j
>>> print(a)
(10+5j)

认识 "字符串"

Python 中可以使用 单引号 ('), 双引号 ("), 三引号 ('''/""") 来表示字符串 . 这三种字符串的区别 , 我们后面再讨论.
>>> a = 'hehe'
>>> b = "hehe"
>>> c = '''hehe'''
这样的好处是如果字符串中包含了 " 这样的字符 , 就不用蹩脚的进行转义
>>> a = 'My name is "tangzhong"'
>>> print a
My name is "tangzhong"
但是有些不可见字符 , 仍然得进行转义 , 使用 \ 进行转义 . 比如换行符 \n
>>> a = 'My name is \n "tangzhong"'
>>> print(a)
My name is
使用索引操作符 [] 或者切片操作符 [:] 来获取子字符串(切片操作是一个前闭后开区间).
字符串的索引规则是: 第一个字符索引是0, 最后一个字符索引是-1(可以理解成len-1).
>>> pystr = 'hehe'
>>> pystr[0]
'h'
>>> pystr[-1]
'e'
>>> pystr[1:3]
'eh'
>>> pystr[1:-1]
'eh'
>>> pystr[1:]
'ehe'
>>> pystr[:2]
'he'
>>> pystr[:]
'hehe'
+ 用于字符串连接运算 , * 用于字符串重复
>>> a = 'hehe'
>>> b = 'haha'
>>> c = a + b
>>> print(c)
hehehaha
>>> d = a * 4
>>> print(d)
hehehehehehehehe
>>> e = a * b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't multiply sequence by non-int of type 'str'
Python没有 "字符类型" 这样的概念. 单个字符也是字符串
>>> a = 'hehe'
>>> type(a[0])
<type 'str'>
用内建函数 len 获取字符串长度
>>> a = 'hehe'
>>> print(len(a))
4
格式化字符串 , 可以使用 % 这样的方式进行格式化的替换 .
>>> a = 100
>>> pystr = "a = %d"
>>> result = pystr % a
>>> print(result)
a = 100
可以简化的写成如下方式
>>>print("a = %d" % a)
a = 100

认识 "布尔类型"

>>> a = True
>>> print a
True
>>> print(type(a))
<type 'bool'>
布尔类型的变量 , 也是一种特殊的整数类型 . 在和整数进行运算时 , True 被当做 1, False 被当做 0

输入输出

print 函数将结果输出到标准输出 ( 显示器 ) .
input 函数从标准输入中获取用户输入
>>> name = input('Enter name:')
Enter name:aaa
>>> print(name)
aaa
input 返回的结果只是一个字符串 . 如果需要获得一个数字 , 需要使用 int 函数把字符串转换成数字 .
>>> num = input('Enter num:')
Enter num:100
>>> print(num + 1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects
>>> print int(num) + 1
101

注释

Python 中使用 # 作为单行注释 . # 后面的内容都是注释的内容
a = 1.0 # define a
print(type(a))
使用中文注释时 , 要小心 ~~ 直接使用可能会运行报错 (Python3 目前已经没有这个问题了 , Python2 要注意)
Python 的源代码默认只支持 ASCII, 所以如果要包含中文 , 需要在代码文件最开头的地方注明 # - * - coding: UTF- 8 - *-

操作符

Python 中支持 + - * / % 这样的操作符 . 并且它们的行为都和 C 语言一样 .
/ " 精确除法 "
>>> a = 1
>>> b = 2
>>> print(a / b)
0.5
// " 整除 ". 会对结果进行取整
>>> a = 1
>>> b = 2
>>> print a // b
0
注意 Python2 / 是传统除法 , // 是地板除法 , Python3 的语义截然不同
** 表示乘方运算 ( 记得 Python 的数据无上限 )
>>> a = 100
>>> b = 100
>>> print a ** b
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000
Python 也支持标准的比较运算符 . > < >= <= == != 这些运算符的表达式的结果 , 是一个布尔值
>>> 2 < 4
True
>>> 2 == 4
False
>>> 2 > 4
False
>>> 2 != 4
True
Python 也支持逻辑运算符 . and or not
>>> 2 < 4 and 2 == 4
False
>>> 2 > 4 or 2 < 4
True
>>> not 6.2 <= 6
True
Python , 3 < 4 < 5 等价于 3 < 4 and 4 < 5 这一点和其他大多数编程语言都不太一样 .
运算符之间有高低优先级的区分 . 应该合理使用括号来增加代码的可读性 .
字符串和字符串之间也可以使用运算符进行操作 , 例如前面使用 + 进行字符串连接
>>> print 'haha' + 'hehe'
hahahehe
字符串之间可以使用 == != 来判定字符串的内容是否相同
>>> 'haha' != 'hehe'
True
字符串之间也可以比较大小 . 这个大小的结果取决于字符串的 " 字典序 "
>>> 'haha' < 'hehe'
True

作用域和生命周期

Python , def, class( 我们后面会讲 ), lamda( 我们后面会讲 ) 会改变变量的作用域
if, else, elif, while, for, try/except( 我们后面会讲 ) 不会改变变量的作用域
for i in range(0, 10):
        print(i)
print(i)     # 即使出了 for 循环语句块 , 变量 i 仍然能访问到 i 变量 .
def func():
        x = 1
        print(x)
print(x)     # 出了 def 的函数语句块 , 就不再能访问到 x 变量了
内建函数 globals() 返回了全局作用域下都有哪些变量 , 内建函数 locals() 返回了局部作用域下都有哪些变量
a = 100
def Func():
  x = 0
  print(globals())
  print(locals())
print 'In Gloabl'
print(globals())
print(locals())
print('In Func')
Func()
# 执行结果
In Gloabl
{'a': 100, '__builtins__': <module '__builtin__' (built-in)>, '__file__': 'test.py',
'__package__': None, 'Func': <function Func at 0x7f9085d5b9b0>, '__name__': '__main__',
'__doc__': None}
{'a': 100, '__builtins__': <module '__builtin__' (built-in)>, '__file__': 'test.py',
'__package__': None, 'Func': <function Func at 0x7f9085d5b9b0>, '__name__': '__main__',
'__doc__': None}
In Func
{'a': 100, '__builtins__': <module '__builtin__' (built-in)>, '__file__': 'test.py',
'__package__': None, 'Func': <function Func at 0x7f9085d5b9b0>, '__name__': '__main__',
'__doc__': None}
{'x': 0}
关于 Python 的变量的生命周期 , 这个不需要程序猿操心 , Python 提供了垃圾回收机制自动识别一个变量的 生命周期是否走到尽头, 并自动释放空间 ( 详情我们稍后再讲 ).

Python关键字

目前我们接触了 while, if, else, for, continue, break, return 等关键字 , 其实还有很多其他的关键字

列表/元组/字典

列表和元组类似于C语言中的数组.

使用 [] 来表示列表 , 使用 () 来表示元组 .
>>> alist = [1, 2, 3, 4]
>>> alist
[1, 2, 3, 4]
>>> atuple = (1, 2, 3, 4)
>>> atuple
(1, 2, 3, 4)
列表和元组能保存任意数量 , 任意类型的 Python 对象
>>> a = [1, 'haha']
>>> a
[1, 'haha']
可以使用下标来访问里面的元素 , 下标从 0 开始 . 最后一个下标为-1
>>> a[0]
1
>>> a[1]
'haha'
>>> a[-1]
'haha'
可以使用 [:] 切片操作得到列表或元组的子集 . 这个动作和字符串操作是一样的
>>> a[:]
[1, 'haha']
列表和元组唯一的区别是, 列表中的元素可以修改, 但是元组中的元素不能修改
>>> a = [1, 2, 3, 4]
>>> a[0] = 100
>>> a
[100, 2, 3, 4]
>>> a = (1, 2, 3, 4)
>>> a[0] = 100
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>>
字典 Python 中的映射数据类型 . 存储键值对 (key-value).
几乎所有类型的 Python 对象都可以用作键 . 不过一般还是数字和字符串最常用 .
使用 {} 表示字典 .
>>> a = { 'ip' : '127.0.0.1'} # 创建字典
>>> a['ip'] # 取字典中的元素
'127.0.0.1'
>>> a['port'] = 80 # 插入新键值对
>>> a
{'ip': '127.0.0.1', 'port': 80}

理解 "引用"

Python 中可以用 id 这个内建函数 , 查看变量的 " 地址 "
>>> a = 100
>>> id(a)
24187568
>>> a = 200
>>> id(a)
24191144
>>> b = a
>>> id(b)
24191144
>>> b = 300
>>> id(b)
25094648
a 重新赋值成 200, 相当于新创建了一个 200 这样的对象 , 然后将变量名 a 重新绑定到 200 这个对象上 .
a 赋值给 b, 其实相当于又创建了一个变量名 b, 并将 b 这个名字和 200 这个对象绑定到一起 .
再次修改 b 的值 , 可以看到其实是又创建了一个 300 这样的对象 , b 绑定到 300 这个对象上 .
像创建的 a, b 这样的变量名 , 其实只是一个对象的别名 . 或者叫做变量的 " 引用 "

代码块及缩进

Python 中使用缩进来表示代码块 . 相当于天然从语法的角度规定了代码风格 .
Python 是独一无二的使用缩进而不是 {} , 这就避免了一场党派之争 ~
并不存在大括号 . 因此也就不需要考虑大括号放在哪里了

if语句

标准的 if 条件语句语法为如下 .
如果表达式的值非 0 或者为布尔值 True, 则执行 do_something, 否则执行下一跳语句 .
if expression1:
        do_something1
elif expression2:
        do_something2
else:
        do_something3
Python 并不支持 switch/case 这样的语句 . 也没有必要支持 . 实际上 switch/case 语法并不优雅 .
如果条件分支太多 , 可以考虑使用 " 表驱动 " 的方式来组织代码 . 具体可以参见 << 代码大全 >> 18 .

while循环

while 循环语句和 if 语句语法类似 . 只要表达式的值非 0 或者为 True, 就会循环执行 do_something
while expression:
        do_something
# 循环执行三次 print
counter = 0
while counter < 3:
        print 'loop %d' % counter
        counter += 1

 for循环

Python 中的 for 循环和传统的 for 循环不太一样 .
for 循环接收可迭代对象 ( 序列或者迭代器 ) 作为参数 , 每次迭代其中的一个元素
# 遍历字符串中的每一个字符
a = 'hehe'
for c in a:
        print c
# 执行结果
h
e
h
e
# 遍历列表中的每一个元素
a = [1, 2, 3, 4]
for item in a:
print item
# 执行结果
1z
2
3
4
# 遍历字典中的所有 key-value
a = {'ip':'192.168.1.1', 'port':80}
for key in a:
print key, a[key]
# 执行结果
ip 127.0.0.1
port 80
内建函数 range 能够生成一个数字组成的列表 , 方便进行 for 循环遍历
# for 循环执行三次打印
for i in range(0, 3):
        print 'loop %d' % i
# 执行结果
loop 0
loop 1
loop 2
range 函数其实有三个参数 . 前两个参数分别表示了一个前闭后开的区间 . 第三个参数表示 step, 每次迭代的 步长
# 遍历 [0, 100) 区间中的偶数
for i in range(0, 100, 2):
print i

breakcontinue

使用 break 语句跳出当前循环
# 查找 [0, 100) 第一个 3 的倍数
for i in range(0, 100):
        if i % 3 == 0:
        break
使用 continue 语句 , 回到循环顶端 , 判定循环条件 ;
循环条件满足 , 则执行下一次循环 ;

pass语句

有时候需要用到 空语句 这样的概念 , 什么都不做 . 由于没有 {} , 需要有一个专门的语句来占位 , 要不缩进就混乱了.
if x % 2 == 0:
        pass
else:
        do_something

列表解析

又到了见证奇迹的时刻了 . Python 语法的强大简洁 , 初展峥嵘
使用 for 循环将生成的值放在一个列表中
# 生成 [0, 4) 的数字的平方序列
squared = [x ** 2 for x in range(4)]
print squared
# 执行结果
[0, 1, 4, 9]
这个过程还可以搭配使用 if 语句
# 获取 [0, 8) 区间中的所有的奇数
evens = [x for x in range(0, 8) if x % 2 == 1]
print evens

函数

一些可以被重复使用的代码 , 可以提取出来放到函数中 .
Python 使用 def 来定义一个函数 . 使用 return 来返回结果 .
def Add(x, y):
        return x + y
Python 使用 () 来调用函数
print(Add(1, 2))
理解 " 形参 " " 实参 ": 形参相当于数学中 " 未知数 " 这样的概念 . 实参就是给未知数确定具体的数值 .
Python 中没有 " 重载 " 这样的概念 . 相同名字的函数 , 后面的会覆盖前面的
def Func():
        print('aaaa')
def Func():
        print('bbbb')
Func()
# 执行结果
bbbb
Python 支持默认参数 . 函数的参数可以具备默认值
def Func(debug=True):
        if debug:
                print('in debug mode')
        print 'done'
Func()
Func(False)
Python解包(unpack)语法, 函数返回多个值
def GetPoint():
        return 100, 200
x, y = GetPoint()
假如我只关注 y, 不想关注 x, 可以使用 _ 作为占位符
_, y = GetPoint()
函数也是 " 对象 ". 一个函数和一个数字 , 字符串一样 , 都可以定义 " 别名 " 来引用它 .
def Func():
                print('aaa')
func = Func
func()
print type(func)
# 执行结果
aaa
<type 'function'>
函数既然是一个对象 , 那么也可以作为另外的一个函数的参数和返回值 . 具体细节我们后面再详细讨论 .

文件操作

使用内建函数 open 打开一个文件
handle = open(file_name, access_mode='r')
file_name 是文件的名字 . 可以是一个绝对路径 , 也可以是相对路径
handle = open('text.txt', access_mode='r')
# 或者
handle = open('/home/tangzhong/text.txt', access_mode='r')
access_mode 是文件的打开方式 . 选项有以下几种
'r' : 只读
'w' : 只写
'a' : 追加写
't' : 按文本方式读写
'b' : 按二进制方式读写
handle 是一个文件句柄 , 是一个可迭代的对象 . 可以直接使用 for 循环按行读取文件内容 .
for line in handle:
        print line
handle 使用完毕 , 需要 close . 否则会引起资源泄露 ( 一个进程能打开的句柄数目是有限的 ).
handle.close()
个完整的例子 : 统计文本中的词频
一个文本文件中 , 每一行是一个单词 . 可能有重复 . 统计每个单词出现的次数 .
示例文件 :
aaa
bbb
ccc
aaa
bb
c
aaa
代码实现如下 :
handle = open('text.txt', mode='r')
words = {}
for word in handle:
        word = word[:-1] # 去掉末尾的 \n
        if word not in words: # 使用 in 关键字判定这个单词是否是字典的 key.
                words[word] = 1
        else:
                words[word] += 1;
handle.close()
print words

模块

当我们一个项目的代码量较大的时候 , 需要把代码放到多个不同的 .py 文件中
可以通过 import 关键字 , 引用其他 .py 文件中的代码 .
被引入的这个代码文件 , 就称之为 " 模块 ".
被引入的文件 , 去掉 .py 后缀名 , 就是模块名
例如 :
# add.py 内容
def Add(x, y):
        return x + y
# test.py 内容 , 直接 import 模块名
import add
print add.Add(1, 2)
# test2.py 内容 , import add 模块中 Add 这一个名字 .
from add import Add
print Add(1, 2)
# test3.py 内容 , import 模块名 , 并且给模块名取了一个别名 .
import add
a = add
print a.Add(1, 2)
模块查找的顺序 , 先是查找当前目录 , 然后查找 Python 的安装目录 .
import sys
print sys.path # 打印出了模块查找的路径

实用函数

前面我们接触到了一些非常有用的内建函数 . 这里我们小小的总结一下

特殊标识符

Python 使用下划线 (_) 作为变量的前缀和后缀 , 来表示特殊的标识符 .
_xxx 表示一个 " 私有变量 ", 使用 from module import * 无法导入
# add.py
def _Add(x, y):
        return x + y
# test.py
from add import *
_Add(1, 2)
# 执行结果
Traceback (most recent call last):
        File "test.py", line 3, in <module>
          _Add(1, 2)
NameError: name '_Add' is not defined
_xxx_ ( 前后一个下划线 ), __xxx__ ( 前后两个下划线 ) 一般是系统定义的名字 . 我们自己在给变量命名时要 避开这种风格. 防止和系统变量冲突 .

文档字符串

写注释对于提升程序的可读性有很大的帮助 .
前面我们介绍了 # 来表示单行注释 .
对于多行注释 , 我们可以使用 三引号 ('''/""") 在函数 / 开始位置 表示 . 这个东西也被称为 文档字符串
def Add(x, y):
        '''
                define function for add two number
        '''
        return x + y
使用对象的 doc 属性就能看到这个帮助文档了 ( 别忘了 , 函数也是对象 )
print(Add.__doc__)
# 执行结果
define function for add two num
或者使用内建函数 help 也可以做到同样的效果
help(Add)
# 执行结果
Add(x, y)
define function for add two num
文档字符串一定要放在函数 / 类的开始位置 . 否则就无法使用 __doc__ 或者 help 来访问了

模块文档

不光一个函数 / 类可以有一个文档字符串 . 一个模块也同样可以
# add.py
'''
define some function for add
'''
def Add(x, y):
        return x + y
# test.py
import add
print(add.__doc__)
# 执行结果
define some function for add

Unix起始行 

对于 Linux 或者 Mac 这类的 Unix 类系统 , 可以给 Python 代码文件增加一个起始行 , 用来指定程序的执行方式
#!/usr/bin/python
print('haha')
保存上面的代码为 test.py. 给这个文件增加可执行权限 : chmod +x test.py
然后就可以通过 ./test.py 的方式执行了 .

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/833276.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】移除链表元素-图文解析(单链表OJ题)

LeetCode链接&#xff1a;203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 本文导航 &#x1f4ad;做题思路 &#x1f3a8;画图更好理解&#xff1a; ✍️代码实现 &#x1f5c2;️分情况讨论&#xff1a; ❄️极端情况&#xff1a; &#x1f4ad;做题思路 遍历链表…

油画欣赏|桂林的《瑞云》

《瑞云》陈可之•2023年绘油画《瑞云》&#xff0c;运用巧妙的光影处理&#xff0c;描绘出桂林之山、水、云的大好自然风光&#xff0c;令人心旷神怡。此作品是陈可之先生游览桂林时所绘新作。阳光和煦&#xff0c;碧波清流&#xff0c;乘舟遥看山水&#xff0c;亦是人间一大乐…

深度学习——全维度动态卷积ODConv

ODConv(OMNI-DIMENSIONAL DYNAMIC CONVOLUTION)是一种关注了空域、输入通道、输出通道等维度上的动态性的卷积方法&#xff0c;因此被称为全维度动态卷积。 part1. 什么是动态卷积 动态卷积就是对卷积核进行线性加权 第一篇提出动态卷积的文章也是在SE之后&#xff0c;他提出…

前端如何打开钉钉(如何唤起注册表中路径与软件路径不关联的软件)

在前端唤起本地应用时&#xff0c;我查询了资料&#xff0c;在注册表中找到腾讯视频会议的注册表情况&#xff0c;如下&#xff1a; 在前端代码中加入 window.location.href"wemeet:"; 就可以直接唤起腾讯视频会议&#xff0c;但是我无法唤起钉钉 之所以会这样&…

2023华数杯数学建模A题思路分析 - 隔热材料的结构优化控制研究

# 1 赛题 A 题 隔热材料的结构优化控制研究 新型隔热材料 A 具有优良的隔热特性&#xff0c;在航天、军工、石化、建筑、交通等 高科技领域中有着广泛的应用。 目前&#xff0c;由单根隔热材料 A 纤维编织成的织物&#xff0c;其热导率可以直接测出&#xff1b;但是 单根隔热…

nodejs中的path.json和path.resolve的区别

nodejs中的path.json和path.resolve的区别 我们有多少次在 Node.js 项目中遇到过path.join()和path.resolve()却没有真正理解它们之间的区别&#xff1f;本文就讲解一下这两者的区别。 重要术语 首先我们先来看看几个术语&#xff0c;便于后续我们掌握这两者的差异。 字符串…

HCIP实验练习题

实验拓扑如下&#xff1a; 实验题目要求如下&#xff1a; 【1】R2为ISP&#xff0c;只能配置IP地址 【2】R1~R2之间为HDLC封装 【3】R2~R3之间为ppp封装&#xff0c;pap认证&#xff0c;R2为主认证方 【4】R2~R4之间为ppp封装&#xff0c;chap认证&#xff0c;R2为主认证方…

2023年华数杯数学建模C题思路 - 母亲身心健康对婴儿成长的影响

# 1 赛题 C 题 母亲身心健康对婴儿成长的影响 母亲是婴儿生命中最重要的人之一&#xff0c;她不仅为婴儿提供营养物质和身体保护&#xff0c; 还为婴儿提供情感支持和安全感。母亲心理健康状态的不良状况&#xff0c;如抑郁、焦虑、 压力等&#xff0c;可能会对婴儿的认知、情…

Java包装类(自动拆装箱)

包装类 为什么要有包装类&#xff1f; 在面向对象中&#xff0c;“一切皆为对象”&#xff0c;但是基本数据类型不符合这一理念&#xff0c;为了让基本类型也称为对象 便于类型之间的转化&#xff0c;数据类型之间的基本操作 转换方式&#xff1a; int ——> Integer ne…

软件第三方测评机构简析,软件检测证明材料的作用和意义

软件检测证明材料是由信息产业部授权或省级软件产业主管部门认可的软件第三方测评机构出具的检测证明材料&#xff0c;对于用户来说非常重要&#xff0c;是从软件的开发过程、测试结果和用户评价等方面来判断软件的质量和安全性&#xff0c;它可以帮助用户判断软件的质量和安全…

【c++】rand()随机函数的应用(二)——舒尔特方格数字的生成

目录 一、舒尔特方格简介 二、如何生成舒尔特方格 &#xff08;一&#xff09;线性同余法 1、利用线性同余法生成随机数序列的规律 (1) 当a和c选取合适的数时&#xff0c;可以生成周期为m的随机数序列 (2) 种子seed取值也是有周期的 2、利用线性同余法生成5阶舒尔特方格…

IIC子系统-实现si7006温湿度传感器采集温湿度功能

1.将IIC核心层和总线驱动层配置进内核 *********************配置核心层*************************1.找到核心层代码目录&#xff1a;内核顶层目录/drivers/i2c2. 内核顶层目录执行make menuconfig3. > Device Drivers > I2C support ->-*-I2C support4.保存退出***…

Java进阶——数据结构与算法之哈希表与树的入门小结(四)

文章大纲 引言一、哈希表1、哈希表概述2、哈希表的基本设计思想3、JDK中的哈希表的设计思想概述 二、树1、树的概述2、树的特点3、树的相关术语4、树的存储结构4.1、双亲表示法4.2、孩子兄弟表示法&#xff1a;4.3、孩子表示法&#xff1a;4.4、双亲孩子表示法 三、二叉树1、二…

ThreadPoolExecutor详解(上)

为什么会有线程池&#xff1f; 如果客户端发一个请求&#xff0c;服务端就创建一个线程接收请求&#xff0c;线程资源是有限的&#xff0c;而且创建一个线程和执行结束之后都要调用操作系统资源销毁线程&#xff0c;这样频繁操作肯定非常占用cpu和内存资源&#xff0c;线程池的…

性能测试 —— “问题分析”

性能测试大致分以下几个步骤&#xff1a; 需求分析 脚本准备 测试执行 结果整理 问题分析 今天要说的是最后一个步骤——“问题分析”&#xff1b; 需求描述 有一个服务&#xff0c;启动时会加载一个1G的词表文件到内存&#xff0c;请求来了之后&#xff0c;会把请求词去…

构建稳健的PostgreSQL数据库:备份、恢复与灾难恢复策略

在当今数字化时代&#xff0c;数据成为企业最宝贵的资产之一。而数据库是存储、管理和保护这些数据的核心。PostgreSQL&#xff0c;作为一个强大的开源关系型数据库管理系统&#xff0c;被广泛用于各种企业和应用场景。然而&#xff0c;即使使用了最强大的数据库系统&#xff0…

LeetCode 25题:K个一组翻转链表

题目&#xff1a; 给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。 你不能只是单纯…

嵌入式:C高级 Day2

一、递归实现&#xff0c;输入一个数&#xff0c;输出这个数的每一位 二、递归实现&#xff0c;输入一个数字&#xff0c;输出这个数的二进制 三、写一个脚本&#xff0c;包含以下内容 1.显示/etc/group文件中第五行的内容 2.创建目录/home/ubuntu/copy 3.切换工作路径到此目录…

《命运》阅读笔记

《命运》阅读笔记 2023年5月17号在杭州的小屋读完&#xff0c;我读完后&#xff0c;脑海里经常把余华的《活着》和这本《命运》的故事情节搞混淆&#xff0c;几乎都是讲着生活的苦难。全文以阿太&#xff08;外婆的妈妈&#xff09;的视角&#xff0c;在她九十九岁的人生里&…

在excel中整理sql语句

数据准备 CREATE TABLE t_test (id varchar(32) NOT NULL,title varchar(255) DEFAULT NULL,date datetime DEFAULT NULL ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; INSERT INTO t_test VALUES (87896cf20b5a4043b841351c2fd9271f,张三1,2023/6/8 14:06); INSERT INTO t_test …