Skip to content

Commit c9b2e71

Browse files
committed
update
1 parent 4458de9 commit c9b2e71

8 files changed

Lines changed: 597 additions & 11 deletions

File tree

JavaKnowledge/python3入门.md

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,22 @@ make_pizza('pepperoni')
454454
make_pizza('mushrooms','green peppers','extra cheese')
455455
```
456456

457+
458+
简单来说,Python中所有的函数参数传递,统统都是基于传递对象的引用进行的。这是因为,在Python中,一切皆对象。而传对象,实质上传的是对象的内存地址,而地址即引用。
459+
460+
461+
看起来,Python的参数传递方式是整齐划一的,但具体情况还得具体分析。在Python中,对象大致分为两类,即可变对象和不可变对象。可变对象包括字典、列表及集合等。不可变对象包括数值、字符串、不变集合等。如果参数传递的是可变对象,传递的就是地址,形参的地址就是实参的地址,如同“两套班子,一套人马”一样,修改了函数中的形参,就等同于修改了实参。如果参数传递的是不可变对象,为了维护它的“不可变”属性,函数内部不得不“重构”一个实参的副本。此时,实参的副本(即形参)和主调用函数提供的实参在内存中分处于不同的位置,因此对函数形参的修改,并不会对实参造成任何影响,在结果上看起来和传值一样。
462+
463+
464+
看起来,Python的参数传递方式是整齐划一的,但具体情况还得具体分析。在Python中,对象大致分为两类,即可变对象和不可变对象。可变对象包括字典、列表及集合等。不可变对象包括数值、字符串、不变集合等。如果参数传递的是可变对象,传递的就是地址,形参的地址就是实参的地址,如同“两套班子,一套人马”一样,修改了函数中的形参,就等同于修改了实参。如果参数传递的是不可变对象,为了维护它的“不可变”属性,函数内部不得不“重构”一个实参的副本。此时,实参的副本(即形参)和主调用函数提供的实参在内存中分处于不同的位置,因此对函数形参的修改,并不会对实参造成任何影响,在结果上看起来和传值一样。
465+
466+
467+
看起来,Python的参数传递方式是整齐划一的,但具体情况还得具体分析。在Python中,对象大致分为两类,即可变对象和不可变对象。可变对象包括字典、列表及集合等。不可变对象包括数值、字符串、不变集合等。如果参数传递的是可变对象,传递的就是地址,形参的地址就是实参的地址,如同“两套班子,一套人马”一样,修改了函数中的形参,就等同于修改了实参。如果参数传递的是不可变对象,为了维护它的“不可变”属性,函数内部不得不“重构”一个实参的副本。此时,实参的副本(即形参)和主调用函数提供的实参在内存中分处于不同的位置,因此对函数形参的修改,并不会对实参造成任何影响,在结果上看起来和传值一样。
468+
469+
470+
看起来,Python的参数传递方式是整齐划一的,但具体情况还得具体分析。在Python中,对象大致分为两类,即可变对象和不可变对象。可变对象包括字典、列表及集合等。不可变对象包括数值、字符串、不变集合等。如果参数传递的是可变对象,传递的就是地址,形参的地址就是实参的地址,如同“两套班子,一套人马”一样,修改了函数中的形参,就等同于修改了实参。如果参数传递的是不可变对象,为了维护它的“不可变”属性,函数内部不得不“重构”一个实参的副本。此时,实参的副本(即形参)和主调用函数提供的实参在内存中分处于不同的位置,因此对函数形参的修改,并不会对实参造成任何影响,在结果上看起来和传值一样。
471+
472+
457473
### 将函数存储在模块中
458474

459475
函数的优点之一是,使用它们可将代码块与主程序分离。通过给函数指定描述性名称,可让主程序容易理解得多。你还可以更进一步,将函数存储在被称为模块的独立文件中,再将模块导入到主程序中。import语句允许在当前运行的程序文件中使用模块中的代码。
@@ -673,6 +689,14 @@ title.split()
673689

674690
Python有一个pass语句,可在代码块中使用它来让Python什么都不要做。
675691

692+
```python
693+
def donothing():
694+
pass #空语句
695+
696+
```
697+
698+
699+
pass语句如果啥事都不做,那要它有何用呢?实际上,pass可以作为一个占位符来用——视为未成熟代码的“预留地”。比如说,如果我们还没想好函数的内部实现,就可以先放一个pass,让代码先跑起来。
676700

677701
### json
678702

@@ -733,12 +757,44 @@ dict_keys(['total_count', 'incomplete_results', 'items'])
733757

734758

735759
在Python中,还可以定义可变参数。可变参数也称不定长参数,即传入函数中的实际参数可以是零个、一个、两个到任意个。
760+
761+
Python中的可变参数的表现形式为,在形参前添加一个星号(*),意为函数传递过来的实参个数不定,可能为0个、1个,也可能为n个(n≥2)。需要注意的是,不管可变参数有多少个,在函数内部,它们都被“收集”起来并统一存放在以形参名为某个特定标识符的元组之中。因此,可变参数也被称为“收集参数”。
762+
763+
764+
除了用单个星号(*)表示可变参数,其实还有另一种标定可变参数的形式,即用两个星号(**)来标定。通过前文的介绍,我们知道,一个星号(*)将多个参数打包为一个元组,而两个星号(**)的作用是什么呢?它的作用就是把可变参数打包成字典模样。
765+
766+
这时调用函数则需要采用如“arg1=value1,arg2=value2”这样的形式。等号左边的参数好比字典中的键(key)[插图],等号右边的数值好比字典中的值(value)​,
767+
768+
```python
769+
def varFun(**x):
770+
if len(x) == 0:
771+
print("None")
772+
else:
773+
print(x)
774+
775+
776+
varFun(a = 1, b = 3)
777+
778+
779+
```
780+
736781
定义可变参数时,主要有两种形式,一种是*parameter,另一种是**parameter。下面分别进行介绍。
737782
1.*parameter
738783
这种形式表示接收任意多个实际参数并将其放到一个元组中。
739784
2.**parameter
740785
这种形式表示接收任意多个类似关键字参数一样显式赋值的实际参数,并将其放到一个字典中。
741786

742787

788+
除了用等号给可变关键字参数赋值,事实上,我们还可以直接用字典给可变关键字参数赋值:
789+
790+
```python
791+
def some_kwargs(name, age, sex):
792+
print(f"name: ${name}")
793+
794+
kdic = {'name' : 'Alice', 'age' : 11, 'sex' : 'nv'}
795+
some_kwargs(**kdic)
796+
797+
```
798+
743799

744800
在Python中,可以通过@property(装饰器)将一个方法转换为属性,从而实现用于计算的属性。将方法转换为属性后,可以直接通过方法名来访问方法,而不需要再添加一对小括号“()”,这样可以让代码更加简洁。

JavaKnowledge/shell.md

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
shell
2+
---
3+
4+
5+
6+
7+
### ls:
8+
9+
ls x* y*: 过滤文件中x和y开头的文件
10+
ls -F: 区分文件还是目录
11+
ls -l: 显示详细信息
12+
13+
### touch: 创建或修改文件时间
14+
15+
16+
### cp: 复制文件
17+
18+
cp sourceFile destinationFile,但是如果源文件存在会直接被覆盖,也不会提醒,
19+
如果想要提醒需要加上-i, 例如cp -i 1.txt 2.txt
20+
21+
22+
### mv移动重新命名
23+
24+
用法和cp一致
25+
26+
27+
### rm删除
28+
29+
rm -i xxx: -i会询问是否真的要删除
30+
rm -f xxx: 强制删除,不会询问
31+
32+
注意 对于rm命令,-r选项和-R选项的效果是一样的,都可以递归地删除目录中的文件。shell命令很少会对相同的功能使用大小写不同的选项。
33+
一口气删除目录树的最终解决方案是使用rm -rf命令。该命令不声不响,能够直接删除指定目录及其所有内容。当然,这肯定是一个非常危险的命令,所以务必谨慎使用,并再三检查你要进行的操作是否符合预期。
34+
35+
36+
### mkdir 创建目录
37+
38+
mkdir命令的-p选项可以根据需要创建缺失的父目录。父目录是包含目录树中下一级目录的目录。
39+
40+
### rmdir 删除空目录
41+
42+
### file
43+
44+
file命令是一个方便的小工具,能够探测文件的内部并判断文件类型:
45+
$ file .bashrc
46+
.bashrc: ASCII text
47+
48+
49+
### cat 显示文本文件
50+
51+
cat fileName
52+
53+
-n 加上行号
54+
55+
### more
56+
cat的缺点是其开始运行后无法控制后续的操作,为了解决这个问题,有了more命令。
57+
58+
more命令会显示文件内容,但会在显示每页数据之后暂停下来。
59+
60+
### ps 显示当前用户进程
61+
62+
ps -ef显示系统中运行的所有进程
63+
64+
### top 实时监测进程
65+
66+
ps命令虽然在收集系统中运行进程的信息时非常有用,但也存在不足之处:只能显示某个特定时间点的信息。如果想观察那些被频繁换入和换出内存的进程,ps命令就不太方便了。这正是top命令的用武之地。与ps命令相似,top命令也可以显示进程信息,但采用的是实时方式。
67+
68+
69+
70+
### kill pid, 通过pid发送信号
71+
72+
### pkill pname: pkill命令可以使用程序名代替PID来终止进程。除此之外,pkill命令也允许使用通配符。
73+
74+
75+
### grep数据搜索
76+
77+
经常需要在大文件中搜索
78+
79+
### gzip压缩
80+
81+
gzip: 压缩
82+
gzcat: 查看压缩过的文本文件内容
83+
gunzip:解压
84+
85+
### tar归档
86+
87+
ar命令最开始是用于将文件写入磁带设备以作归档,但它也可以将输出写入文件,这种用法成了在Linux中归档数据的普遍做法。tar命令的格式如下
88+
89+
// 该命令创建了一个名为test.tar的归档文件,包含目录test和test2的内容。
90+
tar -cvf test.tar test/ test2/
91+

VideoDevelopment/Android音视频开发/MediaExtractor、MediaCodec、MediaMuxer.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ MediaMuxter通常与MediaExtractor一起使用,MediaExtractor用于从媒体
2626
MediaCodec是Android提供的用于对音视频进行编码的类,是Android Media基础框架的一部分,一般和MediaExtractor、MediaMuxer、Surface和AudioTrack一起使用。
2727

2828

29+
MediaCodec可以处理原始的音视频数据,包括编码(将原始数据转换为压缩格式)和解码(将压缩格式转换为原始数据)。
30+
2931

3032

3133
MediaExtractor仅仅是解封装数据,不会对数据进行解码。要对媒体数据进行解码,需要使用MediaCodec类。

VideoDevelopment/Android音视频开发/SurfaceView与TextureView.md

Lines changed: 41 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,21 @@ SurfaceView与TextureView
22
===
33

44

5-
## SurfaceView
5+
Android系统中图形系统是相当复杂的,包括WindowManager、SurfaceFlinger、OpenGL等。
6+
7+
其中SurfaceFlinger(表面合成器或表面渲染器)作为负责绘制应用UI的核心。
8+
9+
但是不论使用什么渲染API,所有的东西最终都渲染到Surface上,Android平台所创建的Window都由Surface所支持,所有可见的Surface渲染到显示设备都是通过SurfaceFlinger来完成。
10+
11+
12+
613

7-
在说SurfaceView之前,需要先说一下几个相关的部分。
814

915
### `Surface`简介
1016

11-
- `Surface`就是“表面”的意思,可以简单理解为内存中的一段绘图缓冲区。在`SDK`的文档中,对`Surface`的描述是这样的:“`Handle onto a raw buffer that is being managed by the screen compositor`”,
17+
- `Surface`就是“表面”的意思,可以简单理解为内存中的一段绘图缓冲区。
18+
19+
`SDK`的文档中,对`Surface`的描述是这样的:“`Handle onto a raw buffer that is being managed by the screen compositor`”,
1220
翻译成中文就是“由屏幕显示内容合成器`(screen compositor)`所管理的原生缓冲器的句柄”, 这句话包括下面两个意思:
1321

1422
- 通过`Surface`(因为`Surface`是句柄)就可以获得原生缓冲器以及其中的内容。就像在`C`语言中,可以通过一个文件的句柄,就可以获得文件的内容一样;
@@ -19,6 +27,9 @@ SurfaceView与TextureView
1927
- `Surface`是一个用来画图形的地方,但是我们知道画图都是在一个`Canvas`对象上面进行的,*`Surface`中的`Canvas`成员,是专门用于提供画图的地方,就像黑板一样,其中的原始缓冲区是用来保存数据的地方,
2028
`Surface`本身的作用类似一个句柄,得到了这个句柄就可以得到其中的`Canvas`、原始缓冲区以及其他方面的内容,所以简单的说`Surface`是用来管理数据的(句柄)*
2129

30+
31+
Surface是一个绘制目标,可以被系统的SurfaceFlinger直接合成显示在屏幕上。
32+
2233
### `SurfaceView`简介
2334

2435
- 简单的说`SurfaceView`就是一个有`Surface``View`里面内嵌了一个专门用于绘制的`Surface`,`SurfaceView`控制这个`Surface`的格式和尺寸以及绘制位置。
@@ -84,16 +95,40 @@ TextureView是一个可以把内容流作为外部纹理输出在上面的View,
8495

8596
### SurfaceTexture
8697

87-
SurfaceTexture是Surface和OpenGL ES(GLES)纹理的组合。SurfaceTexture用于提供输出到GLES 纹理的Surface。SurfaceTexture是从Android 3.0开始加入,与SurfaceView不同的是,它对图像流的处理并不直接显示,而是转为GL外部纹理,因此用于图像流数据的二次处理。比如Camera的预览数据,变成纹理后可以交给GLSurfaceView直接显示,也可以通过SurfaceTexture交给TextureView作为View heirachy中的一个硬件加速层来显示。首先,SurfaceTexture从图像流(来自Camera预览、视频解码、GL绘制场景等)中获得帧数据,当调用updateTexImage()时,根据内容流中最近的图像更新SurfaceTexture对应的GL纹理对象。
98+
SurfaceTexture 是一种 纹理对象,可以作为 OpenGL ES 纹理(OES 纹理)进行处理。它不会直接显示在屏幕上,而是可以将内容传递给 OpenGL 进行进一步处理或绘制。
99+
100+
SurfaceTexture用于提供输出到GLES 纹理的Surface。SurfaceTexture是从Android 3.0开始加入,与SurfaceView不同的是,它对图像流的处理并不直接显示,而是转为GL外部纹理,因此用于图像流数据的二次处理。比如Camera的预览数据,变成纹理后可以交给GLSurfaceView直接显示,也可以通过SurfaceTexture交给TextureView作为View heirachy中的一个硬件加速层来显示。
101+
102+
在Android系统重,SurfaceTexture是一个特殊的类,它将来自硬件纹理缓冲区(如相机预览流或视频解码输出)的图像数据转换为OpenGL ES可以直接使用的纹理。
103+
104+
updateTexImage()方法是SurfaceTexture类的核心方法之一,此方法的主要作用是从SurfaceTexture内部特有的图像缓冲区中取出最新一帧,
105+
并将其内容复制到与SurfaceTexture关联的OpenGL纹理上。
106+
107+
这对于实时图形渲染、视频播放以及从相机捕获并实时处理图像等场景至关重要。
88108

89109

90110

91111
SurfaceTexture 包含一个应用是其使用方的BufferQueue。当生产方将新的缓冲区排入队列时,onFrameAvailable() 回调会通知应用。然后,应用调用updateTexImage(),这会释放先前占有的缓冲区,从队列中获取新缓冲区并执行EGL调用,从而使GLES可将此缓冲区作为外部纹理使用。
92112

113+
114+
##### Surface与SurfaceTexture的关系
115+
116+
- SurfaceTexture是一个OpenGL纹理对象,用于GPU处理视频流或相机数据,它不会直接显示在屏幕上,需要OpenGL渲染后才能看到。
117+
- Surface是一个绘制目标,可以直接用于屏幕渲染,它可以基于SurfaceTexture创建,这样Surface就可以间接获取SurfaceTexture的数据。
118+
119+
例如相机使用OpenGL的渲染过程:
120+
121+
- 在相机预览时,Camera可以将相机数据输出到SurfaceTexture上,然后
122+
- SurfaceTexture采集相机数据,并将其存储到OpenGL纹理中(OES纹理)
123+
- SurfaceTexture触发onFrameAvailable()回调,通知OpenGL纹理更新。
124+
- OpenGL使用该纹理进行渲染,最终显示在GLSurfaceView或TextureView上。
125+
126+
93127
## SurfaceView vs TextureView
94128

95129

96130

131+
97132
简单地说,SurfaceView是一个有自己Surface的View。它的渲染可以放在单独线程而不是主线程中。其缺点是不能做变形和动画。SurfaceTexture可以用作非直接输出的内容流,这样就提供二次处理的机会。与SurfaceView直接输出相比,这样会有若干帧的延迟。同时,由于它本身管理BufferQueue,因此内存消耗也会稍微大一些。TextureView是一个可以把内容流作为外部纹理输出在上面的View。它本身需要是一个硬件加速层。事实上TextureView本身也包含了SurfaceTexture。它与SurfaceView+SurfaceTexture组合相比可以完成类似的功能(即把内容流上的图像转成纹理,然后输出)。区别在于TextureView是在View hierachy中做绘制,因此一般它是在主线程上做的(在Android 5.0引入渲染线程后,它是在渲染线程中做的)。而SurfaceView+SurfaceTexture在单独的Surface上做绘制,可以是用户提供的线程,而不是系统的主线程或是渲染线程。
98133

99134

@@ -123,4 +158,5 @@ SurfaceTexture 包含一个应用是其使用方的BufferQueue。当生产方将
123158
---
124159

125160
- 邮箱 :charon.chui@gmail.com
126-
- Good Luck!
161+
- Good Luck!
162+

0 commit comments

Comments
 (0)