# 导入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)# --- 输出结果 --- 编程语言 推出时间 价格 主要创始人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输出解析:我们通过 index 参数指定映射关系,修改了列索引0,2,3的索引值为aa,bb,cc,通过输出结果可以看出修改的效果。
os.path.dirname 的功能是获取路径名中的目录名,该函数的使用示例:>>> import os>>> os.dirname('C:\\Windows\\Readme.txt')'C:\\Windows'
val sumLambda: (Int, Int, Int) -> Int = { a, b, c -> a + b + c }//调用println("sum = ${sumLambda(1, 6, 7)}")
虽然运行效果比较简单,但是通过前面的代码分析,我们可以知道,“This string from C++” 这个字串是在 Java 源码中调用 Cpp 源码中的函数来获取的。这是一个最简单的项目支持 C/C++ 的例子。
参数作用:-XX:+TraceClassLoading 参数是为了跟踪类的加载。为了更好的理解并掌握 -XX:+TraceClassLoading 参数,我们通过如下步骤进行操作。步骤 1:在 VM Options 中配置参数 -XX:+TraceClassLoading 并保存;步骤 2:运行示例代码,观察执行结果。结果验证:由于追踪的结果日志非常庞大,此处仅展示具有代表性的类的加载。全部的类加载日志,请学习者自行执行代码进行验证。[Opened C:\Program Files\Java\jdk1.8.0_152\jre\lib\rt.jar][Loaded java.lang.Object from C:\Program Files\Java\jdk1.8.0_152\jre\lib\rt.jar][Loaded java.util.ArrayList$SubList from C:\Program Files\Java\jdk1.8.0_152\jre\lib\rt.jar][Loaded java.util.ListIterator from C:\Program Files\Java\jdk1.8.0_152\jre\lib\rt.jar][Loaded java.util.ArrayList$SubList$1 from C:\Program Files\Java\jdk1.8.0_152\jre\lib\rt.jar][Loaded DemoMain.TracingClassParamsDemo from file:/D:/GIT-Repositories/GitLab/Demo/out/production/Demo/][Loaded java.lang.Class$MethodArray from C:\Program Files\Java\jdk1.8.0_152\jre\lib\rt.jar][Loaded java.lang.Void from C:\Program Files\Java\jdk1.8.0_152\jre\lib\rt.jar][Loaded java.lang.Shutdown from C:\Program Files\Java\jdk1.8.0_152\jre\lib\rt.jar][Loaded java.lang.Shutdown$Lock from C:\Program Files\Java\jdk1.8.0_152\jre\lib\rt.jar]结果分析:我们来对类的加载日志进行分析。第一行:Opened rt.jar。打开 rt.jar,rt.jar 全称是 Runtime,该 jar 包含了所有支持 Java 运行的核心类库,是类加载的第一步;第二行:加载 java.lang.Object。Object 是所有对象的父类,是首要加载的类;第三、四、五行:加载了 ArrayList 的相关类,我们的示例代码中使用到了 ArrayList,因此需要对该类进行加载;第六行:加载我们的测试类 TracingClassParamsDemo ;第七行:加载 java.lang.Class 类,并加载类方法 MethodArray;第八行:加载 java.lang.Void 类,因为我们的 main 函数是 void 的返回值类型,所以需要加载此类;第九、十行:加载 java.lang.Shutdown 类, JVM 结束运行后,关闭 JVM 虚拟机。从以上对日志的分析来看,JVM 对类的加载,不仅仅加载我们代码中使用的类,还需要加载各种支持 Java 运行的核心类。类加载的日志量非常庞大,此处仅仅对重点类的加载进行日志的解读,全部的类加载日志,请学习者自行执行代码进行验证。
和数组一样,展开语法在字面量对象中的使用方式也有很多种:const obj1 = {a: 1, b: 2};const obj2 = {...obj1, c: 30};console.log(obj2); // {a:1, b:2, c:30}const obj3 = {b: 20, c: 30};const obj4 = {...obj2, ...obj3}; // 合并对象console.log(obj4); // {a:1, b:20, c:30}上面的代码可以看出,使用方式和数组基本一致,都是把数组或对象中的每一项展开到另一个数组或对象中去。
pop (key) 方法删除字典给定键 key 所对应的键值对,返回被删除的值,示例如下:>>> x = {'a':'A', 'b':'B', 'c': 'C'}>>> x.pop('b')'B'>>> x{'a':'A', 'c':'C'}在第 1 行,创建一个具有 3 个键值对的字典;在第 2 行,使用方法 pop (‘b’) 从字典中删除键 ‘b’ 对应的键值对;在第 3 行,方法 pop (‘b’) 返回键 ‘b’ 对应的值 ‘B’;在第 4 行,显示删除后的字典;在第 5 行,删除一个键值对后,字典仅包含 2 个键值对。
range 可以用来遍历的对象有数组、切片、map、字符串以及通道。遍历的对象不同,range 的返回值也会有所不同。遍历数组、切片和字符串时,它返回的就是数据的索引和值。遍历map时返回的就是map的key和value。而遍历通道时则只返回通道中的数据。代码示例:package mainimport ( "fmt")func main() { str := "Codey" intArray := [5]int{1, 2, 3, 4, 5} intSlice := []int{1, 2, 3, 4, 5} m := map[string]string{"Apple": "苹果", "Orange": "橘子", "Banana": "香蕉"} c := make(chan int, 10) c <- 10 c <- 11 c <- 12 c <- 13 c <- 14 fmt.Println("---字符串的遍历---") //遍历字符串 for k, v := range str { fmt.Printf("索引:%d,值:%c\n", k, v) } fmt.Println("---数组的遍历---") //遍历数组 for k, v := range intArray { fmt.Printf("索引:%d,值:%d\n", k, v) } fmt.Println("---切片的遍历---") //遍历切片 for k, v := range intSlice { fmt.Printf("索引:%d,值:%d\n", k, v) } fmt.Println("---map的遍历---") //遍历map for k, v := range m { fmt.Printf("key:%s,value:%s\n", k, v) } fmt.Println("---通道的遍历---") //遍历通道 for v := range c { fmt.Printf("值:%d\n", v) if len(c) == 0 { break } }}执行结果:若是在开发过程中只想用到遍历对象的索引或者值,比如说一个map以汽车的车牌号为key存储了一些汽车的信息,但是你只想要操作车牌号。可以使用_来接收不需要使用的值。如果是只想用索引的话,可以直接只用一个参数接收遍历对象传出的值,默认只会接收索引。代码示例:package mainimport ( "fmt")func main() { m := map[string]string{"Apple": "苹果", "Orange": "橘子", "Banana": "香蕉"} fmt.Println("---map的key值---") //只取key for k := range m { fmt.Printf("key:%s\n", k) } fmt.Println("---map的value值---") //只取value for _, v := range m { fmt.Printf("value:%s\n", v) }}执行结果:
和其它语言不同的是,Go 语言可以一次返回多个值,多个值直接跟在 return 关键字之后,使用,隔开即可。代码示例:package mainimport "fmt"func SumAndProduct(a, b int) (int, int) { c := a + b d := a * b return c, d //同时返回c和d两个变量}func main() { sum, product := SumAndProduct(1, 2) //接收多返回值的函数时,也需要用逗号隔开变量 fmt.Println("a + b =", sum) fmt.Println("a * b =", product)}执行结果:
C 语言的发明和很多伟大的发明一样,都是一个人或者几个人不务正业闲着没事偶然间发明的。据说当时有一个年轻人为了能够在一台上机费更便宜的计算机上愉快的进行两人对战游戏,但不幸的是,这台机器上原有的操作系统只能支持一个人在线游戏,于是这位热爱游戏的年轻人不得不重新为这台机器编写一个新的操作系统,可以支持多用户,这样大家就可以一起同时在线玩这个游戏了。而在编写这个操作系统的过程中,他们对 B 语言进行了升级,于是 C 语言诞生了。这个发明 C 语言的年轻人叫丹尼斯•里奇 Dennis M. Ritchie [1]。C 语言派生自 BCPL 语言,并且 C 语言对 BCPL 语言有了长足的扩展。因为 BCPL 简称为 B 语言,因此 C 语言就采用了字母表中的下一个字母来作为语言的名称。讲真这名字起得够随意的,不过话说回来了 B 语言这名字好像就是来自 A 语言的,有兴趣的同学可以去了解一下这三门语言之间的渊源,在这里我们就不多赘述了。下面是一个 C 语言发展历史的列表:语言年份开发者Algol1960International GroupBCPL1967Martin RichardB1970Ken ThompsonTraditional C1972Dennis RitchieK & R C1978Kernighan & Dennis RitchieANSI C1989ANSI CommitteeANSI/ISO C1990ISO CommitteeC991999Standardization Committee表1: C 语言发展历程 [3]图1: C 语言发明者 Dennis Ritchie [2]
let target = {a: 1};let source1 = {b: 2};let source2 = {c: 3};Object.assign(target, source1, source2);console.log(target); // {a: 1, b: 2, c: 3}上面的代码可以看出,Object.assign () 不会把目标对象清空,会合并后面所有的对象上的值。
let target = {};let source = {a: 1, b: 2, c: 3};Object.assign(target, source);target.d = 4;console.log(target) // {a: 1, b: 2, c: 3, d: 4}console.log(source) // {a: 1, b: 2, c: 3}上面的代码可以看出,Object.assign () 的主要用法就是把源对象拷贝到指定的对象上去,目标对象的更改不会影响源对象。
以课程表 course 和 teacher 左连接为例:SELECT c.id AS course_id,c.*,t.* FROM course c LEFT JOIN teacher t ON c.teacher_id=t.id; 执行结果如下图:Tips:这对上述 sql 语句说明如下:c.id AS course_id 表示将 course表 中 id 字段重命名为 course_id 展示,其目的是为了防止和 teacher表 中 id 字段混淆;c.* 表示 course 表所有字段数据;t.* 表示 teacher 表字段所有数据;ON 后面跟着的条件是连接表的条件;course c 表示将 course 简写为 c, teacher t 表示将 teacher 简写为 t;LEFT JOIN 为左连接,是以左边的表为’基准’,若右表没有对应的值,用 NULL 来填补。
BinaryOutputArchive 是二进制的序列化方式,这种方式将 Java 对象转化成二进制的格式来进行数据传输。在它的具体方法中,使用的是 java.io.DataOutputStream 的方法来完成 Java 对象到二进制的转换,我们来看看具体实现:/*** 二进制的序列化*/public class BinaryOutputArchive implements OutputArchive { // 定义字节缓冲区大小 private ByteBuffer bb = ByteBuffer.allocate(1024); // 数据输出接口 DataOutput private DataOutput out; // 使用 OutputStream 初始化 BinaryOutputArchive public static BinaryOutputArchive getArchive(OutputStream strm) { return new BinaryOutputArchive(new DataOutputStream(strm)); } // 构造方法传入 DataOutput public BinaryOutputArchive(DataOutput out) { this.out = out; } // 输出 byte 类型为二进制 public void writeByte(byte b, String tag) throws IOException { this.out.writeByte(b); } // 输出 boolean 类型为二进制 public void writeBool(boolean b, String tag) throws IOException { this.out.writeBoolean(b); } // 输出 int 类型为二进制 public void writeInt(int i, String tag) throws IOException { this.out.writeInt(i); } // 输出 long 类型为二进制 public void writeLong(long l, String tag) throws IOException { this.out.writeLong(l); } // 输出 float 类型为二进制 public void writeFloat(float f, String tag) throws IOException { this.out.writeFloat(f); } // 输出 double 类型为二进制 public void writeDouble(double d, String tag) throws IOException { this.out.writeDouble(d); } // 工具方法:字符串转字节缓冲区 private ByteBuffer stringToByteBuffer(CharSequence s) { this.bb.clear(); int len = s.length(); for(int i = 0; i < len; ++i) { if (this.bb.remaining() < 3) { ByteBuffer n = ByteBuffer.allocate(this.bb.capacity() << 1); this.bb.flip(); n.put(this.bb); this.bb = n; } char c = s.charAt(i); if (c < 128) { this.bb.put((byte)c); } else if (c < 2048) { this.bb.put((byte)(192 | c >> 6)); this.bb.put((byte)(128 | c & 63)); } else { this.bb.put((byte)(224 | c >> 12)); this.bb.put((byte)(128 | c >> 6 & 63)); this.bb.put((byte)(128 | c & 63)); } } this.bb.flip(); return this.bb; } // 输出 String 类型为二进制 public void writeString(String s, String tag) throws IOException { if (s == null) { this.writeInt(-1, "len"); } else { // String 不为空转字节缓冲区 ByteBuffer bb = this.stringToByteBuffer(s); this.writeInt(bb.remaining(), "len"); // 输出 字节数组 this.out.write(bb.array(), bb.position(), bb.limit()); } } // 输出 字节数组为二进制 public void writeBuffer(byte[] barr, String tag) throws IOException { if (barr == null) { this.out.writeInt(-1); } else { this.out.writeInt(barr.length); this.out.write(barr); } }}介绍了序列化的具体实现类,接下来就是反序列化接口 InputArchive 的实现类 BinaryInputArchive。
如果想要改变遍历的顺序,一种是上面案例中提到的,利用 copy 方法来修改内存顺序。当然,nditer 也提供了 order 参数来达到同样的目的。案例C order,即是行序优先,跟默认的遍历顺序一致。print ('以 C 风格顺序排序:')for i in np.nditer(arr, order="C"): print(i, end=" ")打印结果为:以 C 风格顺序排序:0 1 2 3 4 5 Fortran order,即是列序优先:print ('以 F 风格顺序排序:')for i in np.nditer(arr, order="F"): print(i, end=" ")打印结果为:以 F 风格顺序排序:0 3 1 4 2 5
insert(loc, column, value, allow_duplicates=False) 函数可以实现向指定的列中添加数据:参数名说明loc指定插入列的序号,从0开始column列索引名value插入的列数据duplicates是否允许插入已有的数据,如果为 False 插入重复数据会报错# 导入pandas包import pandas as pd# 指定导入的文件地址 默认是file,这里的路径中省略了 file:/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# 通过 insert() 函数,在第1列插入列索引为 new 的数据列data.insert(0,"new",["a","b","c","d","e","f"], allow_duplicates=False)print(data)# --- 输出结果 --- new 编程语言 推出时间 价格 主要创始人0 a java 1995年 45.6 James Gosling1 b python 1991年 67.0 Guido van Rossum2 c C 1972年 33.9 Dennis MacAlistair Ritchie3 d js 1995年 59.5 Brendan Eich4 e php 2012年 69.9 Rasmus Lerdorf5 f C++ 1983年 75.0 Bjarne Stroustrup输出解析:通过 insert() 函数操作,我们看到输出结果在第一列新增了数据列内容。
编写程序 echo.py,程序显示所有的参数:import sysfor arg in sys.argv: print(arg)程序遍历数组 sys.argv,打印数组中的参数。在命令行中运行程序:C:\> python echo.py a b cecho.pyabcsys.argv 包括 4 个参数:‘echo.py’、‘a’、‘b’、‘c’
安装模式有 2 种,手动离线安装和 yum 安装,由于 httpd 是 C 程序,如果是手动安装的话要先安装 C 对应的环境和 httpd 依赖的一些包。yum 的安装方式相对比较简单。
另一个分治算法的典型应用是大整数相乘问题。对于两个以字符串形式表示的长整数,计算其相乘结果。关于分治法比较核心的一个问题就是,找到如何将子问题的解合并成父问题的解。我们简单描述一下这个基于分治思想的大数乘法算法,又叫 Karatsuba 算法。假设 x 和 y 是两个要做乘法的十进制大数,并且位数分别为 m 和 n。若将 x 和 y 分别均分成两部分,则 x 和 y 可以表示如下:x=a∗10m2+bx = a*10^{\frac{m}{2}} + bx=a∗102m+by=c∗10n2+dy = c*10^{\frac{n}{2}} + dy=c∗102n+d此时有:x∗y=(a∗10m2+b)(c∗10n2+d)=ac∗10m+n2+bc∗10n2+ad∗10m2+bdx*y=(a*10^{\frac{m}{2}} + b)(c*10^{\frac{n}{2}} + d)=ac*10^{\frac{m+n}{2}}+bc*10^{\frac{n}{2}}+ad*10^{\frac{m}{2}}+bdx∗y=(a∗102m+b)(c∗102n+d)=ac∗102m+n+bc∗102n+ad∗102m+bd这样大整数乘法就被分解成 4 个长度减半的整数的乘法。如此执行下去,直到执行的乘法的两数足够小时,然后计算反推最终结果。根据上面的执行思路,我们开始一步一步得到大整数相乘的分治代码。首先处理初始以及最后分治的终止条件:如果 s1 或者 s2 中有一个为空串,那么相乘结果为 '0‘,注意输出字符串;此外,分解到最后 s1 和 s2 字符串的长度均为1 时,我们可以直接将两个字符串强装成数字然后进行相乘,最后返回的结果也要再转成字符串:if not s1 or not s2: # 有一个为空,则结果为0 return '0'elif len(s1) == 1 and len(s2) == 1: # 终止条件 return str(int(s1) * int(s2))接下来开始对字符串 s1 和 s2 进行分治求解:# 其余情况l1 = len(s1) // 2l2 = len(s2) // 2# 将s1分成两部分a = s1[:l1] b = s1[l1:]# 将s2分成两部分c = s2[:l2]d = s2[l2:]接下来我们分别得到了4个子串:a、b、c、d。按照前面的公式,我们分别要计算 ac、bc、ad 和 bd 的值。这些值可以使用递归方法得到,要注意相乘结果的10次幂需要保留,以便后续能合成最终问题的解。mi = len(b) # 对于a的10次幂ni = len(d) # 对于c的10次幂# 分别计算ac, ad, bc, bd,分别补上相应的幂次,使用分治计算x1 = bigDataMultiple(a, c) + '0' * (mi + ni)x2 = bigDataMultiple(a, d) + '0' * mix3 = bigDataMultiple(b, c) + '0' * ni x4 = bigDataMultiple(b, d)最后是计算 x1+x2+x3+x4 的值便可得到原大问题的解,由于 x1~x4 均为字符串,我们按照字符串上每位数字相加来进行。首先需要将所有字符串的长度统一,对于短字符串需要将前面补零:max_len = max(len(x1), len(x2), len(x3), len(x4))x1 = '0' * (max_len - len(x1)) + x1x2 = '0' * (max_len - len(x2)) + x2x3 = '0' * (max_len - len(x3)) + x3x4 = '0' * (max_len - len(x4)) + x4接着从字符串最后一位开始,计算每位上的值,注意进位问题即可:res = ''c = 0for i in range(max_len - 1, -1, -1): s = int(x1[i]) + int(x2[i]) + int(x3[i]) + int(x4[i]) + c res = str(s % 10) + res c = s // 10# 注意,如果循环完后进位>0,需要补上进位值if c > 0: res = str(c) + res然而,通过提交代码发现有时候在合成最终结果时,字符串前面会出现 ‘0’。因此下面的代码就是找到前面非 ‘0’ 开头字符的位置:# 去掉res最前面的'0'k = 0while res and k < len(res) and res[k] == '0': k += 1最后得到大整数相乘的最终结果为:res[k:]。综合前面的分析与讨论,得到完成的处理大整数相乘问题的 Python 实现如下:def bigDataMultiple(s1, s2): """ 计算 s1 * s2,返回大整数相乘结果 """ if not s1 or not s2: # 有一个为空,则结果为0 return '0' elif len(s1) == 1 and len(s2) == 1: # 终止条件 return str(int(s1) * int(s2)) # 其余情况 l1 = len(s1) // 2 l2 = len(s2) // 2 # 将s1分成两部分 a = s1[:l1] b = s1[l1:] # 将s2分成两部分 c = s2[:l2] d = s2[l2:] mi = len(b) # 对于a的10次幂 ni = len(d) # 对于c的10次幂 # 分别计算ac, ad, bc, bd,分别补上相应的幂次,使用分治计算 x1 = bigDataMultiple(a, c) + '0' * (mi + ni) x2 = bigDataMultiple(a, d) + '0' * mi x3 = bigDataMultiple(b, c) + '0' * ni x4 = bigDataMultiple(b, d) # 将计算的结果根据最长的补零,方便后面直接相加计算 max_len = max(len(x1), len(x2), len(x3), len(x4)) x1 = '0' * (max_len - len(x1)) + x1 x2 = '0' * (max_len - len(x2)) + x2 x3 = '0' * (max_len - len(x3)) + x3 x4 = '0' * (max_len - len(x4)) + x4 # 计算x1+x2+x3+x4的值,也就是原问题的解 res = '' c = 0 for i in range(max_len - 1, -1, -1): s = int(x1[i]) + int(x2[i]) + int(x3[i]) + int(x4[i]) + c res = str(s % 10) + res c = s // 10 # 注意,如果循环完后进位>0,需要补上进位值 if c > 0: res = str(c) + res # 去掉res最前面的'0' k = 0 while res and k < len(res) and res[k] == '0': k += 1 return res[k:]这道题是牛客网上的原题,我实现的分治算法略微复杂,大家可以参考上面的一些题解,有非常精简和高效的实现。多参考优秀的代码对我们提升自己编程能力也是有莫大好处的。
# 导入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(labels=["推出时间","主要创始人"],axis=1)print(data_res)# --- 输出结果 --- 编程语言 价格0 java 45.61 python 67.02 C 33.93 js 59.54 php 69.95 C++ 75.0输出解析:通过 labels 设置删除指定的列,列索引名要真实存在,不然会报错,同时 axis=1 是指定删除列操作,不能省略。通过输出结果可以看到删除了推出时间和主要创始人这两列的数据。
numpy.ndarray.flatten返回一份数组拷贝,并折叠为一维的数组。对拷贝所做的修改不会影响原始数组,函数原型如下:ndarray.flatten(order='C')其中,order 可选:‘C’ – 按行,‘F’ – 按列,‘A’ – 原顺序,‘K’ – 元素在内存中的出现顺序。案例将数组 arr0 以特定顺序展开:print("将arr0以行顺序展开:", arr0.flatten(order='C'))print("将arr0以列顺序展开:", arr0.flatten(order='F'))执行结果为:将arr0以行顺序展开: [0 1 2 3 4 5 6 7]将arr0以列顺序展开: [0 4 1 5 2 6 3 7]
如果你学习过 C/C++ 或者 Java 开发应该很熟悉main()函数,没错,一切代码都是从main()函数开始的。在 Android 中也有类似的概念,每个 Android 应用程序都有一个主 Activity(启动 Activity),而其中的onCreate()方法就是所有代码的起点。
markdown 文件预览插件,安装如下:快捷键使用如下:说明Windows/LinuxOSX在浏览器里预览Ctrl+Alt+O⌘+⌥+O导出成 HTMLCtrl+Alt+X⌘+⌥+X用 HTML 格式复制文件Ctrl+Alt+C⌘+⌥+C
当然字符串也是可以被解构的,字符串可以当作数组被解构。const [a, b, c, d, e] = 'imooc';console.log(a); // "i"console.log(b); // "m"console.log(c); // "o"console.log(d); // "o"console.log(e); // "c"字符串可以被看成类数组的东西,类似数组的对象都有一个 length 属性,字符串也可以被当作对象来解构,但是由于字符串方法只有 length 属性,所以只能解构出 length 的值。let {length : len} = 'hello';console.log(len); // 5
通过openFileInput()可以读取我们刚刚创建的文件,和FileOutputStream方法类似,该方法返回一个输入流,接着我们可以从输入流里读取数据,代码示例如下:FileInputStream in = openFileInput(file);int c;String temp="";// 挨个读取字符while( (c = in.read()) != -1){ temp = temp + Character.toString((char)c);}// temp就是从文件中读取的内容in.close();
os.path 模块是 os 模块的子模块,用于处理文件路径名。路径名由两部分构成:目录名和文件名。例如:路径 C:\Windows\Readme.txt,目录名为 C:\Windows,文件名为 Readme.txt。
创建支持原生代码的新项目的步骤与创建任何其他 Android Studio 项目的步骤相似,但还需要执行一个额外的步骤:在向导的 Choose your project 部分中,选择 Native C++ 项目类型。点击 Next。填写向导下一部分中的所有其他字段。点击 Next。在向导的 Customize C++ Support 部分中,您可以使用 C++ Standard 字段来自定义项目。使用下拉列表选择您想要使用哪种 C++ 标准化。选择 Toolchain Default 可使用默认的 CMake 设置。点击 Finish。至此,项目创建完成,我们可以看到项目中同时包含了 Java 代码和 Cpp 代码。
1. 对集合进行迭代:fun main(args: Array<String>) { val items = list.of("java", "kotlin", "python") for (item in items) { println(item) }}2. 使用 in 运算符判断集合内是否包含某个实例:when { "java" in items -> println("is good lang") "kotlin" in items -> println("is good good lang") else -> println("python is best lang")}3. 使用 lambda 表达式来过滤(filter)和映射(map)集合:fun main(args: Array<String>) { val langs = listOf("C", "C++", "Java", "Python", "JavaScript") langs.filter { it.startsWith("C") } .sortedBy { it } .map { it.toUpperCase() } .forEach { println(it) }}
数组由中括号 [] 包裹,每一项之间用逗号 , 分隔。[第一项, 第二项, 第三项, ... , 第n项]创建数组最常见的方式是使用字面量。var hobby = ['java', 'c', 'c++', 'python', 'javascript', 1, 2, 3, true, false];console.log(hobby);通过直接描述一个数组的方式就可以创建一个数组。
我们可以在 Debugger 标签中指定调试选项。对于 C 和 C++ 代码,Android Studio 会使用 LLDB 调试程序。除了普通的 Android Studio 界面,调试程序窗口还有一个 LLDB 标签,让我们可以在调试过程中输入 LLDB 命令。我们可以输入与 Android Studio 用于在调试程序界面中显示信息的命令相同的命令,还可以执行其他操作。对于 C 和 C++ 项目,我们可以在 Debugger 标签中添加符号目录,以及 LLDB 启动与连接后命令。Debug typeJava:仅调试 Java 代码;Auto:让 Android Studio 为我们的项目选择最合适的调试类型;Native:调试原生 C 或 C++ 代码;Dual:在两个单独的调试会话中调试 Java 和原生代码;Symbol Directories如果要添加符号文件来为调试程序提供在 Android Studio 外部生成的 C 或 C++ 代码的信息,我们可以在此处添加一个或多个目录。LLDB Startup Commands添加要在调试程序连接到进程之前执行的 LLDB 命令。LLDB Post Attach Commands添加要在调试程序连接到进程之后立即执行的 LLDB 命令。Logging:Target channels指定 LLDB 日志选项。Android Studio 会根据团队的经验设置默认选项,所以速度不会太慢,但却包含问题排查所需的信息。Android Studio 错误报告经常需要请求日志。Before Launch定义启动之前的操作。