在 Python 的局部命名空间中,记录了函数的参数和局部变量。Python 中的内置函数 locals() 返回表示局部命名空间的字典,示例如下:def function(a, b): c = 3 d = 4 dict = locals() print(dict)function(1, 2)在第 1 行,函数 function 定义了参数 a 和 b在第 2 行,函数 function 定义了局部变量 c在第 3 行,函数 function 定义了局部变量 d程序输出如下:{'a':1, 'b':2, 'c':3, 'd':4}输出包括了 a、b、c 和 d,它们是函数的参数和局部变量。
使用 JSON.stringify 有些内置规则。如果对象中存在包装对象,则在转换过程中会变成原始值。var obj = { string: new String('A promise is a promise.'), number: new Number(996),};var result = JSON.stringify(obj);console.log(result); // 输出:"{"string":"A promise is a promise.","number":996}"如果转换的对象或者对象下的属性存在 toJSON 方法,那么这个方法的返回值会作为转换结果。var user = { nickname: 'joker', toJSON: function() { return 'hahahahahahaha'; },}var result = JSON.stringify(user);console.log(result); // 输出:"hahahahahahaha"可以看到结果为 toJSON 方法的返回值。除了数组以外的对象,转换结果顺序为随机。var obj = { b: 2, c: 3, a: 1,};如以上对象,转换的结果有可能是以下情况中的一种:"{"a":1,"b":2,"c":3}""{"a":1,"c":3,"b":2}""{"b":2,"a":1,"c":3}""{"b":2,"c":3,"a":1}""{"c":3,"b":2,"a":1}""{"c":3,"a":1,"b":2}"undefined、ES6 中的 symbol 值、函数在转换过程中都会被忽略,当然函数如果具有 toJSON 方法依然会优先选择 toJSON 方法的结果。var fn = function() {};fn.toJSON = function() {return '我是函数'};var result = JSON.stringify({ a: fn, b: Symbol(1), c: undefined, d: function() {},});console.log(result);存在循环引用,则会报错var obj1 = { prop1: 1,};var obj2 = { prop1: 1,};obj1.prop2 = obj2;obj2.prop2 = obj1;JSON.stringify(obj1); // TypeError: Converting circular structure to JSON两个对象相互引用之后,进行系列化就会抛出错误。在 ES6 中,symbol 可以作为对象的属性值,但在处理的时候都会被忽略。var symbol = Symbol();var obj = { prop1: 'value1', [symbol]: 'value2',};console.log(obj);var result = JSON.stringify(obj);console.log(result); // 输出:{"prop1":"value1"}null、正负 Infinity、NaN 在序列化时都会被当作 null 。var obj = { null: null, infinity1: +Infinity, infinity2: -Infinity, NaN: NaN,};var result = JSON.stringify(obj);console.log(result); // 输出:{"null":null,"infinity1":null,"infinity2":null,"NaN":null}
序号函数说明 1str.split() 拆分字符串 2str.slice() 按给定的位置截取字符串 3str.strip() 删除字符串中的空格或者换行符 4str.lower() 将字符串转换为小写 5str.upper() 将字符串转换为大写 6str.cat() 连接字符串列 7str.replace() 替换字符串中的元素 8str.swapcase() 字符串中的大小写互换下面我们将通过代码操作详细介绍这几个函数的使用方法:1. split() 函数该函数根据指定的元素分割字符串。# 导入pandas包import pandas as pddata_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/第16小节/execl数据demo.xlsx"# 解析数据data = pd.read_excel(data_path)print(data)# --- 输出结果 --- 编程语言 推出时间 价格 主要创始人0 java 1995年 45.6 James Gosling1 python@163.com 1991年 67.0 Guido van Rossum\n2 C 1972年 33.9 Dennis MacAlistair Ritchie3 js@qq.com 1995年 59.5 Brendan Eich4 php 2012年\n 69.9 Rasmus Lerdorf5 C++ 1983年 75.0 Bjarne Stroustrup# split() 函数new_series=data["编程语言"]split_res= new_series.str.split("@")print(split_res)# --- 输出结果 ---0 [java]1 [python, 163.com]2 [C]3 [js, qq.com]4 [php]5 [C++ ]Name: 编程语言, dtype: object结果解析:首先我们获得 DataFrame 的 “编程语言” 列,返回的数据结构为 Series ,我们通过 str 属性的 split () 函数,传入分割依据的字符,通过结果可以看到,存在 @ 字符的字符串均被分割成了多个子元素,返回结果也是由列表构成的 Series 数据集。2. slice() 函数该函数根据给定开始和结束的下标位置,截取字符串,注意是左闭右开,不包含右边的下标位置,该函数有三参数:start :开始下标 stop :结束下标 step :步长# --- 解析 data 数据结果 --- 编程语言 推出时间 价格 主要创始人0 java 1995年 45.6 James Gosling1 python@163.com 1991年 67.0 Guido van Rossum\n2 C 1972年 33.9 Dennis MacAlistair Ritchie3 js@qq.com 1995年 59.5 Brendan Eich4 php 2012年\n 69.9 Rasmus Lerdorf5 C++ 1983年 75.0 Bjarne Stroustru# data 解析出来的数据# slice() 函数new_series=data["编程语言"]slice_res= new_series.str.slice(2,4)print(slice_res)# --- 输出结果 ---0 va1 th2 3 @q4 p5 + Name: 编程语言, dtype: object结果解析:这里我们指定 "编程语言" 列每个字符串从下标 2 截取到下标 4,因为下标是从 0 开始的,因此也就是截取每个字符串中第 3 和第 4 个字符,可以看到每个输出的结果。3. strip() 函数该函数会去掉字符串中头和尾的空格已经换行符。# --- 解析 data 数据结果 --- 编程语言 推出时间 价格 主要创始人0 java 1995年 45.6 James Gosling1 python@163.com 1991年 67.0 Guido van Rossum\n2 C 1972年 33.9 Dennis MacAlistair Ritchie3 js@qq.com 1995年 59.5 Brendan Eich4 php 2012年\n 69.9 Rasmus Lerdorf5 C++ 1983年 75.0 Bjarne Stroustru# data 解析出来的数据# strip() 函数new_series=data["编程语言"]slice_res= new_series.str.strip()print(slice_res)# --- 输出结果 ---0 java1 python@163.com2 C3 js@qq.com4 php5 C++Name: 编程语言, dtype: object结果解析:通过输出结果可以看到,“C++” 中原数据后面有空格在,使用函数操作后,空格被删除。4. lower() 函数该函数用于将字符串中的所有大写字母转换为小写字母。# --- 解析 data 数据结果 --- 编程语言 推出时间 价格 主要创始人0 java 1995年 45.6 James Gosling1 python@163.com 1991年 67.0 Guido van Rossum\n2 C 1972年 33.9 Dennis MacAlistair Ritchie3 js@qq.com 1995年 59.5 Brendan Eich4 php 2012年\n 69.9 Rasmus Lerdorf5 C++ 1983年 75.0 Bjarne Stroustru# data 解析出来的数据# lower() 函数new_series=data["编程语言"]slice_res= new_series.str.lower() print(slice_res)# --- 输出结果 ---0 java1 python@163.com2 c3 js@qq.com4 php5 c++ Name: 编程语言, dtype: object结果解析:通过输出结果可以看到,“编程语言” 列所有的大写字母都转换成了小写。5. upper() 函数该函数用于将字符串中的所有小写字母转换为大写字母。# --- 解析 data 数据结果 --- 编程语言 推出时间 价格 主要创始人0 java 1995年 45.6 James Gosling1 python@163.com 1991年 67.0 Guido van Rossum\n2 C 1972年 33.9 Dennis MacAlistair Ritchie3 js@qq.com 1995年 59.5 Brendan Eich4 php 2012年\n 69.9 Rasmus Lerdorf5 C++ 1983年 75.0 Bjarne Stroustru# data 解析出来的数据# upper() 函数new_series=data["编程语言"]slice_res= new_series.str.upper() print(slice_res)# --- 输出结果 ---0 JAVA1 PYTHON@163.COM2 C3 JS@QQ.COM4 PHP5 C++ Name: 编程语言, dtype: object结果解析:通过输出结果可以看到,"编程语言" 这一列所有的小写字母均转换为了大写字母。6. cat() 函数该函数用于将两列合并成一列数据,前提是两列都是字符,如果是数值的话会报错。# --- 解析 data 数据结果 --- 编程语言 推出时间 价格 主要创始人0 java 1995年 45.6 James Gosling1 python@163.com 1991年 67.0 Guido van Rossum\n2 C 1972年 33.9 Dennis MacAlistair Ritchie3 js@qq.com 1995年 59.5 Brendan Eich4 php 2012年\n 69.9 Rasmus Lerdorf5 C++ 1983年 75.0 Bjarne Stroustrup# data 解析出来的数据# cat() 函数new_series=data["编程语言"]new_series_two=data["主要创始人"]slice_res= new_series.str.cat(new_series_two) print(slice_res)# --- 输出结果 ---0 javaJames Gosling1 python@163.comGuido van Rossum\n2 CDennis MacAlistair Ritchie3 js@qq.comBrendan Eich4 phpRasmus Lerdorf5 C++ Bjarne StroustrupName: 编程语言, dtype: object结果解析:通过 cat () 函数,将 “编程语言” 和 “主要创始人” 两列进行合并,可以看到输出结果中的合并结果。7. replace() 函数该函数可用于替换字符串的内容。# --- 解析 data 数据结果 --- 编程语言 推出时间 价格 主要创始人0 java 1995年 45.6 James Gosling1 python@163.com 1991年 67.0 Guido van Rossum\n2 C 1972年 33.9 Dennis MacAlistair Ritchie3 js@qq.com 1995年 59.5 Brendan Eich4 php 2012年\n 69.9 Rasmus Lerdorf5 C++ 1983年 75.0 Bjarne Stroustrup# data 解析出来的数据# replace() 函数new_series=data["编程语言"]slice_res= new_series.str.replace("com","cn") print(slice_res)# --- 输出结果 ---0 java1 python@163.cn2 C3 js@qq.cn4 php5 C++ Name: 编程语言, dtype: object 结果解析:这里我们将 “编程语言” 列字符串中的 com 替换为 cn,通过输出结果可以看到替换的效果。8. swapcase() 函数该函数用于将字符串中的大小写进行相互转换(大写转换为小写,小写转换为大写)。# --- 解析 data 数据结果 --- 编程语言 推出时间 价格 主要创始人0 java 1995年 45.6 James Gosling1 python@163.com 1991年 67.0 Guido van Rossum\n2 C 1972年 33.9 Dennis MacAlistair Ritchie3 js@qq.com 1995年 59.5 Brendan Eich4 php 2012年\n 69.9 Rasmus Lerdorf5 C++ 1983年 75.0 Bjarne Stroustrup# data 解析出来的数据# swapcase() 函数new_series=data["主要创始人"]slice_res= new_series.str.swapcase() print(slice_res)# --- 输出结果 ---0 jAMES gOSLING1 gUIDO VAN rOSSUM\n2 dENNIS mACaLISTAIR rITCHIE3 bRENDAN eICH4 rASMUS lERDORF5 bJARNE sTROUSTRUPName: 主要创始人, dtype: object 结果解析:这里我们通过 swapcase 函数将 “主要创始人” 列中字符串的大小写进行了互换,通过输出结果可以看到互换的效果。
C - Pointers
C enums
1. 语法jinja2 模板中,使用 {% 和 %} 包围的语法块称为语句,jinja2 支持类似于 Python 的 if-else 判断语句,语法如下:{% if cond %}{% else %}{% endif %}jinja2 支持类似于 Python 的 if-elif 判断语句,语法如下:{% if cond %}{% elif cond %}{% endif %}2. jinja2 模板定义一个演示 if 语句功能的模板:<html>{% if a %} <p>a is True</p>{% else %} <p>a is False</p>{% endif %}{% if b %} <p>b is True</p>{% elif c %} <p>b is False, and c is True</p>{% endif %}</html>在模板中根据变量 a、b、c 的取值生成不同的内容。3. jinja2 的模板输入a = Falseb = Falsec = True4. 渲染后的 html<html> <p>a is False</p> <p>b is False, and c is True</p></html>
我们在代码中通过宏批量加注释。录制宏到 c 寄存器,录制完之后批量调用宏 n@c:使用 @@ 命令执行一遍上一次的操作,为 main.go 文件的第4,21,25行增加注释:
循环语句很好用,但是如果循环进行到一般想要跳出循环或者结束循环怎么办?那么那你需要 break 和 continue 语句。
os.path.exists(path) 检查文件是否存在:参数 path, 文件路径返回值,如果文件存在则返回 True,如果文件不存在则返回 False该函数的使用示例:>>> import os>>> os.path.exists('C:\\Windows')True>>> os.path.exists('C:\\non-exist-file')False
还记得我们在 Sass 数据类型章节讲到的 Maps 类型吗,Map 函数就是提供了很多操作 Maps 类型数据的功能。5.6.1 map-get($map, $key)map-get($map, $key) 函数是从 $map 中取出 key 为 $key 的值,第 1 个参数是 Maps 类型的数据,我们举例看下:$val_map: ("a": 1, "b": 2, "c": 3); // 定义 maps 类型的数据map-get($val_map, "a") //=> 1map-get($val_map, "b") //=> 2这个函数就很像 javascript 中从 object 数据取值,它的功能也很单一,只是取值。5.6.2 map-has-key($map, $key)map-has-key($map, $key) 这个函数返回在 $map 中是否有 $key,返回的值是布尔类型。$val_map: ("a": 1, "b": 2, "c": 3); // 定义 maps 类型的数据map-has-key($val_map, "b") //=> truemap-has-key($val_map, "e") //=> false5.6.3 map-keys($map)map-keys($map) 函数返回传入的 map 中所有的 key,并且会以逗号分隔为一个列表返回。$val_map: ("a": 1, "b": 2, "c": 3); // 定义 maps 类型的数据map-keys($val_map) //=> "a","b","c"5.6.4 map-merge($map1, $map2)map-merge($map1, $map2) 函数用于合并两个 maps 类型的数据 $map1 和 $map2,并且会返回一个新的 map,如果 $map1 和 $map2 中有相同的 key ,那么 $map2 中的数据会覆盖 $map1 中的这条数据,这个函数和 javascript 中合并两个对象的方法很类似。我们举例看下:$val_map1: ("a": 1, "b": 2);$val_map2: ("c": 3, "d": 4);map-merge($val_map1, $val_map2)// => 返回的数据// (// "a": 1,// "b": 2,// "c": 3,// "d": 4// )5.6.5 map-remove($map, $keys…)看到 remove 我们就知道这个是用来删除的,map-remove($map, $keys…) 函数用来删除 $map 中的一个或多个与 $keys 关联的值,并且返回删除后的 map。$val_map: ("a": 1, "b": 2, "c": 3); // 定义 maps 类型的数据map-remove($val_map, "a", "b") //=> ("c": 3)5.6.6 map-values($map)前面讲到一个函数可以返回 map 中所有的 key ,map-values($map) 这个函数与其类似是用来返回 map 中所有的 value,同样会以逗号分隔为一个列表返回。$val_map: ("a": 1, "b": 2, "c": 3); // 定义 maps 类型的数据map-values($val_map) //=> 1,2,3到这里我们讲了 Map 函数,你可以使用各种 Map 函数来对 Maps 数据类型进行操作和增删改查。
>>> x = tuple()>>> x()创建一个空的元组>>> iterable = ['a', 'b', 'c']>>> x = tuple(iterable)>>> x('a', 'b', 'c')创建一个可迭代对象 iterable,iterable 是一个包含 3 个元素的列表通过 tuple(iterable) 将可迭代对象 iterable 转换为 tuple
有时候我们需要将某行和某列同时删除,这时候我们可以同时传入 index 和 columns 的参数值即可,如果只传一个,则是只删除对应的行或者列:# 导入pandas包import pandas as pd# 指定导入的文件地址data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/第7,8,9,10小节/execl数据demo.xlsx"# 解析数据data = pd.read_excel(data_path)print(data)# --- 输出结果 --- 编程语言 推出时间 价格 主要创始人0 java 1995年 45.6 James Gosling1 python 1991年 67.0 Guido van Rossum2 C 1972年 33.9 Dennis MacAlistair Ritchie3 js 1995年 59.5 Brendan Eich4 php 2012年 69.9 Rasmus Lerdorf5 C++ 1983年 75.0 Bjarne Stroustrup# 同时删除指定行和列data_res=data.drop(index=4, columns="主要创始人")print(data_res)# --- 输出结果 --- 编程语言 推出时间 价格0 java 1995年 45.61 python 1991年 67.02 C 1972年 33.93 js 1995年 59.55 C++ 1983年 75.0输出解析:这里我们同时指定了行索引和列索引的值,通过输出结果可以看出,这里删除了行索引为4的数据并且删除了主要创始人这一列的数据。
大部分听过 Eclipse 的人都会认为它就是一个 Java 集成开发环境(IDE)。但是如果跳出工具软件的概念,Eclipse 可以看做是一个开源社区,这个开源社区专注于构建一个免费开放的开发平台。需要指出的是,大部分人都认为 Eclipse 就是一款被 Java 开发人员用于 Java 开发的工具。但是事实上,Eclipse 对于不同的人来说可能是不同的。因为 Eclipse 提供了插件开发环境(Plug-in Development Environment,简称 PDE) ,它允许所有对 Eclipse 感兴趣的人都可以通过插件来扩展 Eclipse,比如 JDT(Eclipse 中的 Java 开发工具)。这就使用 Eclipse 的使用并不限于 Java 语言(Eclipse 官方就提供了 C/C++、PHP、JavaScript、Rust 等语言版本)。所以,虽然大部分时候 Eclipse 都是指 Java 集成开发环境(IDE),但有时候也可能是指其他语言的集成开发环境。 面向 C/C++ 开发人员的 Eclipse上图是官网所提供的用于 C 和 C++ 开发的 Eclipse IDE。
如果说隐式类型转换是编译器自动进行的类型转换,那么显式类型转换,则是我们人为的进行数据类型的转换,这里可以理解为是一种强制的类型的转换,这种转换将不再遵守上面的转换规则,而是按照我们人为的标明的类型进行转换。就是在我们需要指定类型的变量前加上数据类型,并用圆括号包裹。例如: (int)a, (float)b, (long)c 等。下面我们通过一个示例程序来看一下显式类型转换:393下面是执行结果。a type: int, b type: int, c type: float, d type: floata=b+c, a=5type (b+c): intd=b+c, d=5.000000通过显式类型转换,我们可以控制在计算过程中的数据类型。之前自动转换为 float 类型的数据,在我们显式指定为 int 类型后,计算过程中就会按照 int 类型来进行计算。
ndarray 提供了一个不改变数组元素内容、直接改变数组维度的方法:reshape。通过该方法,可以方便地对数组元素进行重排。reshape 的函数调用方法如下:ndarray.reshape(newshape, order="C")构造函数接受的参数详解如下:参数描述newshape变更后的数组维度order数据元素重排方式,有C、F、A可选。“C”指的是用类C写的读/索引顺序的元素,对二维数组,是优先读写行;“F”是指用FORTRAN类索引顺序读/写元素,对二维数组,是优先读写列。“A”表示排序方式跟随原数组。案例利用 reshape 方法生成一个维度为 4*5、优先读写行的二维数组。np.array(range(20)).reshape((4,5), order="C")这里用 range(20) 生成一个长度为20的有序序列,用 reshape 进行重排序,order 表示优先读写行。Out: array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14], [15, 16, 17, 18, 19]])
>>> x = list()>>> x[]创建一个空的列表>>> iterable = ('a', 'b', 'c')>>> x = list(iterable)>>> x['a', 'b', 'c']创建一个可迭代对象 iterable,iterable 是一个包含 3 个元素的元组通过 list(iterable) 将可迭代对象 iterable 转换为 list
JS 也是一种语言,和 C/C++/Java/Python 类似。真正的浏览器的核心除了对 html 元素进行渲染外,还需要提供 JS 引擎,解析并执行 JS 脚本。谷歌浏览器用 C++ 语言实现了著名的 V8 引擎。我们右键可以直接在开发者工具的 console 面板写 JS 代码,看到语句的执行输出,以及语句相应返回结果。开发者工具下执行 JS 代码对于 JS 的基础知识,上手是非常快的,限于篇幅就不会展开介绍了。
# 导入pandas包import pandas as pd# 指定导入的文件地址data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/第7,8,9,10小节/execl数据demo.xlsx"# 解析数据data = pd.read_excel(data_path)print(data)# --- 输出结果 --- 编程语言 推出时间 价格 主要创始人0 java 1995年 45.6 James Gosling1 python 1991年 67.0 Guido van Rossum2 C 1972年 33.9 Dennis MacAlistair Ritchie3 js 1995年 59.5 Brendan Eich4 php 2012年 69.9 Rasmus Lerdorf5 C++ 1983年 75.0 Bjarne Stroustrup# 修改行索引和 rename({0: "aa", 2: "bb", 3: "cc"},axis=0) 等价data_res=data.rename(index={0: "aa", 2: "bb", 3: "cc"})print(data_res)# 修改列索引和 rename({"编程语言": "bcyy", "价格": "jiage"},axis=1) 等价data_res=data.rename(columns={"编程语言": "bcyy", "价格": "jiage"})print(data_res)# --- 输出结果 --- bcyy 推出时间 jiage 主要创始人0 java 1995年 45.6 James Gosling1 python 1991年 67.0 Guido van Rossum2 C 1972年 33.9 Dennis MacAlistair Ritchie3 js 1995年 59.5 Brendan Eich4 php 2012年 69.9 Rasmus Lerdorf5 C++ 1983年 75.0 Bjarne Stroustrup输出解析:我们这里通过 columns 指定了映射关系,将列索引值编程语言和价格分别修改为 bcyy 和 jiage ,通过输出结果可以看到修改的效果。当然如果我们同时设置 index 和 columns 的映射关系,则会同时修改对应的索引值:# 修改列索引和 rename({"编程语言": "bcyy", "价格": "jiage"},axis=1) 等价data_res=data.rename(index={0: "aa", 2: "bb", 3: "cc"},columns={"编程语言": "bcyy", "价格": "jiage"})print(data_res)# --- 输出结果 ---bcyy 推出时间 jiage 主要创始人aa java 1995年 45.6 James Gosling1 python 1991年 67.0 Guido van Rossumbb C 1972年 33.9 Dennis MacAlistair Ritchiecc js 1995年 59.5 Brendan Eich4 php 2012年 69.9 Rasmus Lerdorf5 C++ 1983年 75.0 Bjarne Stroustrup
我们来测试希尔排序算法的性能,使用10000个随机数进行测试:import randomimport datetimefrom sort_algorithms import shell_sort, insert_sort2if __name__ == '__main__': nums = [random.randint(10, 10000) for i in range(10000)] start = datetime.datetime.now() shell_sort(nums) # insert_sort2(nums) end = datetime.datetime.now() print('Running time: %s Seconds' % (end-start))PS C:\Users\spyinx\Desktop\学习教程\慕课网教程\算法慕课教程\code> & "D:/Program Files (x86)/python3/python.exe" c:/Users/spyinx/Desktop/学习教程/慕课网教程/算法慕课教程/code/test_algorithms.pyRunning time: 0:00:00.071001 Seconds然后来看看我们用前面改进的插入排序算法 (使用前面完成的 insert_sort2() 方法) 进行测试并和希尔排序的结果对比。可以看到希尔排序的性能大概是插入排序算法的 3 倍,所以希尔排序相比插入排序算法性能提升还是非常明显的。PS C:\Users\spyinx\Desktop\学习教程\慕课网教程\算法慕课教程\code> & "D:/Program Files (x86)/python3/python.exe" c:/Users/spyinx/Desktop/学习教程/慕课网教程/算法慕课教程/code/test_algorithms.pyRunning time: 0:00:00.216178 Seconds
前面的小节我们学习了如何剖析应用性能,接下来几个小结我们学习如何 C/C++ 支持(NDK)方面的知识。本小节学习如何安装 NDK 和 CMake。
先来看一个基础例子:let target = { a: 1, b: 1 }let source1 = { a: 2, c: 3 }let source2 = { b: 2, d: 4 }Object.assign(target, source1, source2)console.log(target) // { a: 2, b: 2, c: 3, d: 4 }解释: 通过 Object.assign() 将 source1 与 source2 混入到 target 上,并且替换了 target 对象原有的属性值。
用 Set 定义的数组对象,可以使用 Array.from() 得到一个正常的数组。const set = new Set(['a', 'b', 'c', 'd']);Array.from(set);// [ "a", "b", "c", "d" ]上面的代码中创建了一个 Set 数据结构,把实例传入 Array.from() 可以得到一个真正的数组。
接下来我们一起看下dataframe的常用方法,见证这个二维数据的厉害吧。常用函数函数描述DataFrame()创建一个DataFrame数据结构的对象head()用于查看数据集的前n行info()快速查看数据的描述tail()用于查看数据集的后n行T转置函数sum()求和函数下面我们分别看一下每个方法的具体操作实例:DataFrame() 方法该方法用于创建 DataFrame 对象,我们可以指定行索引和列索引创建,还可以通过字典进行创建。下面代码中分部创建一个4*4的 DataFrame。# 1.通过传入数据,行索引,列索引进行创建df1=pd.DataFrame([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]], index=list('ABCD'),columns=list('ABCD'))print(df1)# --- 输出结果 --- A B C DA 1 2 3 4B 5 6 7 8C 9 10 11 12D 13 14 15 16# 第一个参数是存放在DataFrame里的数据,第二个index是行名索引,第三个columns是列索引,注意:这里index,columns的list长度要和对应的行和列索引数量一致,不然会报错。# 1.通过字典进行创建data={'A':['1','2','3','4'], 'B':['5','6','7','8'], 'C':['9','10','10','11'], 'D':['12','13','14','15']}df2=pd.DataFrame(data)print(df2)# --- 输出结果 --- A B C D0 1 5 9 121 2 6 10 132 3 7 10 143 4 8 11 15head() 方法该方法通过传入的值,查找数据的的前n行# 2.head(2) 取前两行数据data={'A':['1','2','3','4'], 'B':['5','6','7','8'], 'C':['9','10','10','11'], 'D':['12','13','14','15']}df2=pd.DataFrame(data)print(df2.head(2))# --- 输出结果 --- A B C D0 1 5 9 121 2 6 10 13# 这里我们输出了前两行的数据info() 方法通过该方法,可以看到数据的描述信息摘要,在对数据进行探索性分析时比较有用,比如行和列数,每个值的类型,以及非空值的数量。# 3.info() 取前两行数据data={'A':['1','2','3','4'], 'B':['5','6','7','8'], 'C':['9','10','10','11'], 'D':['12','13','14','15']}df2=pd.DataFrame(data)print(df2.info())# --- 输出结果 ---<class 'pandas.core.frame.DataFrame'>RangeIndex: 4 entries, 0 to 3Data columns (total 4 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 A 4 non-null object 1 B 4 non-null object 2 C 4 non-null object 3 D 4 non-null objectdtypes: object(4)memory usage: 256.0+ bytesNonetail() 方法通过传入的值,返回 DataFrame 对象的后几行数据# 4.tail(2) 取后两行数据data={'A':['1','2','3','4'], 'B':['5','6','7','8'], 'C':['9','10','10','11'], 'D':['12','13','14','15']}df2=pd.DataFrame(data)print(df2.tail(2))# --- 输出结果 --- A B C D2 3 7 10 143 4 8 11 15# 这里输出的是后两行数据T 方法直接字母 T,可以将 DataFrame 的行和列进行置换。# 5.T 进行置换行和列data={'A':['1','2','3','4'], 'B':['5','6','7','8'], 'C':['9','10','10','11'], 'D':['12','13','14','15']}df2=pd.DataFrame(data)print(df2)# --- 输出结果 --- A B C D0 1 5 9 121 2 6 10 132 3 7 10 143 4 8 11 15 # 原dataframeprint(df2.T)# --- 输出结果 --- 0 1 2 3A 1 2 3 4B 5 6 7 8C 9 10 10 11D 12 13 14 15 # 进行置换后,行和列位置变换sum() 方法sum() 是求和方法,默认是对每列求和,传入 1 也就是 sum(1) ,是对每行进行求和。# 1.sum()对每列求和,sum(1)对每行进行求和data={'A':[1,2,3,4], 'B':[5,6,7,8], 'C':[9,10,11,12], 'D':[13,14,15,16]}df2=pd.DataFrame(data)print(df2)# --- 输出结果 --- A B C D0 1 5 9 131 2 6 10 142 3 7 11 153 4 8 12 16 # 原dataframe数据print(df2.sum())# --- 输出结果 ---A 10B 26C 42D 58 dtype: int64 # 对每列进行求和print(df2.sum(1))# --- 输出结果 ---0 281 322 363 40dtype: int64 # 对每行进行求和
collect 操作是根据 Stream 里面的值生成一个列表,它是一个求值操作。Tips: collect 方法通常会结合 Collectors 接口一起使用,是一个通用的强大结构,可以满足数据转换、数据分块、字符串处理等操作。我们来看一些例子:生成集合:1276输出:[a, b, c]使用 collect(Collectors.toList()) 方法从 Stream 中生成一个列表。集合转换:使用 collect 来定制集合收集元素。1277输出结果: [a, b, c, c][a, b, c]使用 toCollection 来定制集合收集元素,这样就把 List 集合转换成了 TreeSet转换成值:使用 collect 来对元素求值。1278输出: c上面我们使用 maxBy 接口让收集器生成一个值,通过方法引用调用了 String 的 compareTo 方法来比较元素的大小。同样还可以使用 minBy 来获取最小值。数据分块:比如我们对于数据 1-7 想把他们分成两组,一组大于 5 另外一组小于等于 5,我们可以这么做:1279输出结果:[6, 7][1, 2, 3, 4, 5]通过 partitioningBy 接口可以把数据分成两类,即满足条件的和不满足条件的,最后将其收集成为一个 Map 对象,其 Key 为 Boolean 类型,Value 为相应的集合元素。同样我们还可以使用 groupingBy 方法来对数据进行分组收集,这类似于 SQL 中的 group by 操作。字符串处理:collect 还可以来将元素组合成一个字符串。1280输出:[a,b,c]这里我们把 collected 数组的每个元素拼接起来,并用 [ ] 包裹。
pip 是 Python 包管理工具,该工具提供了对Python 包的查找、下载、安装、卸载的功能。Python 3.4+ 以上版本自带 pip 工具,如果在 python.org 下载最新版本的安装包,则已经自带了该工具。使用命令 pip --version 检查是否已经安装了 pip,如下所示:C:\> pip --versionpip 9.0.1 from C:\Python3\lib\site-packages (python 3.6)
通道可以理解为一种特殊的变量,所以它的声明和其它变量的声明并没有太大的区别,声明通道变量的写法如下:var c chan int //声明一个存放int类型数据的通道但是它声明之后并不能直接使用,需要使用内置函数 make() 来创建一下通道变量才可以使用:Tips:由于 chan 的底层是一个指针,在 Go 语言中指针初始值为空,是需要实例化的。make 就是实例化了 chan。var c chan int //声明一个存放int类型数据的通道c = make(chan int, 1) //创建一个长度为1的通道在这种情况下最好使用:= 来同时声明和创建:c := make(chan int, 1) //声明并创建一个存放int类型数据的通道
项目中包含一个 cpp 源码文件:native-lib.cppextern "C" JNIEXPORT jstring JNICALLJava_com_imooc_hellojni_MainActivity_stringFromJNI( JNIEnv* env, jobject /* this */) { std::string hello = "This string from C++"; return env->NewStringUTF(hello.c_str());}这个函数的功能很简单,返回一个字串 “This string from C++”。我们看到这个函数的函数名很长:Java_com_imooc_hellojni_MainActivity_stringFromJNI,这是按特定的规范组织的,分解之后各部分的含义如下:Java:表示是给 Java 源码中调用的。com_imooc_hellojni_MainActivity:表示由哪个 Java 类(包名类名)来调用。stringFromJNI:表示本地方法名称,会在 Java 源码中声明。
正则表达式 (regular expression) 描述了一种字符串匹配的模式 (pattern),例如:模式 ab+c可以匹配 abc、abbc、abbbc代表前面的字符出现 1 次或者多次模式 ab*c可以匹配 ac、abc、abbc? 代表前面的字符出现 0 次或者多次模式 ab?c可以匹配 ac、abc? 代表前面的字符出现 0 次或者 1 次它的用途包括:检查一个串是否含有某种子串将匹配的子串替换从某个串中取出符合某个条件的子串
零基础的开发者(会从编程语言的最基础开始讲起);有一定 Java、C 或 C++ 开发基础开发者想学习 Kotlin 开发;Android 开发者想学习 Kotlin 开发 Android 应用;Java 后端开发者想学习 Kotlin 开发后端应用;对 Kotlin 语言感兴趣的所有开发者。
将一个带有键值对的数组转化成对象。var arr = [ ['a', '0'], ['b', '1'], ['c', '2'] ];var obj = Object.fromEntries(arr);console.log(obj); // {a: "0", b: "1", c: "2"}上面的代码中,arr 是一个二维数组,子数组中的每一个项包含键和值,只有这样的数组类型才可以转化为对象。