慕课网《Flutter从入门到进阶》学习笔记二
文章目录
- Flutter必备Dart基础:Dart快速入门
- 学习资料
- 4-1 Flutter之Dart概述
- 4-2 Flutter之Dart常用数据类型(数字、类型转换)
- 4-3 Flutter之Dart常用数据类型(字符串)
- 4-4 Flutter之Dart常用数据类型(布尔, List)
- 4-5 Flutter之Dart常用数据类型(Map)
- 4-6 Flutter之Dart常用数据类型(科普小姿势)
- 4-7 带你揭开Flutter中的面向对象(标准构造方法、初始化列表)
- 4-8 带你揭开Flutter中的面向对象(命名构造方法)
- 4-9 带你揭开Flutter中的面向对象(工厂构造方法)
- 4-10 带你揭开Flutter中的面向对象(命名工厂构造方法)
- 4-11 带你揭开Flutter中的面向对象(get和set,静态方法)
- 4-12 带你揭开Flutter中的面向对象(抽象类和方法)
- 4-13 带你揭开Flutter中的面向对象(mixins)
- 4-14 带你解锁Flutter中常用的Dart方法类型
- 公有方法
- 私有方法
- 匿名方法
- 入口方法
- 4-15 带你了解Dart泛型在Flutter中的应用
- 4-16 有哪些可以在Flutter上的编程技巧
- 安全的调用
- 使用`??`设置默认值
- 类似ES6中的简化判断
- 4-17 小结
Flutter必备Dart基础:Dart快速入门
学习资料
Dart中文网
4-1 Flutter之Dart概述
Dart
特性:
JIT
:即时编译,开发期间,更快编译,更快重载。
AOT
:事前编译,release期间,更快更流畅。
4-2 Flutter之Dart常用数据类型(数字、类型转换)
常用数据类型:
创建dart_type.dart
option
+ 回车
引入头文件
option
+ 回车
创建方法
int
类型和double
类型是num
类型的子类。
常用API:
num num1 = -1.0; // 是数字类型的父类num num2 = 2; // 是数字类型的父类int int1 = 3; // 只能是整数,int是num的子类double d1 = 1.68; // 双精度,double是num的子类print("num:$num1 num: $num2 int: $int1 double: $d1");print(num1.abs()); // 求绝对值print(num1.toInt()); // 转换成int类型print(num1.toDouble()); // 转换成double
4-3 Flutter之Dart常用数据类型(字符串)
Dart里面定义字符串可以用双引号也可以用单引号。
拼接字符串可以用+
也可以用单引号
和$
符号。
字符串其它方法:startsWith
, replaceAll
, contains
, split
等。
// 字符串使用void _stringType() {String str1 = '字符串';String str2 = "双引号";String str3 = "str1:$str1 str2:$str2"; // 字符串拼接String str4 = 'str1: ' + str1 + 'str2: ' + str2; // 字符串拼接print(str3);print(str4);// 常用方法String str5 = '常用数据类型,请看控制台输出';// 截取字符串print(str5.substring(1, 5)); //输出:用数据类// 获取字符串在字符串中的位置print(str5.indexOf('类型')); // 输出:4// 其它方法:startsWith, replaceAll, contains, split等}
Dart
中方法都加下划线,同时要放在build
方法中:
Widget build(BuildContext context) {_numType(); // 方法放在build里面_stringType(); // 字符串方法return Container(child: Text('常用数据类型,请查看控制台输出'),);}
4-4 Flutter之Dart常用数据类型(布尔, List)
bool
类型用法:
// 布尔类型,Dart是强bool类型检查,只有bool类型的值是true,才被认为是truevoid _boolType() {bool success = true;bool fail = false;print(success);print(fail);// 常用方法print(success || fail); // 逻辑或print(success && fail); // 逻辑与}
集合List
用法:
void _listType() {print('----_listType----');// 集合初始化的方式List list = [1, 2, 3, '集合']; // 1:初始化时添加元素print(list); // 输出:flutter: [1, 2, 3, 集合]List<int> list2 = []; // 集合只能是int类型// list2 = list; // 错误做法,类型转换错误List list3 = [];list3.add('list3');list3.addAll(list);print(list3); // 输出:flutter: [list3, 1, 2, 3, 集合]// 集合生成函数// 第1个参数是元素数量// 第2个参数是生成规则List list4 = List.generate(3, (index) => index * 2);print(list4); // 输出:flutter: [0, 2, 4]}
遍历List
的3种方法:for
循环, for...in
,forEach
。
// 遍历集合的方式:for循环for (int i = 0; i < list.length; i++) {print(list[i]);}// 遍历集合的方式2for (var item in list) {print(item);}// 遍历集合的方式3:forEachlist.forEach((element) {print(element);});
List
其它方法:list.removeXx
, insert
, sublist
, indexof
等
4-5 Flutter之Dart常用数据类型(Map)
map
是<key,value>
结构,key
和value
可以是任何类型的对象,并且key
是唯一的,如果key
重复后面添加的value
覆盖之前的value
值。
Map
初始化的2种方式:注意List
初始化是[]
,Map
是{}
// Map初始化方式1// key和value通过冒号分割,元素通过逗号分割// 集合List初始化是[], Map是{}Map names = {'xiaoming': '小明', 'xiaohong': '小红'}; print(names);// Map初始化方式2Map ages = {};ages['xiaoming'] = 16;ages['xiaohong'] = 18;print(ages);
Map
遍历的3种方式:forEach
、for
循环、map
方法
// Map遍历:forEachages.forEach((key, value) {print('$key, $value');});// Map遍历:for循环for (var key in ages.keys) {print('$key ${ages[key]}'); // 注意是${ages[key]},${}}// Map遍历:使用map方法// map方法返回一个新的Mapages.map((key, value) {print('$key $value');return MapEntry(value, key); // 颠倒key,value});
创建key,value
颠倒的Map
:使用MapEntry
构造新Map
,使用map
方法。
// 创建k,v颠倒的MapMap ages2 = ages.map((k, v) {return MapEntry(v, k);});print(ages2); // 打印颠倒k,v的Map
注意map
方法返回的是1个新的Map
。
其它方法:keys
, values
, remove
, containsKey
。
4-6 Flutter之Dart常用数据类型(科普小姿势)
dynamic
、var
、Object
三者的区别:
dynamic
:是所有Dart
对象的基础类型,在大多数情况下,通常不直接使用它
通过dynamic
定义的变量会关闭类型检查,这意味着dyamic x = 'hal'; x.foo();
这段代码静态类型检查不会报错,但是运行的时候会报错,因为x
没有foo()
方法,所以建议大家在编程时不要直接使用dynamic
。
dynamic
可以定义任意的数据类型,但是会导致Dart语法检查失效
dynamic
赋值的变量只有在运行时才知道数据类型
变量.runtimeType
输出变量的类型
// dynamic动态数据类型// dynamic可以定义任意的数据类型,但是会导致Dart语法检查失效// dynamic赋值的变量只有在运行时才知道数据类型dynamic x = 'hal';print(x.runtimeType); // 输出:flutter: Stringprint(x); // 输出:flutter: hal// x.foo(); // 编译不报错,运行报错x = 123;print(x.runtimeType); // 输出:flutter: intprint(x);
var
:是一个关键字,意思是“我不关心这里的类型是什么。”,系统会自动推断类型runtimeType
。
但是var
定义的变量不能改变类型。
// var关键字,意味着不关心数据类型是什么// var定义的数据类型被定义后不能修改var a = 'var';print(a.runtimeType); //输出:flutter: Stringprint(a); // var// a = 123; // 因为a被var定义成String,所以报错a = 'deed'; // 正确
Object
:是Dart
对象的基类,当你定义:Object o=xxx;
时这时候系统会认为o
是个对象,你可以调用o
的toString()
和hashCode()
方法。
因为Object
提供了这些方法,但是如果你尝试调用o.foo()
时,静态类型检查会进行报错。
综上不难看出dynamic
与Object
的最大的区别是在静态类型检查上。
// Object是Dart对象的基类Object o1 = 'deed';print(o1.runtimeType); //输出:flutter: Stringprint(o1); // deed
4-7 带你揭开Flutter中的面向对象(标准构造方法、初始化列表)
Dart
面向对象脑图:
Dart
中所有的类都继承自Object
。
类的构造方法作用:初始化类的对象
类的构造方法1:初始化构造方法
class Person {String name;int age;// Person类初始化方法,标准化构造方法Person(this.name, this.age);}
多态:通过@override
重载父类的方法,如下重载Object
类中方法。
// 重载父类的toString()方法,面向对象多态的体现@overrideString toString() {return 'name:$name, age:$age';}
创建Student
类继承Person
类:创建子类的构造方法时要初始化父类的构造方法
类的构造方法2:初始化列表,冒号后面的表达式是类的初始化列表,先完成父类的初始化,再完成子类的初始化
class Student extends Person {// super完成父类的初始化,再完成子类的初始化Student(String name, int age) : super(name, age);}
类的私有变量通过下划线
创建:Dar
t通过下划线
来标识私有变量,类似于private
,同理Dart
中方法
也是下划线
创建
String _school; // Dart通过下划线来标识私有变量,类似于private
父类初始化完成后,初始化自有参数:
// 通过this._school初始化自有参数
// name, age交给父类初始化Student(this._school, String name, int age) : super(name, age);
构造方法中的可选参数:{}
内为可选参数
// 可选参数// city为可选参数Student(this._school, name, age, {this.city}) : super(name, age);
构造方法中的默认参数:首先默认参数必须是可选参数,紧接着默认参数赋值
_school
:私有参数city
:可选参数country
:默认参数,也是可选参数
// 默认参数countryStudent(this._school, name, age, {this.city, this.country = 'China'}): super(name, age);
类的初始化列表是跟在冒号后面的一串表达式,跟在冒号
后面,通过逗号
和父类构造方法隔开。
// 初始化列表表达式// 逗号后面是父类构造方法Student(this._school, name, age, {this.city, this.country = 'China'}): name = '$country.$city',super(name, age);
构造方法的方法体可以省略,如下显示构造方法的方法体
// 构造方法体Student(this._school, name, age, {this.city, this.country = 'China'}): name = '$country.$city',super(name, age) {print('构造方法体不是必须的'); // 构造方法的方法提}
4-8 带你揭开Flutter中的面向对象(命名构造方法)
命名构造方法:
- [
类名
+.
+方法名
],比如Student.cover
,其中cover
是自定义的方法名 - 使用命名构造方法为类实现多个构造方法
- 命名构造方法可以有方法体
// 命名构造方法: [类名 +1 . + 方法名]// 使用命名构造方法为类实现多个构造方法// 命名构造方法可以有方法体1Student.cover(Student stu) : super(stu.name, stu.age){print('命名构造方法');}
4-9 带你揭开Flutter中的面向对象(工厂构造方法)
工厂构造方法:返回单例模式,factory
关键字
oop_learn.dart
:
class Logger {static Logger _cache; // 静态实例// factory关键字,返回唯一的类的实例// 工厂构造方法:// 不仅仅是构造方法,更是一种模式// 有时候为了返回一个之前已经创建的缓存对象,原始的构造方法已经不能满足要求// 那么可以使用工厂模式来定义构造方法// 对外只暴露了工厂构造方法factory Logger() {if (_cache == null) {_cache = Logger._internal();}return _cache;}// 私有的命名构造方法,没有对外暴露Logger._internal();void log(String msg) {print(msg);}
}
main.dart
:使用工厂构造方法
void _oopLearn() {// 因为Logger类只对外暴露了工厂构造方法Logger() ,所以log1和log2应该相等// 即工厂构造方法返回单例Logger log1 = Logger();Logger log2 = Logger();print('----_oopLearn----');print(log1 == log2); // 判断log1和log2是否相等 true}
输出:可以看到log1和log2实例相等。
4-10 带你揭开Flutter中的面向对象(命名工厂构造方法)
做网络请求的时候,将网络请求的数据转换成模型的时候常用。
命名工厂构造方法:factory
[类名
+ .
+ 方法名
],形如factory Student.stu(Student stu){}
// 命名构造方法: [类名 + . + 方法名]// 使用命名构造方法为类实现多个构造方法// 命名构造方法可以有方法体// 因为city是final String,所以必须加入参数Student.cover(Student stu, this.city) : super(stu.name, stu.age) {print('命名构造方法');}// 命名工厂构造方法:factory [类名 + . + 方法名]// 它可以有返回值,而且不需要将类的final变量作为参数,是提供一种灵活获取类对象的方式// 不用加入this.city,相比命名构造方法cover更加灵活factory Student.stu(Student stu) {return Student(stu._school, stu.name, stu.age);}
问题:5种构造方法的实际使用?????
几种构造方法大综合:
// 标准构造方法Student(String name, int age) : super(name, age);// 父类初始化完成后,初始化自有参数Student(this._school, String name, int age) : super(name, age);// 可选参数cityStudent(this._school, name, age, {this.city}) : super(name, age);// 默认参数countryStudent(this._school, name, age, {this.city, this.country = 'China'}): super(name, age);// 初始化列表表达式Student(this._school, name, age, {this.city, this.country = 'China'}): name = '$country.$city',super(name, age);// 构造方法体Student(this._school, name, age, {this.city, this.country = 'China'}): name = '$country.$city',super(name, age) {print('构造方法体不是必须的');}// 命名构造方法: [类名 + . + 方法名]Student.cover(Student stu, this.city) : super(stu.name, stu.age) {print('命名构造方法');}// 命名工厂构造方法:factory [类名 + . + 方法名]factory Student.stu(Student stu) {return Student(stu._school, stu.name, stu.age);}
感觉初始化列表表达式
使用冒号:
后面的表达式,也就是用父类Person
的name
值初始化子类Student
的name
值
4-11 带你揭开Flutter中的面向对象(get和set,静态方法)
Flutter
面向对象中的方法:
set
和get
方法类似Java
:
// 可以为私有字段设置getter来让外界获取到私有字段String get school => _school;// 可以为私有字段设置setter来控制外界对私有字段的修改set school(String value) {_school = value;}
静态方法使用:打印时增加字符串doPrint
// 静态方法static doPrint(String str) {print('doPrint: $str ');}
main.dart
中调用:
// 调用工厂构造方法void _oopLearn() {print('----静态方法调用----');Student.doPrint('_oopLearn'); // print('----_oopLearn----');}
调用初始化列表表达式:
// 调用工厂构造方法void _oopLearn() {// 因为Logger类只对外暴露了工厂构造方法Logger() ,所以log1和log2应该相等// 即工厂构造方法返回单例Logger log1 = Logger();Logger log2 = Logger();print('----_oopLearn----');print(log1 == log2); // 判断log1和log2是否相等 trueprint('----静态方法调用----');Student.doPrint('_oopLearn'); // print('----_oopLearn----');// 创建Student的对象Student stu1 = Student('清华', '成续源', 18);stu1.setSchool = '985'; // 调用私有变量的settter方法print(stu1.getSchool); // 985/// 此处子类Student调用了父类的toString方法,返回的name和age是父类Person的参数print(stu1.toString()); // name:China.null, age:12/*****父类的构造方法初始化了子类Student(this._school, String name, int age,{this.city, this.country = 'China'}): name = '$country.$city',age = 12,super(name, age);**/}
子类Student
的toString()
方法:
/// Student子类toString()方法@overrideString toString() {return '子类toString: \n' +'name: $name school: ${this._school} city:$city country:$country \n' +'父类toString:\n' +'${super.toString()}';}
父类Person
的toString()
方法:
/// 重载父类的toString()方法,面向对象多态的体现@overrideString toString() {return 'name:$name, age:$age';}
发现的问题?父类的name初始化了子类
初始化可选参数
和默认参数
:
// flutter: 子类toString:// name: 中国.南京 school: 北大 city:南京 country:中国// 父类toString:// name:中国.南京, age:12Student stu2 = Student('北大', '成竹', 19, city: '南京', country: '中国');print(stu2.toString());
4-12 带你揭开Flutter中的面向对象(抽象类和方法)
抽象类和抽象方法:比如StatefulWidget
就是1个抽象类
抽象类不能有自己的实例,也就是不能创建自己的对象
抽象类:
- 使用
abstract
修饰符定义的类,抽象类不能被实例化 - 抽象类常用于定义接口
- 抽象类可以有抽象方法(不包括方法体的方法)
- 抽象类可以有抽象方法,也可以没有抽象方法
- 如果1个类有抽象方法,这个类必须被标识成抽象类(
abstract
修饰)
abstract class Study {// 抽象方法(没有方法体的方法)void study(); // 正常的方法@overrideString toString() {return super.toString();}
}
继承抽象类:
- 继承抽象类要实现它的抽象方法,否则也需要将自己定义成抽象类(不实现抽象方法,需要增加
abstract
修饰符),否则报错
// 没有实现Study中的抽象方法study(),必须用abstract修饰StudyFlutter类,否则报错
abstract class StudyFlutter extends Study {}
- 实现抽象类中的抽象方法,则不用添加
abstract
修饰符
class StudyFlutter extends Study {// 实现抽象类Study中的抽象方法@overridevoid study() {print('Learning Flutter!');}
}
使用抽象类:
main.dart
中_oopLearn
方法
void _oopLearn() {.../// 抽象类用法StudyFlutter studyFlutter = StudyFlutter();studyFlutter.study(); // Learning Flutter!
}
输出: Learning Flutter!
4-13 带你揭开Flutter中的面向对象(mixins)
mixins:在多个类层次结构中重用代码的1种方式
- 要使用mixins,需要在with关键字后面跟上1个或多个mixin的名字(用逗号分隔),并且with要用在extends关键字之后
- 实现mixin,就必须创建1个继承Object类的子类(不能继承其他类),不声明任何构造方法,不调用super
/// 为类添加特征:mixins
/// mixins是在多个类层次结构中重用代码的一种方式
/// 要使用mixins,需要在with关键字后面跟上1个或多个mixin的名字(用逗号分隔),并且with要用在extends关键字之后
/// mixins的特征:实现mixin,就必须创建1个继承Object类的子类(不能继承其他类),不声明任何构造方法,不调用super
/// 如上Study类是mixin
///
/// Test使用了mixins Study
/// 通常在开发中使用mixins复用已经存在的一些类的相关特性
class Test extends Person with Study {Test(String name, int age) : super(name, age);@overridevoid study() {// TODO: implement study}
}
with Study
:即Study
类是mixin
,Test
类使用了mixins Study
4-14 带你解锁Flutter中常用的Dart方法类型
Dart中的方法构成和方法类型:
公有方法
Dart
中的方法构成:
- 返回值 + 方法名 + 参数
- 其中:返回值类型可缺省,也可为void或具体的类型
- 方法名:匿名方法不需要方法名
- 参数:参数类型和参数名,参数类型可缺省(另外,参数又分可选参数和参数默认值,可参考面向对象一节中构造放方法部分)
function_learn.dart
:创建sum
方法
/// 创建测试类
class TestFunction {/// 创建FunctionLearn对象FunctionLearn functionLearn = FunctionLearn();void start() {print(functionLearn.sum(1, 2)); // functionLearn.sum(1, 2)}
}class FunctionLearn {/// 方法的构成/// 返回值 + 方法名 + 参数/// 其中:返回值类型可缺省,也可为void或具体的类型/// 方法名:匿名方法不需要方法名/// 参数:参数类型和参数名,参数类型可缺省(另外,参数又分可选参数和参数默认值,可参考面向对象一节中构造放方法部分)int sum(int val1, int val2) {return val1 + val2;}
}
私有方法
Dart
中的私有方法:方法前加下划线表示私有方法,只能在该类访问
/// 创建测试类
class TestFunction {/// 创建FunctionLearn对象FunctionLearn functionLearn = FunctionLearn();...void privatePrint() {functionLearn._learn();}
}class FunctionLearn {.../// 私有方法/// 通过——开头命名的方法/// 作用域是当前文件_learn() {print('私有方法');}
}
main.dart
中使用公有方法和私有方法:
void _funtionLearn() {TestFunction testFunction = TestFunction();testFunction.start(); // 调用公有方法testFunction.privatePrint(); // 调用私有方法}
匿名方法
class FunctionLearn {/// 匿名方法:/// 大部分方法都带有名字,例如 main() 或者 print();/// 在Dart中你有可以创建没有名字的方法,称之为 匿名方法,有时候也被称为 lambda 或者 closure 闭包;/// 你可以把匿名方法赋值给一个变量, 然后你可以使用这个方法,比如添加到集合或者从集合中删除;/// 匿名方法和命名方法看起来类似— 在括号之间可以定义一些参数,参数使用逗号 分割,也可以是可选参数;/// 后面大括号中的代码为函数体:/// ([[Type] param1[, …]]) {/// codeBlock;/// };anonymousFunction() {var list = ['私有方法', '匿名方法'];/// 下面的代码定义了1个参数为element(该参数没有指定类型)的匿名函数/// list中的每个元素都会调用这个函数来打印出来,同时来计算了每个元素在list中的索引位置list.forEach((element) {print(list.indexOf(element).toString() + ': ' + element); // 打印是第几个元素});}
}
入口方法
main
方法:
void main() {runApp(MyApp());
}
4-15 带你了解Dart泛型在Flutter中的应用
定义泛型类文件genericLearn.dart
:
import 'package:flutter_dart_learn/opp_learn.dart';class TestGeneric {void start() {Cache<String> cache1 = Cache();/// 泛型作用:类型检查约束类比:List<String>cache1.setItem('cache1', 'cache1');String string1 = cache1.getItem('cache1');print(string1); // flutter: cache1Cache<int> cache2 = Cache();cache2.setItem('cache2', 1008);print(cache2.getItem('cache2')); // flutter: 2Member<Student> member = Member(Student('', '', 16));print(member.fixedName()); // flutter: fixed:China.null}
}/// 泛型
/// 通俗理解:泛型主要是解决类、接口、方法的复用性,以及对不特定数据类型的支持
///
/// 泛型类
/// 作用:提高代码的复用度
class Cache<T> {static final Map<String, Object> _cached = Map();/// 泛型方法void setItem(String key, T value) {_cached[key] = value;}T getItem(String key) {return _cached[key];}
}/// 有时候你在实现类似通用接口的泛型中,期望的类型是某些特定类型时,这时可以使用类型约束
class Member<T extends Person> {T _person;/// 泛型作用:约束参数类型Member(this._person);String fixedName() {return 'fixed:${_person.name}';}
}
main.dart
中使用泛型方法:
/// 泛型void _genericLearn() {TestGeneric testGeneric = TestGeneric();testGeneric.start();}
4-16 有哪些可以在Flutter上的编程技巧
编程技巧:skills_learn.dart
安全的调用
对于不确定是否为空的对象通过?.
的来访问它的属性或方法以防止空异常,如:a?.foo()
List list;/// Dart编程小技巧1:安全的调用/// 对于不确定是否为空的对象可以通过?.的方式来访问它的属性或方法以防止空异常,如:a?.foo()print(list?.length); // null
使用??
设置默认值
list.length
为空的时候,默认值为-1
print(list?.length ?? -1); // -1
类似ES6中的简化判断
使用contains方法:
list = [];list.add(0);list.add('');list.add(null);if (list[0] == null || list[0] == '' || list[0] == 0) {print('list[0] is empty!'); // list[0] is empty!}
等价于
/// 简化代码判断,类似ES6方法if ([null, '', 0].contains(list[0])) {print('list[0] is empty!'); // list[0] is empty!}
4-17 小结
学习资料:
Dart中文网
Dart官网
慕课网《Flutter从入门到进阶》学习笔记二相关推荐
- 【恢复】慕课网《网页布局基础》学习笔记
好久之前,最初入坑前端时的学习笔记.那时候「慕课网」的几个路径还是免费的,也有好几个跟网页布局有关的课程,其中有一个叫<网页布局基础>讲得很棒,那时候刚好喜欢上 markdown 写作,于 ...
- Python数据分析入门--NumPy进阶学习笔记
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 NumPy 进阶操作 1.NumPy dtype 层次结构 2.NumPy 高阶数组操作 2.1数组的重塑 2.2数组 ...
- UVM入门与进阶学习笔记16——sequencer和sequence(2)
目录 sequence的层次化 Hierarchical Sequence Virtual Sequence Layering Sequence sequence的层次化 就水平复用而言,在MCDF各 ...
- UVM入门与进阶学习笔记17——寄存器模型(2)
目录 寄存器模型集成 总线UVC的实现 总线UVC解析 MCDF寄存器设计代码 Adapter的实现 Adapter的集成 访问方式 前门访问 后门访问 前门与后门的比较 前门与后门的混合应用 寄存器 ...
- UVM入门与进阶学习笔记4——UVM仿真的开始与结束
目录 UVM的编译和运行顺序 UVM仿真开始 UVM世界的"诞生" UVM仿真结束 UVM的编译和运行顺序 下图是UVM的编译运行顺序,非常重要的知识点! 在加载硬件模型调用仿真器 ...
- mysql 事b务 查询_MySQL进阶学习笔记二(包括连接查询、子查询、联合查询、事务、存储过程)...
1.高级查询 (1)了解笛卡尔积:笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尔积(Cartesian product),又称直积,表示为X × Y,第一个对象是X的成员而第二个对象是Y的所有可能有序 ...
- 机器学习入门到进阶学习路线
机器学习入门到进阶学习路线 参考:https://mp.weixin.qq.com/s/f-v-NUW7pTbVF9Sa3A4qUA 1. 定义 机器学习研究的是计算机怎样模拟人类的学习行为,以获取新 ...
- Flutter从入门到进阶
Flutter从入门到进阶 <Flutter简介> Dart入门 <Dart入门-基础类型与正则> <Dart入门-集合类型> <Dart入门-函数与运算符& ...
- 一个python下从入门到进阶学习人工智能的网站
转一个利用python从入门到进阶学习人工智能的网站:https://www.captainai.net/st/ 门槛低,比较通俗易懂. 先粘一下前言部分: 大家好!欢迎来到我的网站! 人工智能被认为 ...
- python web开发入门_python大佬整理的python web开发从入门到精通学习笔记
原标题:python大佬整理的python web开发从入门到精通学习笔记 Python(发音:英[?pa?θ?n],美[?pa?θɑ:n]),是一种面向对象.直译式电脑编程语言,也是一种功能强大的通 ...
最新文章
- 服务器负载均衡(1)
- BCH升级新版本,实不相瞒该抄底了
- java自定义表单_JSP实现用于自动生成表单标签html代码的自定义表单标签
- 第二冲刺阶段工作总结10
- 接口测试-接口定义功能-前端-实现动态增删表单
- qt制作位图led点阵_LED显示屏知识详细讲解
- 习题3-6 纵横字谜的答案(Crossword Answers, ACM/ICPC World Finals 1994, UVa232)
- awstats 日志分析
- 开通写scdn博客第一天
- 淘宝新规:售假者严重违规须缴纳100%保证金
- 更多:Racket系统编程
- Part Ⅴ Entertainment 娱乐活动??
- 计算机应用技术毕业后的简历,计算机应用技术毕业生个人简历模板
- 【B类】BI商业智能、大数据、Mysql、等系列课程集
- 3D折纸效果怎么实现?
- python Dataframe 根据某一列的值来删除多行
- 【竹梦令】生死梦. 连枝冢
- 小区停车系统的终端模块
- 企业举办新闻发布会有哪些好处呢
- PDF图片大小怎样调整?