通常在使用数组时,有必要找出特定元素的索引。这可以通过使用 index 方法来实现,该方法返回第一个元素的索引以匹配指定的条件。例如,确定星期几数组中“星期三”元素的索引值。实例:# 定义一个数组> days_of_week = [ "Mon", "Tues", "Wed", "Thu", "Fri", "Sat", "Sun" ]=> [ "Mon", "Tues", "Wed", "Thu", "Fri", "Sat", "Sun" ]> days_of_week.index("Wed")=> 2rindex 方法可用于查找数组中的最后一个匹配元素。实例:# 定义一个数组> days_of_week = ["today", "today", "today", "today", "today", "today", "today"]=> ["today", "today", "today", "today", "today", "today", "today"]# 返回首个匹配的索引> days_of_week.index("today")=> 0# 返回最后匹配的索引> days_of_week.rindex("today")=> 6
2.2.1 获取单个元素与变量的引用一样,数组可以获取单个位置的元素,利用 ${ARG[num]}。例如:[root@master scripts]# echo ${ARG1[0]} //获取AEG1数组中第一个元素1[root@master scripts]# echo ${ARG1[3]} //获取AEG1数组中第四个元素hello Shell2.2.2 获取全部元素获取数组值获取数组全部元素使用 ${ARG[*]} 或 ${ARG[@]}。例如:[root@master scripts]# echo ${ARG1[@]}1 2 3 hello Shell[root@master scripts]# echo ${ARG1[*]}1 2 3 hello Shell获取数组下标获取数组全部下标使用 ${!ARG[*]} 或 ${!ARG[@]}。例如:[root@master ~]# echo ${!ARG1[@]}0 1 2 3[root@master ~]# echo ${!ARG1[*]}0 1 2 32.2.3 获取数组长度获取整个数组长度数组长度及数组中元素的个数,可以利用 ${#ARG[*]} 或 ${#ARG[@]},我们发现其实就是在获取数组全部元素前添加#来获取数组个数。例如:[root@master scripts]# echo ${#ARG1[*]}4[root@master scripts]# echo ${#ARG1[@]}4获取单个元素的长度对于数组中的某个元我们也可以进行长度的获取,可以利用 ${#ARG1[num]}。例如:[root@master scripts]# echo ${ARG1[@]} 100 2 3 hello Shell 10[root@master scripts]# echo ${ARG1[3]} //获取第四个元素内容为:hello Shellhello Shell[root@master scripts]# echo ${#ARG1[3]} //获取四个元素长度为11112.2.4 数组元素的修改数组可以进行一些列对其元素的操作。修改对数组元素的修改,直接对单个元素修改即可,例如:[root@master scripts]# AEG1[0]=100[root@master scripts]# echo ${ARG1[@]}100 2 3 hello Shell增加对数组元素的增加,和修改一致,直接对单个位置元素增加即可,例如:[root@master scripts]# ARG1[10]=10[root@master scripts]# echo ${ARG1[@]}100 2 3 hello Shell 10[root@master scripts]# echo ${#ARG1[@]}5Tips:在此我们发现元素之前有 4 个元素,我们将下标 10 的元素赋值为 10,数组是按照从前往后顺序赋值的。删除删除数组可以使用 unset,unset ARG1[num] 可以删除对应下标的数组元素,如果不带下标则删除数组的全部元素,例如:[root@master scripts]# echo ${ARG1[@]} 100 3 hello Shell 10[root@master scripts]# unset ARG1[0] //删除下标为0的元素[root@master scripts]# echo ${ARG1[@]}3 hello Shell 10[root@master scripts]# unset ARG1 //删除整个数组元素[root@master scripts]# echo ${ARG1[@]}2.2.5 数组的切片和其他语言一样,可以对数组进行切片也称截取操作。可以通过 ${AEG1[@或*]:起始位置:长度} 对原数组进行切片,返回的为字符串,例如:[root@master scripts]# echo ${ARG1[@]}1 2 3 hello Shell[root@master scripts]# echo ${ARG1[@]:0:2} //从第1个元素往后2个元素进行切片1 22.2.6 数组的替换可以替换数组中的某一个元素,例如我们将 ARG1 数组中的第 1 个元素替换为 110。[root@master scripts]# echo ${ARG1[@]}1 2 3 hello Shell[root@master scripts]# echo ${ARG1[@]/1/110}110 2 3 hello Shell
我们先来了解 Znode 节点中由哪些元素组成,请看下图:我们可以看到,Znode 节点中由 4 种元素组成,接下来我们来分别介绍一下每个元素具体是什么。Znode 节点元素介绍:data : Znode 存储的数据信息,这里的数据指用户保存的数据;ACL : 对节点进行权限控制,记录了哪些用户或者哪些 IP 地址可以访问本节点;child : 当前节点的子节点引用,通过这个节点来找到它的子节点;stat : 包含 Znode 的各种元数据,比如事务 ID、版本号、时间戳、大小等 Znode 本身的数据。Tips: Znode 的 data 元素存储的信息最大不能超过 1MB 。太大的数据会影响 Zookeeper 的同步性能。在了解了 Znode 的元素组成,每个元素的具体作用之后,我们接下来学习 Znode 节点有哪些类型,以及他们的特点。
数组的元素可以通过结合[]方法引用相关元素的索引来访问。例如,要访问数组的第一个和第二个元素。实例:# 定义一个数组> days_of_week = [ "Mon", "Tues", "Wed", "Thu", "Fri", "Sat", "Sun" ]=> [ "Mon", "Tues", "Wed", "Thu", "Fri", "Sat", "Sun" ]> days_of_week[0]=> "Mon"> days_of_week[1]=> "Tues"或者使用at方法:实例:> days_of_week.at(0)=> "Mon"可以使用 Array 类的first和last方法访问首个和末尾元素。实例:> days_of_week.first=> "Mon"> days_of_week.last=> "Sun"
元组类型允许在元素类型后缀一个 ? 来说明元素是可选的:const list: [number, string?, boolean?]list = [10, 'Sherlock', true]list = [10, 'Sherlock']list = [10]代码解释: 可选元素必须在必选元素的后面,也就是如果一个元素后缀了 ?号,其后的所有元素都要后缀 ?号。
语法:数组名[下标],下标从0开始。有一个整型数组,引用其第一个元素,实例如下:514运行结果:数组arr中,第一个元素为:1注意,上面的数组下标最大为 2,也就是说,引用元素时,不能超过其下标最大值。下面是一个反例:public class OutOfIndexDemo { public static void main(String[] args) { int[] arr = {1, 2, 3}; // 引用arr的第四个元素: int element4 = arr[3]; }}由于数组中只有三个元素,但引用了索引为3的第四个元素,编译执行代码,会抛出如下异常:Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3 at OutOfIndexDemo.main(OutOfIndexDemo.java:5)
既然可以引用数组元素,就可以修改元素,实例如下:503运行结果:数组arr中,第二个元素为:4
这是 leetcode 上算法部分第 860 题,为简单编程题。题目描述如下:在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5 美元。注意:一开始你手头没有任何零钱。如果你能给每位顾客正确找零,返回 true ,否则返回 false 。示例1:输入:[5,5,5,10,20]输出:true解释:前 3 位顾客那里,我们按顺序收取 3 张 5 美元的钞票。第 4 位顾客那里,我们收取一张 10 美元的钞票,并返还 5 美元。第 5 位顾客那里,我们找还一张 10 美元的钞票和一张 5 美元的钞票。由于所有客户都得到了正确的找零,所以我们输出 true。示例2:输入:[5,5,10]输出:true示例3:输入:[10,10]输出:false示例4:输入:[5,5,10,10,20]输出:false解释:前 2 位顾客那里,我们按顺序收取 2 张 5 美元的钞票。对于接下来的 2 位顾客,我们收取一张 10 美元的钞票,然后返还 5 美元。对于最后一位顾客,我们无法退回 15 美元,因为我们现在只有两张 10 美元的钞票。由于不是每位顾客都得到了正确的找零,所以答案是 false。看到这题,没啥好说的。首先依次扫描收入的钞,此时会有如下三种情况:如果收到的是 5 元,直接放入 5 元列表中;如果收到的是 10 元,看看 5 元列表是否还有剩余;如果没有 5 元则无法找零,返回 False;否则找零 5 元,减少一个 5 元列表元素,增加1个10元列表的元素;对于收到的是 20 元,必须先找 10 元,然后剩下的再找 5 元;首先定义存放5元和10元的数组,20元不会用于找零,所以不用记录:remain_5 = []remain_10 = []根据上面思路,我们可以简单写以下收到5元和10元的逻辑:for i in range(len(bills)): # 假设遍历第i个钞票 if bills[i] == 5: # 5元钱,直接收入 remain_5.append(1) elif bills[i] == 10: # 对于10元找零,只需要找零5元即可 if not remain_5: # 没有5元,直接返回False return False # 减去一个5元 remain_5.pop() # 加上一个10元 remain_10.append(1) else: # 对于20元的处理 pass对于20元的处理,我们只需要定义一个找零数:res = 15。首先找零10元,如果有10元,则减去一个10元,同时剩余找零也要减去10:remain = 15# 如果有10元,先用一个10元if len(remain_10) >= 1: remain -= 10 remain_10.pop()接下来找5元,每找零一个5元,则5元数需要减一,同时剩余找零数也要减去5,,直到 remain_5 数组为空或者 remain<=0 结束:while len(remain_5) > 0 and remain > 0: remain -= 5 remain_5.pop()如果能找零,则 remain 最后应该为0,那么我们可以判断,如果剩余的 remain > 0,则表明最后无法找零;否则找零成功if remain > 0: return False在 20 元找零那里之所以能用贪心思想是因为找零的 15 元减去 10 元正好等于 5 元,如果我先找 5 元则会出现这样的情况:**剩余 2 个 5 元和 1 个 10 元,如果先找 5 元,则有 2 个 5 元,最后的 10 元无法完成找零。**最后整个处理柃檬水找零问题的 Python 方法如下:def lemonadeChange(bills): remain_5 = [] remain_10 = [] for i in range(len(bills)): if bills[i] == 5: # 5元钱,直接收入 remain_5.append(1) elif bills[i] == 10: # 10元找零5元 if not remain_5: return False remain_5.pop() remain_10.append(1) else: # 对于20元钱找零15元,贪心策略,尽可能找零10元,10元不够在找5元 remain = 15 # 如果有10元,先用一个10元 if len(remain_10) >= 1: remain -= 10 remain_10.pop() # 这里存在2种情况,上面找了10元,就剩下5元要找;没有10元,就会一直找5元 while len(remain_5) > 0 and remain > 0: remain -= 5 remain_5.pop() # 如果最后还没找完,且5元数组为空,则无法完成找零,直接返回False if remain > 0: return False # 走到这一步,可以返回True return True
首先我们还是新建一个空白的 HTML 文档。如图:(具体步骤这里同样不做赘述,同学们可以翻阅之前的慕课 WIKI 章节来自行学习。)我们新建一个DIV元素,点击插入,点击DIV,这里可能有同学会问到,为什么老师每次都是拿 DIV 元素作为讲解?在这里统一给大家做一个解答:首先,因为 DIV 作为一个常见元素,同学们都很熟悉,为了介绍知识的连贯性,尽量采用了同学们熟悉的元素来使用,从而达到为大家讲解知识的目的。其次,DIV 本身就是一个容器元素,因为它既能单独作为一个元素来使用,又可以容纳其他元素(子元素)。因此,基于上述两点考虑,我们在更多情况下采用 DIV 来讲解方便大家后续自己选择元素的时候能够更好的兼容。插入完 DIV 后,我们在其中填入一段文字,这里填入文字的目的,是为了更好地让大家识别到这个 DIV 的位置,出于同样的目的,还为这个元素添加了背景颜色,如图所示,我给文字添加了一个绿色的背景色。那么如何才能达到上述图片,让元素居中的效果呢?我们接下来在 CSS 设计器中源中点击加号,然后选择在页面中定义,然后在选择器中点击加号,关联我们刚刚新建的 DIV 元素。选择器准备好后,我们点击选择器,如图所示的 #moocwiki ,在弹出的属性面板中,我们找到 position 属性。改变属性的默认设置,达到居中的效果。到此,我们就完成了元素居中的设置,应用类似方法,我们可以设置几乎所有的 HTML 页面元素。
一维数组的元素访问非常简单,和 Python 列表规则基本差不多。对单一元素的访问,索引遵循从 0 开始,依次递增 1。案例例如,对于创建的一维数组,我们访问第5个元素对象:arr = np.arange(10)arrOut: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])arr[4]Out: 4也可以用负数从末位开始对数组反向索引,例如-1表示末位元素:arr[-1]Out: 9
Unsafe 操作数组元素主要有如下两个方法:public native int arrayBaseOffset(Class arrayClass):返回数组类型的第一个元素的偏移地址 (基础偏移地址);public native int arrayIndexScale(Class arrayClass):返回数组中元素与元素之间的偏移地址的增量,配合 arrayBaseOffset () 使用就可以定位到任何一个元素的地址。实例:import sun.misc.Unsafe;import java.lang.reflect.Field;public class DemoTest { private static String[] names = {"多线程", "Java", "并发编程"}; public static void main(String[] args) { Unsafe unsafe = getUnsafe(); try { Class<?> a = String[].class; int base = unsafe.arrayBaseOffset(a); int scale = unsafe.arrayIndexScale(a); // base + i * scale 即为字符串数组下标 i 在对象的内存中的偏移地址 System.out.println(unsafe.getObject(names, (long) base + 2 * scale)); } catch (Exception e) { e.printStackTrace(); } } public static Unsafe getUnsafe() { Unsafe unsafe = null; try { Field field = Unsafe.class.getDeclaredField("theUnsafe"); field.setAccessible(true); unsafe = (Unsafe) field.get(null); } catch (Exception e) { e.printStackTrace(); } return unsafe; }}结果验证:并发编程通过对数组的元素的地址进行内存偏移,最后得到的结果为最后一个元素,并发编程。base + 2 * scale 表示字符串数组下标 i 在对象的内存中的偏移地址,偏移两个元素,得到最后一个元素。
分析:某个DOM和某个类名可以说明有两个未知量,可以设计成两个参数。根据描述也可以确定一个 某个DOM 的类型是个 DOM 对象,某个类名是个字符串只要拿到这个DOM的 class 属性,判断里面是不是含有这个类型即可得到结果function hasClass(el, className) { // el 是 element的缩写,表示一个dom元素 // 如果没有元素 则返回 if (!el) { return false; } // 根据空格分割成数组 // 可以不使用 split 方法,使用字符串也可以用indexOf匹配 var classList = el.className.split(' '); // 判断是否存在 if (classList.indexOf(className) >= 0) { return true; } return false;}
关于匹配与查找的终止操作,有下面几个常用方法:allMatch(Predicate p):检查是否匹配所有元素;anyMatch(Predicate p):检查是否至少匹配一个元素;noneMatch(Predicate p):检查是否没有匹配所有元素;findFirst():返回第一个元素;findAny():返回当前流中的任意元素;count():返回流中元素总数;max(Comparator c):返回流中最大值;min(Comparator c):返回流中最小值;forEach(Consumer c):内部迭代(使用 Collection 接口需要用户去做迭代,称为外部迭代;相反 Stream API使用内部迭代)。如下实例,演示了几个匹配元素相关方法的使用:1260运行结果:[10, 12, 9, 8, 20, 1]列表中所有的元素都大于0[10, 12, 9, 8, 20, 1]列表中至少存在一个的元素都大于等于20[10, 12, 9, 8, 20, 1]列表中不存在大于100的元素查找元素的相关方法使用实例如下:1261运行结果:[10, 12, 9, 8, 20, 1]列表中第一个元素为:Optional[10]列表中任意元素:Optional[10][10, 12, 9, 8, 20, 1]列表中元素总数为6[10, 12, 9, 8, 20, 1]列表中最大值为Optional[20][10, 12, 9, 8, 20, 1]列表中最小值为Optional[1]实例中,我们观察到findFirst()、findAny()、max()等方法的返回值类型为Optional类型,关于这个Optional类,我们将在下一小节具体介绍。
当我们要一组 class 同名,或者连续的一组元素的其中一个,或者某种规律的元素添加单独样式的时候,不妨看看这类的元素选择器。
有三个参数时,第三个参数是替换结束的位置,不包括结束的位置。['a', 'b', 'c'].fill(4, 1, 2); // ["a", 4, "c"]['a', 'b', 'c'].fill(4, -3, -2); // [4, "b", "c"]['a', 'b', 'c'].fill(4, -3, 1); // [4, "b", "c"]['a', 'b', 'c'].fill(4, -2, 1); // ["a", "b", "c"]上面的代码中,通过上面的示例我们可以总结一点就是,找到起始位置的元素和结束位置的元素,如果它们中间有值则把中间的值替换,起始位置的索引必须小于结束位置的索引,如果没有则不会被替换。如:第 2 行中 -3 的位置是 “a”,-2 的位置是 “b”,在数组中 “a” 和 “b” 直接没有值,但是包含起始的 “a” 所以 “a” 会被替换。第 4 行中第二个参数 -2 位置元素是 “b” 索引是 1,第三个参数 1 位置的元素是 “a” 索引是 0,起始位置的索引大于结束位置的索引,所以数组中没有符合替换的元素。
以此类推,对于 n 个元素的排序,在第 n-1 轮迭代后,我们的排序工作就结束了,此时的数组正是从小到大依次排列好。下面我们用一幅图对冒泡排序算法进行说明,如下:冒泡排序第一轮迭代在第一轮迭代完成后,全局的最大值便落到了最后位置。接下来的第二轮迭代中,我们就不会再比较这个位置,而是相邻比较到倒数第二个位置结束;接下来第三轮迭代是比较到倒数第三个位置结束;以此类推,直到最后一轮迭代只剩下一个元素即可,此时得到的排列顺序正是从小到大的有序排序。下面给出第二轮迭代示意图,其余迭代过程依次类推:冒泡排序第二轮迭代过程在经过 n-1 轮迭代后,最后得到的结果就是我们想要的从小到大的排序顺序:2,3,6,7,8,10,11,12如果你还是不明白冒泡排序的原理的话,可以看下面的动态图:冒泡排序原理动态演示图冒泡排序的思想就是这样:通过一轮相邻元素的比较,将最大值找到并交换到最后的位置,第二轮找到第二大的值,放到倒数第二个位置,直到最后一轮迭代,找到第二小的值,放到第二个位置上,最小值此时就在第一个位置上。接下来我们就开始完成该算法的 Python 编程。
众所周知,无论你是编辑过 word 文档的同学,还是写过论文的同学都应该知道,居中是一个很好用的工具,它会让你的整个文档中的内容看起来特别顺眼。一样地,我们网页设计中让我们的网页元素能够居中,也是为了用户在访问我们的网站的时候,能够更加清楚地识别到我们想要表达的信息。试想一下,如果网页中的文字或者图片摆放的左左右右,十分奇怪,又指望哪些人能喜欢我们制作的网页呢?
网页是由一个一个的区域组成,就像房子中的房间一样,每个区域内可以放置 HTML 元素,然后可以对区域设置样式从而将其与别的区域区分开来。这个区域在 HTML 中由结构元素实现,又可以将其称之为容器元素。通过搭配 ID 属性使用,结构元素将会帮助我们构建结构化条理分明的网站逻辑。本章我们介绍一下 结构元素的使用方式和场景。
Tips:类组成元素属于扩展内容,此处有一个整体认识即可。随着面向对象的深入学习,知识点都会涵盖。刚刚我们通过对现实生活中慕课网学生的分析,抽象出了慕课网学生类,并在类中定义了一些属性和方法。那么除了属性和方法,类中还可以有什么其他元素呢?下面我们来详细介绍,每个类都可以由以下元素组成:成员属性:也称为字段,成员变量或实例变量,属性是用以保存每个对象的数据的变量,例如每个慕课网学生都可能有昵称、性别等。每个对象之间的属性相互独立,互不干扰;成员方法:也称实例方法,成员方法是对对象执行的操作,例如,一个慕课网学生有一种方法来进行发表评论;静态变量:也称为类属性,它是同一个类的任何对象所共有的。例如,一个慕课网学生类中的最后一个被添加的学生 ID,可以用静态变量标记。 一个类不管被实例化了多少对象,每个静态变量在类中仅存在一次;静态方法:也称为类方法,静态方法是不影响特定对象的方法;内部类:可以将一个类包含在另一个类中,常用于该类仅提供给声明它的类使用的情况;构造方法:生成新对象的特殊方法;参数化类型:可以在定义期间将参数化类型分配给类。 参数化类型将替换为在类实例化时指定的类型。 它由编译器完成。 它类似于 C 语言宏#define 语句,其中预处理器评估宏。
把元素插进红黑树的第一步是找到要插入的位置。寻找位置的方法其实也比较简单:① 如果是空树,直接插入到跟节点;② 如果与当前节点的 key 值相等,则更新当前节点的 value 值;③ 如果比当前节点的 key 值大,则继续寻找当前节点的右子节点;④ 如果比当前节点的 key 值小,则继续寻找当前节点的左子节点;⑤ 如果当前节点为 null(或 nil 节点),则插入在当前节点的父节点下。
Ruby 中的数组可以视为“后进先出”堆栈。当我们想要将新元素放到数组中,它会被插入到最后一个。我们使用push方法。实例:colors = ["red", "green", "blue"]=> ["red", "green", "blue"]colors.push "indigo"=> ["red", "green", "blue", "indigo"]colors.push "violet"=> ["red", "green", "blue", "indigo", "violet"]我们使用pop方法从数组移出元素,数组会从最后一个元素开始移出。pop的返回值是被移出的元素。实例:colors.pop=> "violet"colors.pop=> "indigo"
null我们可以使用可变参数列表声明方法的参数。可变参数列表的语法:参数类型... 参数名我们可以结合可变参数来实现一个求和方法sum,请阅读下面实例:522运行结果:sum=1sum=5sum=18上述实例中,在主方法中给sum方法传参时,可选择一个或多个参数传递。方法体内对可变参数n进行迭代,也可以将可变参数n改为数组:int[] n,得到的效果是相同的。当方法的参数列表有两个或两个以上参数时,可变参数一定要放在最后,请查看如下实例:public void search(int element, int... elements) { boolean existed = false; for (int e: elements) { if (e == element) { existed = true; break; } } if (existed) { System.out.println("找到元素:" + element); } else { System.out.println("未找到元素:" + element); }}另外,也可以将数组传递给可变参数列表,例如,在主方法中调用上面的search方法:524运行结果:找到元素:2找到元素:2上述两种传参方式都是合法的。
在本部分我将以图文并茂的方式介绍在 Swagger-UI 界面上的基本元素,这些基本元素在界面的不同区域,是界面的基本组成元素。我将按照 Swagger-UI 界面基本元素所处的不同区域依次介绍每个基本元素的含义和作用,下面我们都来看看有哪些基本元素以及他们所发挥的作用吧!在配置好 Swagger 之后,我们在浏览器地址栏中输入项目中 Swagger-UI 界面的路径即可看到如上图所示的界面,这就是 Swagger-UI 的核心界面,也是我们使用最多的界面,项目中所有的接口都会在该界面上显示。我们从上到下,依次进行介绍:
index(item) 方法在元组中查找指定元素 item,如果找到元素 item,则返回元素 item 的索引;如果找不到,则抛出异常。示例如下:>>> x = ('www', 'imooc', 'com')>>> x.index('imooc')1>>> x.index('mooc')Traceback (most recent call last): File "<stdin>", line 1, in <module>ValueError: 'mooc' is not in tuple在第 2 行,在元组中使用 index 方法查找元素 ‘imooc’在第 3 行,显示元素 ‘imooc’ 在元组中的索引是 1在第 4 行,在元组中使用 index 方法查找元素 ‘mooc’在第 5 行,因为元组中没有包含元素 ‘mooc’,显示错误 “ValueError: ‘mooc’ is not in tuple”
声明一个由 string 和 number 构成的元组:const list: [string, number] = ['Sherlock', 1887] // okconst list1: [string, number] = [1887, 'Sherlock'] // error代码解释: 元组中规定的元素类型顺序必须是完全对照的,而且不能多、不能少,list1 中定义的第一个元素为 string类型,不能赋值为 number类型的数据。当赋值或访问一个已知索引的元素时,会得到正确的类型:const list: [string, number] = ['Sherlock', 1887]list[0].substr(1) // oklist[1].substr(1) // Property 'substr' does not exist on type 'number'.代码解释:第 3 行,list[0] 是一个字符串类型,拥有 substr() 方法。第 4 行,list[1] 是一个数字类型,没有 substr() 方法,所以报错。要注意元组的越界问题,虽然可以越界添加元素(不建议),但是不可越界访问:const list: [string, number] = ['Sherlock', 1887]list.push('hello world')console.log(list) // ok [ 'Sherlock', 1887, 'hello world' ]console.log(list[2]) // Tuple type '[string, number]' of length '2' has no element at index '2'代码解释:第 2 行,向一个声明了只有两个元素的元组继续添加元素,这种操作虽然可行,但是严重不建议!第 5 行,该元组只有两个元素,不可越界访问第三个元素。
index(item) 方法在列表中查找指定元素 item,如果找到元素 item,则返回元素 item 的索引;如果找不到,则抛出异常。示例如下:>>> x = ['www', 'imooc', 'com']>>> x.index('imooc')1>>> x.index('mooc')Traceback (most recent call last): File "<stdin>", line 1, in <module>ValueError: 'mooc' is not in list在第 2 行,在列表中使用 index 方法查找元素 ‘imooc’在第 3 行,显示元素 ‘imooc’ 在列表中的索引是 1在第 4 行,在列表中使用 index 方法查找元素 ‘mooc’在第 5 行,因为列表中没有包含元素 ‘mooc’,显示错误 “ValueError: ‘mooc’ is not in list”
首先,基于我们之前熟悉的 Dreamweaver CC 2018 操作可以知道,要改变网页元素的属性,基本上都是通过 CSS 设计器来完成的。因为 CSS 设计器中提供了丰富的属性,而且可以非常轻松地展现在我们面前。并且交互方式十分直接,直接去属性的名字上双击就可以编辑或者更改相关的属性。同理地,背景也是一种页面元素的属性。我们可以十分轻松地通过 Dreamweaver CC 2018 的相关操作,对其进行设置。下面是我们的一个操作步骤:第一步:我们新建一个网页文件,比如HTML文件,新建文件的操作在这里就不做过多的赘述了。因为我们在之前的章节中有详细讲解过。通过多个小节的练习,想必对于大家已经不是什么问题了。第二步:我们创建一个DIV,具体操作和上一节知识点中的类似操作一致。首先我们在 CSS 设计器左侧的插入选项中选择 DIV 。然后我们设置 DIV 的 id 或者 class 属性值。设置二者的目的只有一个:就是为了让 CSS 选择器能够找到这个元素。只有 CSS 选择器能够通过我们设置的标志找到页面元素,才有可能对其元素属性进行编辑或者更改。比如可以给新建立的元素的 ID 设置为 wikitest 。如图所示:第三步:我们在 CSS 设计器中找到我们刚刚创建的这个元素。在选择器面板中点击这个元素的名字 wikitest 。我们可以看到属性面板很自然的就弹了出来。在属性面板中,我们滑动鼠标的滚轮,一直往下滑。你会看到一个背景的汉字。在它的的下面是一个英文单词–background-color,这个就是网页的背景颜色设置属性。我们通过点击其后面的小正方形,就可以以可视的方式来选择你想要设置的网页背景颜色。
元组是一个有序的序列,元组中所有的元素放在 () 中间,并用逗号分开,例如:(1, 2, 3),一个包含 3 个整数的元组(‘a’, ‘b’, ‘c’),一个包含 3 个字符串的元组元组中的元素是顺序排列的,可以通过索引访问元组的元素,例如:>>> tuple = (1, 2, 3)>>> tuple[0]1>>> tuple[1]2>>> tuple[2]3在第 1 行,创建了一个元组。在第 2 行,通过 tuple[0],访问元组的第 0 个元素,元组的下标从 0 开始。在第 4 行,通过 tuple[1],访问元组的第 1 个元素。在第 6 行,通过 tuple[2],访问元组的第 2 个元素。元组与列表的区别在于:列表创建后可以修改,元组创建后不可以修改。下面的程序首先创建列表 [1, 2, 3],然后修改的第 0 项元素,程序输出表明修改成功了。>>> list = [1, 2, 3]>>> list[0] = 11>>> list[11, 2, 3]下面的程序首先创建元组 (1, 2, 3),然后修改的第 0 项元素,程序输出表明修改失败了。在第 6 行打印输出 tuple,发现 tuple 没有发送变化。>>> tuple = (1, 2, 3)>>> tuple[0] = 11Traceback (most recent call last): File "<stdin>", line 1, in <module>TypeError: 'tuple' object does not support item assignment>>> tuple(1, 2, 3)
/* 第1、4、7个子元素 */li:nth-child(3n+1) { xxx: xxx;}/* 前三个子元素 */li:first-child, li:nth-child(2), li:nth-child(3) { xxx: xxx;}
可以通过指定起点和要提取的元素数来提取数组元素的子集。例如,从元素1开始并读取3个元素:实例:# 定义一个数组> days_of_week = [ "Mon", "Tues", "Wed", "Thu", "Fri", "Sat", "Sun" ]=> [ "Mon", "Tues", "Wed", "Thu", "Fri", "Sat", "Sun" ]> days_of_week[1, 3]=> ["Tues", "Wed", "Thu"]同样,我们可以指定一个范围(请参考 Ruby的范围章节)。实例:> days_of_week[1..3]=> ["Tues", "Wed", "Thu"]或者,可以使用 Array 类的slice方法。实例:> days_of_week.slice(1..3)=> ["Tues", "Wed", "Thu"]