二、Kotlin 内置类型

1. 基本类型

1.1 KotlinJava 的基本类型对比

KotlinJava
字节Bytebyte/Byte
整型Int & Longint/Integer & long/Long
浮点型Float & Doublefloat/Float & double/Double
字符Charchar/Chararcter
字符串StringString

1.2 定义变量

1.2.1 val 只读变量 & var 可读写变量的定义

定义 val 变量:

val foo: Type = initValue

定义 var 变量:

var foo: Type = initValue

其中:

关键字 val 表示变量 foo 为只读变量(相当于 Java 中被 final 修饰的变量)
关键字 var 表示变量 foo 为可读写变量
Type 表示变量类型
initValue 表示定义变量时的初始化赋值

举例:

// 相当于 Java 的 final String str = "Hello Kotlin";
val str: String = "Hello Kotlin"  // 相当于 Java 的  int a = 10;
var a: Int = 10  
1.2.2 使用类型推导的方式定义变量(推荐)
val foo = initValue
var foo = initValue

如上代码所示,在编译时期,Kotlin 可以根据初始化赋值自动推导变量的类型,所以定义变量时可以省略变量名后的 “: Type”。

举例:

// 省略了 ": String",但是会根据初始值 "Hello Kotlin" 自动推导为 String 类型
var str = "Hello Kotlin"  // 省略了 ": Int" ,但是会根据初始值 5 自动推导为 Int 类型
var a = 10  

注意:在 IntelliJ IEAD 中,使用快捷键 Ctrl + Q 可以看到采用类型推导定义的变量的实际类型。

1.2.3 Kotlin 定义 Long 类型的变量:

Java 中定义 long 类型变量:

long a1 = 12345678910l;
long a2 = 12345678910L;

如上所示,Java 中可以在数值后面使用字母 L 将该数值标记为 long 类型(字母不区分大小写

Kotlin 中定义 Long 类型变量:

val a = 12345678910L

如上所示,Kotlin 中也可以在数值后面使用字母 L 将该数值标记为 long 类型(但是只能使用大写的字母 L

1.2.3 Kotlin 定义浮点型的变量:
val a = 1.0   // 变量a的类型会自动推导为 Double 类型
val b = 1.0f  // 变量b的类型会自动推导为 Float 类型

1.3 数值类型转换

1.3.1 Kotlin 中不支持 Int 类型到 Long 类型的隐式转换

Java 代码:

int i = 10;
long l = i; // 隐式转换,编译通过

Kotlin 代码:

val i: Int = 10
val l: Long = i.toLong() // 不支持隐式转换,只能调用 toXxx 方法显示转换为指定类型
1.3.2 Kotlin 中不支持 Float 类型到 Double 类型的隐式转换
val a: Double = 1.0f  // 编译报错,应该改为 val c: Double = 1.0f.toDouble()

1.4 Kotlin 特有的无符号类型

Java 不同的是,Kotlin 中存在无符号类型(这应该是为了 Kotlin-native 考虑的)

有符号类型无符号类型
字节ByteUByte
短整型ShortUShort
整型IntUInt
长整型LongULong
字符串StringString

1.5 Kotlin 中的字符串

1.5.1 字符串模板(${xxx}

双引号字符串中可以使用 ${变量}${表达式}Kotlin 中称之为 字符串模板

val hello = "Hello Kotlin"
val log = "---> ${hello}"
println(log) // ---> Hello Kotlin
val a = 2
val b = 3
val ret = "a + b = ${a + b}"
println(ret) // a + b = 5
1.5.2 字符串比较(== & ===
  1. 运算符 “==” 比较 字符串内容 是否相同

  2. 运算符 “===” 比较 字符串对象 是否是同一个(内存地址比较)

在这里插入图片描述

1.5.3 行字符串(Raw String

Kotlin 中可以使用 """...""" 包裹多行字符串

在这里插入图片描述

注意:调用 trimIndent() 函数 可以去掉定义多行字符串时的统一缩进

2. 数组

  1. 基本类型数组:Java 中的基本类型数组 t[] 对应 Kotlin 中的 TArray

  2. 类类型数组:Java 中的类类型数组 T[] 对应 Kotlin 中的 Array<T>

2.1 KotlinJava 的数组对比

KotlinJava
整型IntArrayint[]
整型装箱Array<Int>Integer[]
字符CharArraychar[]
字符装箱Array<Char>Character[]
字符串Array<String>String[]

2.2 创建基本类型数组(XxxArray

2.2.1 全局函数创建:xxxArrayOf(e1, e2, ...)

调用全局函数创建:xxxArrayOf(e1, e2, ...)

其中 xxx 是基本类型,如 Char 对应 charInt 对应 intFloat 对应 float

返回基本类型数组 XxxArray

2.2.2 构造方法创建:XxxArray(size){...}
  1. 调用构造方法 XxxArray(size) 创建指定元素个数的数组,元素值为默认值。

  2. 调用构造方法 XxxArray(size){初始化代码} 创建指定元素个数的,并对元素进行初始化。

    初始化代码中可以使用默认参数 it,表示元素索引 Index

2.2.3 示例

在这里插入图片描述

2.3 创建类类型数组(Array<Xxx>

2.3.1 全局函数创建:arrayOf(e1, e2, ...) & arrayOfNulls<Xxx>(size)
  1. arrayOf(ele1, ele2, ...),其中 Xxx 是类类型,返回类类型数组 Array<Xxx>

  2. arrayOfNulls<Xxx>(size),创建指定元素个数的数组,对象元素值为默认值 null

2.3.2 构造方法创建:Array<Xxx>(size){...}

调用构造方法 Array<Xxx>(size){初始化代码} 创建指定元素个数的,并对元素进行初始化。

初始化代码中可以使用默认参数 it,表示元素索引 Index

2.3.3 示例

在这里插入图片描述

注意:

  1. Kotlin 中使用 size 属性表示数组长度(Java 中使用 length

  2. Kotlin 中调用 contentToString() 函数打印数组

  3. Java 一样,Kotlin 中也使用下标运算符 [] 访问数组元素

2.4 遍历数组(for-in 循环 & forEach 函数)

Java 中可以使用 foreach 循环遍历数组

for(T ele : arr) {}

Kotlin 中:

  1. 可以使用 for-in 循环遍历数组

    for(ele in arr) {}  // 不需要显示指定元素类型
    
  2. 还可以使用 forEach 函数遍历数组

在这里插入图片描述

2.5 判断元素是否存在(in & !in

判断元素是否存在:

  1. if(ele in arr):元素 ele 存在则返回 true

  2. if(ele !in arr):元素 ele 不存在则返回 true

其实就是在调用 contains 函数判断元素是否存在。

在这里插入图片描述

3. 区间

3.1 创建闭区间(beginEle..endEle

val range = beginEle..endEle  // [beginEle, endEle]

注意:调用 joinToString() 函数可以打印区间

在这里插入图片描述

3.2 创建前闭后开区间(beginEle until endEle

val range = beginEle until endEle  // [beginEle, endEle)

在这里插入图片描述

3.3 创建倒序闭区间(endEle downTo beginEle

val range = endEle downTo beginEle

在这里插入图片描述

3.4 指定区间步长(step

val range = beginEle..endEle step value  // 步长为value

在这里插入图片描述

3.5 遍历区间(for-in 循环 & forEach 函数)

语法:

val range = beginEle..endEle// 1. for-in 循环遍历
for(ele in range) {} // 2. forEach 函数遍历
range.forEach {// 默认参数 it 表示当前遍历到的元素
}

在这里插入图片描述

3.6 判断元素是否存在(in & !in

语法:

if(ele in range) {} // 元素 ele 存在,则为 trueif(ele !in range) {} // 元素 ele 不存在,则为 true

在这里插入图片描述

3.7 通过区间实现按索引遍历数组(arr.indices & 0 until arr.size

语法:

for(i in arr.indices) {}  // arr.indices 返回 IntRange 类型的区间, arr.indices 相当于 0 until arr.size

在这里插入图片描述

3.8 离散区间 & 连续区间

  1. beginEleendEle 是整型,则称为 离散区间

  2. beginEleendEle 是浮点型,则称为 连续区间

注意:

  1. 不能指定连续区间的步长 step

  2. 不能遍历连续区间。

4. 集合框架

4.1 Kotlin 集合框架的特点

  1. Kotlin 增加了 不可变 集合框架的接口;

  2. Kotlin 只是复用了 Java API 的集合类型,没有另外定义新的集合类型;

  3. Kotlin 提供了大量的易于使用的函数,例如 forEach/map/flatMap

  4. Kotlin为 集合框架提供了运算符级别的支持,简化了集合框架的使用。

4.2 KotlinJava 的集合框架接口对比

KotlinJava
不可变 ListList<T>List<T>
可变 ListMutableList<T>
不可变 MapMap<K, V>Map<K, V>
可变 MapMutableMap<K, V>
不可变 SetSet<T>Set<T>
可变 SetMutableSet<T>
4.2.1 可变集合 & 不可变集合

Kotlin 中的 可变不可变 集合,编译时都会转化为 Java 中对应的集合。

Kotlin 中的不可变集合就是集合创建后,不能再修改集合。

4.2.2 Kotlin 中的部分集合类型只是 Java 集合类型的别名

Koltin 中的部分集合类型,其实只是 Java 集合类型的一个别名而已,如下图:

在这里插入图片描述

Koltin 中,通过 typealias 关键字为 Java 集合类型起了个类名相同的别名,只是包名不同而已。

Koltin 这样做的目的是:为了让开发者使用 Koltin 中定义的类型,而不要在 Koltin 中使用 Java API

从而可以在除 JVM 平台之外的其他平台上运行 Kotlin 代码。

4.3 List 集合

4.3.1 创建 List 集合
4.3.1.1 创建不可变的 List 集合(listOf
val list = listOf(ele1, ele2, ele3, ...)  // 不可变List集合没有提供 add 和 remove方法
4.3.1.2 创建可变的 List 集合(mutableListOf
val list = mutableListOf(ele1, ele2, ele3, ...)  // 可变的MutableList集合提供了 add 和 remove方法
4.3.1.3 通过构造方法创建 ArrayList 集合
val list = ArrayList<T>()  // 相当于Java中的 List<T> list = new ArrayList<>();

注意:这里的 ArrayListkotlin.collections.ArrayList,而不是 Java 中的 ArrayList

4.3.1.4 示例

在这里插入图片描述

4.3.2 List 集合元素的增删(add/+=remove/-=
  1. List 集合中添加元素:

    list.add(ele)
    或
    list += ele
    
  2. List 集合中删除元素:

    list.remove(ele)
    或
    list -= ele
    

在这里插入图片描述

4.3.3 访问 List 集合元素(get/set/[]
  1. 获取指定索引位置的元素:

    val ele = list.get(index)
    或
    val ele = list[index]
    
  2. 修改指定索引位置的元素:

    list.set(index, eleValue)
    或
    list[index] = eleValue
    

在这里插入图片描述

4.4 Map 集合

4.4.1 创建 Map 集合
4.4.1.1 创建不可变的 Map 集合(mapOf
val map = mapOf(K1 to V1, K2 to V2, K3 to V3, ...)  // K to V  表示创建一个键值对
4.4.1.2 创建可变的 Map 集合(mutableMapOf`)
val map= mutableMapOf(K1 to V1, K2 to V2, K3 to V3, ...)
4.4.1.3 通过构造方法创建 HashMap 集合
val map = HashMap<K, V>() // 相当于Java中的 Map<K, V> map = new HashMap<>()

这里的 HashMapkotlin.collections.HashMap,而不是 Java 中的 HashMap

4.4.1.4 示例(Kotlin 中的类型 Any 相当于 Java 中的类型 Object

在这里插入图片描述

4.4.2 操作 Map 集合
4.4.2.1 添加键值对(put/[]
map.put(key, value)
或
map[key] = value
4.4.2.2 删除键值对(remove
map.remove(key)
4.4.2.3 访问键值对(get/[]
val value = map.get(key)
或
val value = map[key]
4.4.2.4 示例

在这里插入图片描述

4.5 二元对组 Pair

4.5.1 Pair 的创建方式:key to value/Pair(key, value)
val pair = key to value
或
val pair = Pair(key, value)
4.5.2 Pair 的访问方式:pair.first|second/val (key, value) = pair
val key = pair.first  
val value = pair.second

或:

val (key, value) = pair 注意:之所以支持这种操作方式,是因为 Pair 类中定义了运算符重载函数 component1 和 component2
4.5.3 运算符重载函数 component1 & component2

在这里插入图片描述

4.5.4 示例

在这里插入图片描述

4.6 三元对组 Triple

4.6.1 Triple 的创建方式:Triple(a, b, c)
val triple = Triple(a, b, c)
4.6.2 Triple 的访问方式:triple.first|second|third/val (a, b, c) = triple
val a = triple.first
val b = triple.second
val c = triple.third

val (a, b, c) = triple注意:之所以支持这种操作方式,是因为 Triple 类中定义了运算符重载函数 component1、component2、component3
4.6.3 运算符重载函数 component1 & component2 & component3

在这里插入图片描述

4.6.4 示例

在这里插入图片描述

5. 函数(函数也是一种类型)

Kotlin 中,函数也是一种类型

5.1 函数的定义

函数的定义语法:

fun funName(param1: Type1, param2: Type2, ...): ReturnType {//函数体
}其中,若返回值类型为 Unit(相当于 Java 中的 void),则可以省略,即:fun funName(...): Unit {}  <==>  fun funName(...) {}

5.2 函数类型

5.2.1 全局函数的函数类型:(T1, T2, …) -> ReturnType
函数定义:fun funName(p1: T1, p2: T2, ...): ReturnType {}
对应函数类型:(T1, T2, ...) -> ReturnType特别地:无参函数:fun funName(): ReturnType {}  
对应函数类型: () -> ReturnType无返回值函数:fun funName(p1: T1, p2: T2, ...) {} 
对应函数类型为:(T1, T2, ...) -> Unit无参无返回值函数:fun funName() {}  
对应函数类型为:() -> Unit
5.2.2 成员方法的函数类型:(Foo, T1, T2,…) -> ReturnType

方法可以看成是一个特殊的函数,方法的函数类型需要指定其所属的类

方法定义:class Foo {fun methodName(p1: T1, p2: T2, ...): ReturnType {}}对应函数类型:Foo.(T1, T2, ...) -> ReturnType  // 其中,Foo 称为方法的 Receiver注意:
Java 中的非静态成员方法中有个隐式的 this,这个 this 就是方法的调用者,Java 内部是通过函数参数传到方法中的。
在 Kotlin 中,方法的 Receiver 对象就是 this,因为 this 是通过函数参数传入的,所以:Foo.(T1, T2,...) -> ReturnType  还可以写成  (Foo, T1, T2,...) -> ReturnType
5.2.3 函数类型的几种写法
Foo.(T1, T2, ...) -> ReturnType 
等价于
(Foo, T1, T2, ...) -> ReturnType 
等价于
FuntionN<Foo, T1, T2, ... , ReturnType>  // 其中 N 表示 <...> 中除去 ReturnType 之外的其他参数的总个数

如上是以成员方法的函数类型举例,但同样适用于全局函数的函数类型,即:

(T1, T2, ...) -> ReturnType
等价于
FuntionN<T1, T2, ... , ReturnType>

5.3 函数引用 & 运算符 “::

c/c++ 中,函数名就是一个指针常量,表示函数的入口地址,可以把函数名作为地址值赋给函数指针。

但是在 Kotlin 中,不能直接将函数名作为地址值直接赋给函数类型的变量,而是应该将 函数引用 赋给函数类型的变量。

Kotlin 中,通过运算符 “::” 来获取函数引用。

5.3.1 全局函数的函数引用(::funName
若有函数定义:fun funName(p1: T1, p2: T2, ...): ReturnType {}
则函数引用为:::funName
5.3.2 成员方法的函数引用(Foo::methodName/foo::methodName

获取成员方法的函数引用有两种方式:

  1. 通过类名来获取函数引用;

    若有方法定义:class Foo  {fun methodName(p1: T1, p2: T2, ...): ReturnType {}}
    则函数引用为:Foo::methodName
    
  2. 通过对象来获取函数引用。

    若有:val foo = Foo()
    则函数引用为:foo::methodName
    
5.3.3 将函数引用赋给函数类型的变量
5.3.3.1 将全局函数的函数引用赋给函数类型的变量
定义函数 funNamefun funName(p1: T1, p2: T2, ...): ReturnType {}将函数引用 ::funName 赋给 (T1,T2,...) -> ReturnType 类型的变量 fun1val fun1: (T1,T2,...) -> ReturnType = ::funName因为根据函数引用 ::funName 可以推导出变量 fun1 的函数类型,所以可省略定义变量 fun1 时的类型声明val fun1 = ::funName
5.3.3.2 将成员方法的函数引用赋给函数类型的变量
定义方法 methodNameclass Foo {fun methodName(p1: T1, p2: T2, ...): ReturnType {}}将函数引用 Foo::methodName 赋给 (Foo,T1,T2,...) -> ReturnType 类型的变量 fun2val fun2: (Foo,T1,T2,...) -> ReturnType = Foo::methodName因为根据函数引用 Foo::methodNamee 可以推导出变量 fun2 的函数类型,所以可省略定义变量 fun2 时的类型声明val fun2 = Foo::methodName
5.3.3.3 类名获取的函数引用和对象获取的函数引用对应的函数类型不同
通过类名获取的函数引用时,因为函数引用 Foo::methodName 对应的函数类型是 (Foo, T1, T2,...) -> ReturnType
所以通过变量 fun2 调用方法 methodName 时,参数 1 必须传入一个 Foo 对象作为方法的 Receiver(也就是方法内部的 this)通过对象获取的函数引用时,因为对于:val foo = Foo()val fun3 = foo::methodName  
此时,变量 fun3 的函数类型是 (T1, T2, ...) -> ReturnType
从函数类型的形参列表中可以看出,通过变量 fun3 调用方法 methodName 时,不需要传入 Foo 类型的参数了。

5.4 通过函数类型的变量调用函数:()/invoke

对于函数类型的变量 funRef:val funRef: (T1, T2, T3, ...) -> ReturnType = ::funName通过该变量调用函数有2种方式:1. funRef(t1, t2, t3, ...)2. funRef.invoke(t1, t2, t3, ...)

在这里插入图片描述

5.5 带可变参数的函数定义

5.5.1 两种定义方式:args: Array<String>/vararg args: String
定义方式 1:fun funName(args: Array<String>) {}  // 相当于 Java 中的 (String[] args)定义方式 2:fun funName(vararg args: String) {}  //  相当于 Java 中的 (String... args)

其中关键字 vararg 用来声明形参 args 是一个可变参数。

5.5.2 main 函数的两种写法(无参数/可变参数)
  1. 无参的 main 函数:

    fun main() {}
    
  2. 带可变参数的 main 函数:

    fun main(vararg args: String) {}
    

5.6 结合对组类型定义多返回值的函数

5.6.1 返回值为二元对组的函数定义
fun funName(p1: T1, p2: T2, ...): Pair<RT1, RT2> {...return Pair(rt1, rt2)
}// 调用
val (a, b) = funName(p1, p2, ...)
5.6.2 返回值为三元对组的函数定义
fun funName(p1: T1, p2: T2, ...): Triple<RT1, RT2, RT3> {...return Triple(rt1, rt2, rt3)
}// 调用
val (a, b, c) = funName(p1, p2, ...)

在这里插入图片描述

5.7 带默认参数值的函数定义

fun funName(p1: T1, p2: T2, ..., pm: Tm = defaultValue1, pn: Tn = defaultValue2, ...): ReturnType {}

注意:具体默认参数值的形参建议 声明在形参列表的最后面,否则调用函数时编译器推断不出实参所对应的形参是哪个。

当然,在调用时可以通过 显示指定形参名 来避免这种问题,如:

fun funName(p1: T1 = defvalue1, p2: T2, p3: T3 = defValue3): ReturnType {}// 调用
funName(value2) // 编译报错,无法确定实参 value2 对应哪个形参
funName(p2 = value2) // 编译成功,通过显示指定形参名 p2,将实参 value2 赋给形参 p2        

5.8 案例:四则运算计算器

在这里插入图片描述

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

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

相关文章

qt初入门5:字体设置和元对象系统的练习

空闲时间&#xff0c;参考课本demo&#xff0c;做一下练习。 字体的颜色主要用QPalette类&#xff0c;调色板的作用&#xff0c;控制着窗口部件的颜色和外观&#xff0c;包括背景色、前景色、文本颜色、边框颜色等。 字体的显示样式主要用Font类&#xff0c;用于管理字体。 元…

python三数之和

给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组。 示例 1…

无限学模式-“重塑科研学习路径:ChatGPT应用实战课,开启高效率、高创新的科研之旅!“

ChatGPT 在论文写作与编程方面也具备强大的能力。无论是进行代码生成、错误调试还是解决编程难题&#xff0c;ChatGPT都能为您提供实用且高质量的建议和指导&#xff0c;提高编程效率和准确性。此外&#xff0c;ChatGPT是一位出色的合作伙伴&#xff0c;可以为您提供论文写作的…

【研0日记】24.01.25

回家倒数第6天 受不了了&#xff0c;不想写了&#xff0c;这群b怎么这么能写 用latex写了个伪代码&#xff0c;有点好玩 \usepackage[ruled,linesnumbered]{algorithm2e} \begin{algorithm}[ht] \caption{Pipeline of Kernel Iteration in K-Net.} \label{alg:alg1} …

2024年软考报名时间及条件,小白必看

不少考生开始准备报名2024年软件水平考试&#xff0c;那么报名软考有没有学历、专业以及工作经验等方面的限制呢?今天就给大家梳理下2024年软考考试&#xff0c;若有变更&#xff0c;也会及时更新内容。 免费送备考资料。联系我 2024年软考考试时间 2024年软考有两次考试&a…

在Java中如何优雅使用正则表达式?

在Java中如何优雅使用正则表达式&#xff1f; 一、正则表达式的基本概念与用途 1.1 正则表达式的简介 正则表达式&#xff0c;又称规则表达式。&#xff08;英语&#xff1a;Regular Expression&#xff0c;在代码中常简写为regex、regexp或RE&#xff09;&#xff0c;是计算…

不通过代码绕过浏览器跨域检测(权宜之策)

通过属性找到浏览器可执行程序目录 然后在cmd该目录下输入&#xff1a; msedge.exe --args --disable-web-security --user-data-dirD:\temp上述代码是以edge浏览器为例&#xff0c;找到的可执行文件名为msedge.exe&#xff0c;最后的"D:\temp"为自己新建的一个有效…

深入理解badblocks

文章目录 一、概述二、安装2.1、源码编译安装2.2、命令行安装2.3、安装确认 三、重要参数详解3.1、查询支持的参数3.2、参数说明 四、实例4.1、全面扫描4.2、破坏性写入并修复4.3、非破坏性写入测试 五、实现原理六、注意事项 团队博客: 汽车电子社区 一、概述 badblocks命令是…

代码随想录算法训练营第十六天|104.二叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数

104.二叉树的最大深度 思路&#xff1a;这道题最开始的时候&#xff0c;我想的是用前序遍历的思路来做&#xff0c;整个过程有剪枝的过程&#xff0c;弄了半天没写出来&#xff0c;主要是剪枝没写对&#xff01;最大深度是叶子节点的高度&#xff0c;可以使用后序遍历来做。 cl…

el-table 动态渲染多级表头;一级表头根据数据动态生成,二级表头固定

一、表格需求&#xff1a; 实现一个动态表头&#xff0c;一级表头&#xff0c;根据数据动态生成&#xff0c;二级表头固定&#xff0c;每列的数据不一样&#xff0c;难点在于数据的处理。做这种表头需要两组数据&#xff0c;一组数据是实现表头的&#xff0c;另一组数据是内容…

Web网页生成桌面应用

前言&#xff1a;网页生成桌面指的是将一个网页保存为桌面应用程序的形式&#xff0c;使得用户可以在桌面上直接打开该网页&#xff0c;而不必通过浏览器打开。这种桌面应用程序一般具有独立的窗口、菜单、工具栏等界面元素&#xff0c;能够提供更加方便快捷的使用体验。 实现…

【pytorch】pytorch学习笔记(续1)

p22&#xff1a;1.加减乘除&#xff1a; &#xff08;1&#xff09;add(a,b)&#xff1a;等同于ab。 &#xff08;2&#xff09;sub(a,b)&#xff1a;等同于a-b。 &#xff08;3&#xff09;mul(a,b)&#xff1a;等同于a*b。 &#xff08;4&#xff09;div(a,b)&#xff1a…

Go 接口

接口概览 接口大概理解 接口类型是队其他类型行为的概括与抽象 接口类型中&#xff0c;包含函数声明&#xff0c;但没有数据变量接口的作用通过使用接口&#xff0c;可以写出更加灵活和通用的函数&#xff0c;这些函数不用绑定在一个特定的类型实现上Go 接口特征 很多面向对象…

验厂的类型的流程

【验厂的类型的流程】 在全球贸易一体化的进程中&#xff0c;验厂已经成为出口外贸企业真正与世界接轨的一道门槛&#xff0c;并且通过近几年的不断发展&#xff0c;验厂也逐渐为企业所熟知和充分重视。 如何正确理解验厂标准&#xff0c;实施有效的方案&#xff0c;满足验厂的…

PID控制算法,带C语言源码实现

1 PID简介 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&#xff09;、Differential&#xff08;微分&#xff09;的缩写。PID控制算法是结合比例、积分和微分三种环节于一体的控制算法。PID算法是连续系统中技术最为成熟、应用最为…

面向对象和面向过程:C语言中的两种编程范式

C语言是一种结构化的编程语言&#xff0c;它支持两种不同的编程范式&#xff1a;面向对象和面向过程。编程范式是一种编程思想或风格&#xff0c;它决定了程序的组织和设计方式。本文将探讨面向对象和面向过程在C语言中的定义、特点、优缺点以及应用场景&#xff0c;并给出一些…

gitlab runner 安装、注册、配置、使用(Docker部署)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

SQL 系列教程(一)

目录 SQL 简介 SQL 是什么 SQL 能做什么 SQL 语法 数据库表 SQL 语句 注意事项 SQL 语句后面的分号 一些最重要的 SQL 命令 SQL SELECT 语句 SQL SELECT 语句 演示数据库 SELECT Column 实例 SELECT * 实例 SQL SELECT DISTINCT 语句 SQL SELECT DISTINCT 语句…

【工具使用-Everything】everything只能搜到文件夹,无法搜到文件

一&#xff0c;问题现象 everything搜索时&#xff0c;只能搜索到文件夹&#xff0c;无法搜索到文件夹下的文件。 二&#xff0c;问题原因 everything搜索设置问题&#xff0c;设置为"文件夹"导致 三&#xff0c;解决方法 将搜索选项设置为“所有”即可&#x…

5 新增课程

5.1 需求分析 5.1.1 业务流程 根据前边对内容管理模块的数据模型分析&#xff0c;课程相关的信息有&#xff1a;课程基本信息、课程营销信息、课程图片信息、课程计划、课程师资信息&#xff0c;所以新增一门课程需要完成这几部分信息的填写。 以下是业务流程&#xff1a; …