Python 进步一点点(一)
Python 进步一点点(一)
¶1. 简介
其实放到现在来讲,Python的知名度已经很高了,随着AI等技术的兴起,可以说已经是火出圈了;在很多领域它都有着不错的表现,诸多的优点集一身使其地位一再上升,而且还会继续上升
但是从其起源来说,它的诞生仿佛一场“美丽的意外”:
1989年,大佬程序员Guido van Rossum在圣诞节当天由于无聊,而寻找了一种写程序的方式进行娱乐(大佬就是不一般),Python就在这样的自娱自乐中诞生了,颇有一种欧亨利式的感觉,也许正是这种无与伦比的热爱以及对于当下编程语言痛点的深刻感悟才使得Python日后为人们所追捧
“人生苦短,我用Python”可能是最为人熟知的Python宣传语了,体现了其设计思想着眼于简单、优雅的理念
¶2. 用途
Python现阶段正在各个新兴的领域,如:大数据、AI、数据挖掘等领域大放异彩,同时也催生了大量知名的框架产品,如:Django、TensorFlow、PyTorch、Scrapy等,并且还在不断地扩充着开发者社区
其中最吸引我的就是Python简单的语法,便捷的结构,能够让我把日常开发中很多一闪而过的小 ...
Rust 探索(六)—— 所有权(三)
Rust 探索(六)—— 所有权(三)
¶1. 切片
除引用外,还有另外一种不持有所有权的数据类型——切片
切片允许我们引用集合中某一段连续的元素序列
¶2. 字符串切片
字符串切片是指向String对象中某个连续部分的引用
1234let s = String::from("hello world");let hello = &s[0..5];let world = &s[6..11];
切片的写法类似于引用,不过不是整体,而是一段连续区域,对应元素索引的左闭右开区间
12345 let s = String::from("hello world");let hello = &s[..5]; // [0, 5)let world = &s[6..]; // [6, 11)let hello_world = &s[..]; // [0, 11)
字符串切片类型表示为&str
123456789101112131415fn main() { let s = String:: ...
Rust 探索(五)—— 所有权(二)
Rust 探索(五)—— 所有权(二)
¶1. 所有权与函数
将值传递给函数其实在语义上类似于对变量进行赋值;因而,将变量传递给函数将会触发移动或者复制
123456789101112131415161718fn main() { let str1 = String::from("hello"); // 变量str1进入作用域 take_ownership(str1); // 类似于赋值,因而移动str1并使其失效 let x = 5; // 变量x进入作用域 make_copy(x); // x进入函数,但由于是拷贝,可以继续使用} // 离开作用域,先x,后str1fn take_ownership(some_string: String) { // some_string进入作用域 println!("{}", some_string);} // some_string离开作用域fn make_ ...
Rust 探索(四)—— 所有权(一)
Rust 探索(四)—— 所有权(一)
在Rust当中,有一个非常独特的存在——所有权机制
Rust没有如同Java、Python等语言的垃圾回收机制,也不同于C/C++的纯手动内存操作,而是引入了所有权的概念以及相应的工具支持,来保证内存的安全可靠
¶1. 初识所有权
内存是计算机内一种有限的资源,因此如果想要编写的程序能够持续高效地在计算机上运行,那么对于内存的管理是不可或缺的
编程语言发展至今,主要有三种有代表性的内存管理方式:其一,是C/C++采用的成对的malloc和free或者new和delete,通过这些接口直接操作系统内存的申请和释放,这样做的时候,你有最高的权限,但是每一步也会变得尤为关键,全都要开发者自己管理,那么效率必然是低的;其二,便是以Java、Python为代表的垃圾回收机制对于内存的管理,除了程序的业务线程外,还会有一个垃圾回收线程的存在,根据既定的垃圾回收策略自动地回收内存,在牺牲少量效率的情况下,更好地保证了开发者的开发效率;其三,便是接下来要谈到的Rust独创的所有权机制了,它通过制定所有权的规则来进行约束和检查
栈与堆:在栈中存储的数据都必须拥有 ...
JVM学习——Java内存区域与内存溢出异常
JVM学习——Java内存区域与内存溢出异常
¶1. 简介
在C/C++当中,内存的管理需要由程序员手动操作,使用malloc或new创建对象,然后再相对应地调用free或delete对先前分配出去的空间予以释放
尽管最终C/C++的执行效率比较高,但是开发起来会很头疼,因为内存的问题是绕不开的,正所谓权力越大,责任越大,内存的操作可得谨慎地多想想
而在Java当中,内存的管理交由虚拟机,也就是JVM负责,而程序员可以好好关注业务逻辑,GC会对空间进行释放,虽然会牺牲一部分性能,但是开发效率提升了很多,而性能方面也可以借助硬件往上怼
¶2. 运行时数据区域
¶2.1. 程序计数器
程序计数器简称PC(Program Counter),是一块较小的内存空间,将其看做是当前程序所执行的字节码的行号指示器
¶2.1.1. 作用
Java源文件在编译成字节码文件后,丢给JVM执行,字节码解释器通过改变PC的值,往下读指令,将指令一条条地取出来执行
¶2.1.2. 多线程场景
Java在多线程的情况下,线程会轮流进行切换,根据各自被分配到的CPU时间而定
在任何一个确定的时刻,一个处理器(对 ...
Rust 探索(三)—— 通用编程概念(下)
Rust 探索(三)—— 通用编程概念(下)
上篇主要是关于类型、变量等内容的介绍,如果已经学习过其他编程语言,那么这一块并不会有太大难度,或许仅仅是一些关键字的替换
而且,在了解其中的一些概念的时候,似乎还隐隐约约能够看到一些接触过的其他编程语言的影子,就比如说元组、列表的概念与Python如出一辙,解构赋值的写法让我想到了TypeScript,区分可变、不可变变量以及类型推导的特性又让我联想到Kotlin,或许Rust也有不断地借鉴其他语言设计的优秀之处吧,亦或是这正是代表了语言演进的方向
¶1. 函数
函数用来对功能逻辑进行封装,能够增强复用、提高代码的可读
在Rust中,函数通过fn关键字进行声明,并且函数的名称遵循蛇形命名法,即名称使用小写字母进行组合,单词与单词之间使用下划线进行分割,这点倒是和Python中的函数命名相一致
123456789fn make_money() { // 蛇形命名法 println!("赚钱");}fn main() { // 作为入口的main()函数 // 函数调用 ...
视图绑定
ViewBinding
¶1. 准备工作
首先需要在模块中启用“视图绑定”,在模块对应的build.gradle中添加配置
12345678android { compileSdk 32 viewBinding { enabled = true } ... }
然后项目就下载了对应依赖
启用完成后,系统会为该模块下的所有布局XML文件生成一个与之对应的绑定类
¶2. 绑定类
布局XML中会有一些组件设置id属性,这些属性在对应的绑定类中可以直接通过id来获取,这些控件相当于类的成员,根组件和其他有id的组件的引用都包含其实例之中
¶2.1. 命名方式
绑定类会以“Binding”结尾,采用大驼峰
¶2.2. 根视图
可以通过getRoot()获取对于布局文件中根视图的引用
¶3. 使用
¶3.1. Activity中
12345678910private lateinit var binding: ActivityMainBindingoverride fun onCreate(savedInsta ...
Flutter学习笔记(一)
Flutter学习笔记(一)
Flutter的官方文档提供了一个理念——“一切皆为Widget”
由此可以看得出来Widget在Flutter中的重要地位
¶1. Widget是什么?
Widget我们将其理解为组件,一个应用的界面往往都比较丰富,上面会有各式各样的组件,像图片、按钮、播放器这些都可以称为组件。
由于之前自己接触过React的开发,因此我认为,这里的组件就相当于程序中的一个对象,它具有专门的功能,与用户进行交互,处理相应的数据,就像你打开Material Design组件库一样,里面各个组件都扮演着特定的角色,为了某一种特定的功能而存在。
打个更加贴近生活的比方,我们刚搬进新家,而空荡荡的屋子就是我们原始的空白界面,然而我们的日常生活总是需要各种工具或者是家具来满足我们的需要,那么这种需要就相当于是组件所需要具备的功能,每个工具或者家具只是专门负责某一方面的功能,此时,在我看来,就可以将家具或工具理解为程序意义上的组件,同时,这些组件的摆放和搭配也形成了界面上丰富多彩的布局。
¶2. Widget有哪些?
无状态组件(Stateless Widget)
有状态组件(S ...
AIDL学习之路(一)
AIDL学习之路(一)
¶1. 简介
AIDL全称为(Android Interface Definition Language),由此可以看出这应当是一种定义接口的语言
¶2. 具体场景
客户端与服务端进行通信时,需要定义双方都认可的接口,AIDL这是用来完成这件工作的工具
AIDL主要应用于IPC,即进程间通信
¶2.1. 你是否真的需要AIDL
首先,如果并不需要实现IPC,可以直接通过继承Binder类实现client-sever间的通信
其次,如果的确需要实现IPC,但是无需处理多线程,那么应该通过Messager实现,因为Messager能够保证信息是串行的(其实内部也是通过AIDL实现的)
综上,真正需要使用到AIDL的场景是IPC和并发处理多个请求并存
¶3. 使用步骤
创建.aidl后缀名的文件,定义需要用到的接口
实现定义的接口
将接口暴露给客户端使用
¶3.1. 创建.aidl文件,定义接口
使用AS新建一个空项目,在当前模块的src目录下直接创建一个AIDL文件
然后重命名为IRemoteService,因为这是一个接口
然后点击Finish完成创建
...
怎么学Unity开发(二)
怎么学Unity开发(二)
¶1. 资源
Assets目录的文件对应关系,与文件浏览器打开的内容是一一对应的,这里存放着整个游戏会用到的所有资源
¶1.1. 导入导出资源
在Assets中选中所有需要导出的资源,右键Export Package
再次确认一下内容
选择名称以及导出的路径,会生成如下文件
先把资源文件夹中原来的文件删了,否则系统检测到已有是不会再导的
然后双击刚刚导出的文件
然后选择文件,导入资源
通过导入的方式,这些资源又回来了
¶2. 材质概览
选中场景中的某个游戏对象,可以在Inspector面板中看到其对应的材质
默认材质不好修改,因此再创建一个新的材质
Assets目录下创建一个材质文件夹
直接右击,创建一个新材质
创建完成后可以调节颜色,在外侧的色环上调节色相,然后再在内部的方框中调节明暗和饱和度
显示在场景中的物体实际上都是网格体,通过材质为其着色,而负责着色工作的便是着色器
之后可以通过编写脚本编写自己的着色器
¶3. 学习使用资源商店
Asset Store就是Unity经常会用到的资源商店
资源商店(https://ass ...