-
1、函数的优点:(1)复用代码(2)隐藏实现细节(3)提高可维护性(4)提高可读性便于调试2、函数的创建:def 函数名([输入参数])函数体[return xxx]3、函数的参数传递:(1)函数调用时的参数传递:位置实参:根据形参对应的位置进行实参传递,位置对应例如def fuc1(a,b),调用时fuc1(10,20)关键字实参:根据形参名称进行实参传递,例如def fuc1(a,b),调用时fuc1(b=10,a=20)(2)如果是不可变对象,在函数体内的修改不会影响实参的值如果是可变对象,在函数体内的修改会影响实参的值4、函数的返回值:(1)函数返回多个值时,结果为元组(2)函数返回一个值时,结果为原值(3)函数没有返回值时,省略return5、函数的参数定义:(1)函数定义默认值参数:函数定义时,给形参设置默认值,只有与默认值不符的时候才需要传递实参。只传一个参数,未被定义的参数未默认值。默认值参数注意一定要放在其他需要传递实参的形参最后。(2)个数可变的位置参数:使用*定义,结果为一个元组,例如def fun1(*args)个数可变的关键字形参:使用**定义,结果为一个字典,例如def fun1(**args)如果要让函数接受不同类型的实参,必须在函数定义中将接纳任意数量实参的形参放在最后。 Python先匹配位置实参和关键字实参,再将余下的实参都收集到最后一个形参中。
-
基本四则与算符+ - * / %注意事项:1、0不能作为除数;2、%表示取余,不仅可以对int求模,也可对double求模;增量赋值运算符又叫复合运算符,会自动进行类型转换;+= -= /= *= %=自增自减运算符自增或自减符号在前先自增或自减再参他运算;自增或自减符号在后先参与运算再自增或自减;如果自增自减符号在前则取的返回值是自增或自减之后的返回值,反之则取原返回值;++ --
-
Lua分为主要三类运算符,分别是算术运算符,关系运算符,逻辑运算符,还有特殊运算符。1、算术运算符有: + (加) -(减) *(乘) /(除) %(取模) ^(求幂) -(符号)来看一个例子:test6.luanum1 = 4 ;num2 = 2 ;print(num1+num2);print(num1-num2);print(num1*num2);print(num1/num2);print(num1%num2);print(num1^num2);print(-num1);解释运行:lua test6.lua结果:6282.0016.0-42、关系运算符有: ==(等于) ~=(不等于) >(大于) <(小于) >=(大于等于) <=(小于等于)当比较结果成立返回true,否则返回false来看一个例子: test6.luanum = 1 ;num1 = 1;num2 = 2;num3 = 3; num4 = 4;num5 = 5;num6 = 6;ret = num1 == num2 ;print(ret);ret = num1 ~= num2 ; print(ret);ret = num3 > num2 ;print(ret);ret = num4 < num3 ; print(ret);ret = num5 >= num6 ;print(ret);ret = num1 <= num ;print(ret);解释运行:lua test6.lua结果:falsetruetruefalsefalsetrue3、逻辑运算符有: and(逻辑与) or(逻辑或) not(逻辑非)假设有A和B,如果A and B, 为真返回A,为假返回B 假设有A和B ,如果A or B , 为真返回A ,为假返回B假设有A和B ,如果 not A , 为真返回true ,为假返回false来看一个例子:test6.luanum1 = 100 ;num2 = 200 ;num3 = 0 ;ret = num1 and num3 ; print(ret);ret = num1 or num3 ; print(ret);ret = not num1 ;print(ret);ret = not(num1 and num2);print(ret);解释运行:lua test6.lua结果:0100falsefalse4、特殊运算符 .. 表示连接两个字符串 #表示返回字符串或者表的长度(注意,这里的长度不包括'\0')案例: test6.lua解释运行: lua test6.lua--定义两个字符串str1 = "Hello";str2 = "World";--连接两个字符串ret = str1..str2;print(ret);--获取连接后的字符串的长度str_length = #ret ;print(str_length);结果:HelloWorld10当然,lua的运算符也是有优先级的,优先级从高到底的顺序为:^ not -(负号) * / + - .. < > <= >= ~= == and or
-
上一章: 一.准备出发 二.编程基础 三. 数字类型的数据1.Python中的数据类型 python中有6种主要的内置数据类型:数字、字符串、列表、元组、集合和字典。 *列表、元组、集合和字典都是容器类型,只不过容器之间的内部结构不同。 不同的数据类型在计算机内部存储时会有所不同。不同的数据类型有时候不兼容,需要进行类型转换才可以计算,相同的数据类型是可以进行计算的2. 数字类型 有4种数字类型:整数类型、浮点类型、复数类型和布尔类型。 (1)整数类型为int类,表示的是不带小数的数字。有四种进制表示方式,分别是十进制、二进制、八进制和十六进制。 (2)浮点类型为float类,有两种表示方式,一是小数,二是科学技术法。 (3)复数类型为complex类。 在计算机中被表示为a+bj,其中a称为实部,b称为虚部,j称为虚数单位。 两个复数可以进行相加,实部和实部相加,虚部和虚部相加,形成新的复数。 (4)布尔类型为bool类,只有两个值:True和False 布尔类型属于整数类型,或说布尔类型是整数类型的一个子类。 Python任何类型的数据都可以通过bool()函数转换为布尔值,那些“没有的”、“空的”值会被转换成False,反之转换为True。3. 数字类型的相互转换 两种:隐式类型转换(自动转换)、显式类型转换(非自动) 比如,使用布尔类型的函数转换就是显式类型转换 <1>隐式类型的装换 看一个例子 <2>显式类型的装换 除复数外,三种数字类型如整数、浮点和布尔都有自己的转换函数,分别是int()、float()、和bool()函数 四.运算符1.算术运算符 主要是针对数字类型的运算,但是有些运算符也可以用于字符串以及列表类型的运算。 *注意除和地板除法区别,除结果为float类型,地板除法结果为整数类型。注意下述例子中负数的地板除,注意True的大小写,注意True被当作整数1参与运算。2.比较运算符 也称为关系运算符,结果为布尔值,即True或False 注意下方例子中浮点数与整数都可以进行比较3.逻辑运算符 “逻辑与”与“逻辑或”具有短路特征 注意下方例子,在不进行短路计算,结果不确定时,f1()函数会被调用。而在进行短路计算,有确定结果时,f1()函数不会被调用。【def f1(): #定义一个函数,冒号后为函数内容】5.位运算符 在计算机中,数据按照字节进行存放,1个字节为8位二进制数,此8位二进制数可以按位进行计算。 (1) ~ 取反 ,二进制数,不是0就是1,0取反就是1,1取反就是0。但!错啦!具体运算比较复杂,涉及到原码、补码、反码的问题。 公式:~a = (a + 1) x -1 ,比如下面例子中a十进制数9,则~a为-10,如a十进制数为-9,则~a为10 ❶ 所以,你知道正负数的原码、补码、反码分别如何计算吗?❷你知道在上述9和-10的例子中,按位取反具体是如何运算的吗? 【请耐心阅读,文末为大家解答哦~】 (2) & :如果两个位都为1的情况下,结果为1,只要一个为0,结果就位0 (3) | :只有一个为1的情况下,结果就为1 (4) ^ :如果一个是0,一个是1,结果就是1;如果都是为1,或者都是为0,结果为0 (5)>>右移:按二进制形式把所有的数字向右移动对应的位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1 如 00001010>>2=00000010; 10001010>>3=11110001 右移一位相当于除2,右移n位相当于除以2的n次方。这里是取商哈,余数就不要了。 (6)<< 左移:按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。 要求右操作数必须是非负值,在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。 若a=15,即二进制数00001111,左移2位得00111100,没有1溢出,则左移两位相当于15乘2^2,15<< 2=60,即乘了4,即十进制数60。以下是左移两位溢出的高位中包含1的情况,64<<2为256。127<<2为5086.赋值运算符7.运算符的优先级———————————————————————————————————今天的学习就到这里,一起来看下帖中的2个问题。❶ 问:你知道正负数的原码、补码、反码分别如何计算吗?首选请注意分清下概念:取反:逻辑非“!”,逻辑取反, false变true,true变false,在C中,只要不是0就是真,所以!5值是0反码:正数的反码是其本身,对于负数其符号位不变其它各位取反(0变1,1变0)按位取反(~): 按位取反1变0,0变1。好了,现在解决问题疑问,请看机器数、真值、原码、反码、补码的相关定义1、机器数一个数在计算机中的二进制表示形式,叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号,正数为0,负数为1.比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011 。那么,这里的 00000011 和 10000011 就是机器数。2、真值机器数的第一位是符号位,后边才是真正的数值,所以机器数的形式值就不等于真正的数值。例如上面的有符号数10000011,其最高位1代表负,其真正数值是 -3 而不是形式值131(10000011转换成十进制等于131)。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。例:0000 0001的真值 = +000 0001 = +11000 0001的真值 = –000 0001 = –13. 原码原码就是符号位加上真值的绝对值,即用第一位表示符号,其余位表示值。比如如果是8位二进制:[+1](原码) = 0000 0001[-1](原码) = 1000 0001第一位是符号位。因为第一位是符号位,所以8位二进制数的取值范围就是:[1111 1111 , 0111 1111]。即[-127 , 127]原码是人脑最容易理解和计算的表示方式。4. 反码反码的表示方法是: 正数的反码是其本身,负数的反码是在其原码的基础上,符号位不变,其余各个位取反。[+1] = [00000001](原码)= [00000001](反码)[-1] = [10000001](原码)= [11111110](反码)可见如果一个反码表示的是负数,人脑无法直观的看出来它的数值。通常要将其转换成原码再计算。5. 补码补码的表示方法是:正数的补码就是其本身,负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后+1 (即在反码的基础上+1)。[+1] = [00000001](原码) = [00000001](反码) = [00000001](补码)[-1] = [10000001](原码) = [11111110](反码) = [11111111](补码)对于负数,补码表示方式也是人脑无法直观看出其数值的。通常也需要转换成原码在计算其数值。❷你知道在上述例子中,按位取反具体是如何运算的吗?如何得到9按位取反为-10,10按位取反为-9的?(1)正数9按位取反——>(~9),计算步骤如下:正数原码=反码=补码所以9的原码/反码/补码: 0000 1001对补码取反 1111 0110(符号位一起取反)对其取反码: 1000 1001(符号位不变)取补码: 1000 1010(反码+1)最终结果 1000 1010,即-10(2)负数-10按位取反——>(~10)正数原码=反码=补码-10 原码:1000 1010-10反码: 1111 0101(符号位不变)-10补码: 1111 0110(反码+1)补码取反:0000 1001(符号位一起取反)正好得到一个整数,正数原码、反码、补码都一样所以最后结果 0000 1001,二进制为-9特殊:0按位取反,即(~0)为-1总结:按位取反公式:~a = (a + 1) x -1下一章:...
-
如果构造函数只接受一个实参,则它实际上定义了转换为此类类型的隐式转换机制。这种构造函数又叫转换构造函数(converting constructor)。能通过一个实参调用的构造函数定义了一条从构造函数的参数类型向类类型隐式转换的规则。只允许 一步类类型转换抑制构造函数定义的隐式转换将构造函数声明为 explicit加以阻止explicit关键字只允许出现在类内的构造函数声明处(只对一个实参的构造函数有效)explicit构造函数只能用于直接初始化,不能将explicit构造函数用于拷贝形式的初始化过程。Sales_data item1(null_book); //正确,直接初始化Sales_data item2 = null_book; //错误:不能将 explicit 构造函数用于拷贝形式的初始化过程尽管编译器不会将explicit的构造函数用于隐式转换过程,但是我们可以使用这样的构造函数 显式地强制进行转换。
-
 # 是什么 托互联网的福,你每天都在接收大量信息,不仅有搞笑视频,美女跳舞,也有丰富的教育资源。 不得不说,在你站在学习这个十字路口,看到如此多的方向时,这些反而使你更加迷茫,因为你不清楚,也没有人曾告诉你,哪条路可能使你步履艰难、越陷越深,那条路是阳关大道让你冲出重围,乘风破浪。不过有一点你是十分清楚的,人类的精力和时间都是有限的,选择一个适合自己的学习方法往往事半功倍...... 正如五年前的我,站在这个十字路口,踌躇满志却很迷茫,不知道哪些技能职场更需要......如果可能,我真想穿越时空,对这个懵懂青年说,来!往这走!不骗你。可无论我怎么努力,这个青年肯定是听不见的。不过,你可以...... 教学内容采用 **“是什么”** ,**“能做什么”** ,**“举例”** 三个模块进行教学,不仅记录了从CV小子到世界500强的经验,同时也把自己的编程经验和理解融入到系列教程中,让你在吸收知识的同时,还能感受到知识的美味。我觉得,当下世态,能看进去一板一眼文字教学的人并不多,所以我决定尽量**减小教学篇幅,把更多的文字留给对单次教学的思维拓展**。最后,希望我们永远持以一颗初学者的心去学习,力争成为一名超级个体。 教学计划(试行):**百炼成仙 · Python** # 能做什么 导学篇,用来介绍这个任重而道远的连载项目
-
分割是识别图像内一个或多个对象的位置的过程。我们要介绍的技术其实非常简单,它利用了形态算子的扩张和侵蚀,以及诸如开运算,闭运算和黑帽算子的组合。01.简介安装Anaconda后,让我们从Anaconda的提示符下使用以下命令转到OpenCV安装:conda install -c https://conda.anaconda.org/menpo opencv现在,让我们从Anaconda启动器启动Spyder IDE。Anaconda启动器一旦运行了Spyder,建议验证OpenCV安装是否成功。在Python控制台的右下角,我们进行以下测试:import cv2代码讲解我们已经创建了一个启动GitHub存储库。小伙伴可以使用以下方法直接克隆它:git clone --branch step1 https://github.com/lucapiccinelli/BarcodesTutorial.git现在,我们将要下载测试图像,并对他们进行读取和显示。import cv2 import matplotlib.pyplot as plt im = cv2.imread(r’img\barcodes.jpg’, cv2.IMREAD_GRAYSCALE) plt.imshow(im, cmap=’Greys_r’)接下来,我们将对图像进行二值化处理,这样可以通过阈值的设定来提取出我们感兴趣的部分。使用黑帽运算符,我们可以增加较暗的图像元素。我们可以首先使用简单的全局阈值安全地对图像进行二值化处理。黑帽运算符使我们可以使用非常低的阈值,而不必过多地关注噪声。在应用blackhat时,我们使用的内核会更加重视垂直图像元素。内核具有固定的大小,因此可以缩放图像,这也可以提高性能(并支持某种输入归一化)。黑帽+阈值处理它遵循其他形态运算符的采用,顺序地将它们组合在一起以获得条形码位置中的连接组件。#riscalatura dell'immagine scale = 800.0 / im.shape[1] im = cv2.resize(im, (int(im.shape[1] * scale), int(im.shape[0] * scale))) #blackhat kernel = np.ones((1, 3), np.uint8) im = cv2.morphologyEx(im, cv2.MORPH_BLACKHAT, kernel, anchor=(1, 0)) #sogliatura thresh, im = cv2.threshold(im, 10, 255, cv2.THRESH_BINARY)膨胀和闭合的这种组合在测试图像上效果很好,但可能无法在其他图像上达到相同的效果。这没有关系,大家可以尝试改变参数和运算符的组合,直到对结果满意为止。膨胀+闭运算最后的预处理步骤是应用具有很大内核的开运算符,以删除太少而无法适合条形码形状的元素。kernel = np.ones((21, 35), np.uint8) im = cv2.morphologyEx(im, cv2.MORPH_OPEN, kernel, iterations=1)这是我们希望得到的最终结果:使用35x21内核打开现在,我们可以运行连接的组件的检测算法,并检索带有坐标和尺寸的条形码矩形。如大家在上一张图像中所看到的那样,最后的形态学步骤并未滤除全部的噪声。但是,在这种情况下,将它们过滤掉非常简单,以矩形区域值作为阈值就可以了。#rilettura dell'immagine, stavolta a colori im_out = cv2.imread(r'img\barcodes.jpg') #estrazione dei componenti connessi contours, hierarchy = cv2.findContours(im, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) unscale = 1.0 / scale if contours != None: for contour in contours: # se l'area non è grande a sufficienza la salto if cv2.contourArea(contour) <= 2000: continue #estraggo il rettangolo di area minima (in formato (centro_x, centro_y), (width, height), angolo) rect = cv2.minAreaRect(contour) #l'effetto della riscalatura iniziale deve essere eliminato dalle coordinate rilevate rect = \ ((int(rect[0][0] * unscale), int(rect[0][1] * unscale)), \ (int(rect[1][0] * unscale), int(rect[1][1] * unscale)), \ rect[2]) #disegno il tutto sull'immagine originale box = np.int0(cv2.cv.BoxPoints(rect)) cv2.drawContours(im_out, [box], 0, (0, 255, 0), thickness = 2) plt.imshow(im_out) #scrittura dell' immagine finale cv2.imwrite(r'img\out.png', im_out)最后,在上面的代码中,我使用提取的矩形绘制它们,并将其覆盖在原始图像上。最终结果,条形码以绿色框突出显示。结论• 提出的技术非常简单有效,但存在一些令人讨厌的缺点:• 它对条形码偏斜非常敏感;它可以很好地工作到大约45度,然后您必须执行第二遍,修改内核的方向。• 它只能在固定尺寸范围内找到条形码。• 尽管对矩形区域施加了过滤,但仍有可能无法清除某些非条形码。第一个和第二个可能不是真正的问题,但是最后一个可能会花费大家大量时间来尝试解码非条形码的内容。一个很好的解决方案是将条形码特征(图像梯度,傅立叶变换)输入给神经网络(或一些其他一些分类器),并在第二时刻过滤掉噪声。
-
封装封装是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。继承继承是让某个类获得另一个类的属性和方法。它可以使用现有类的除了私有以外的所有功能,不需要重新编写原来的类的情况下对这些功能进行扩展。多态多态是一个类实例的相同方法在不同情形有不同表现形式,多态机制使具有不同内部结构的对象可以共享相同的外部接口。
-
什么是设计模式?每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动。从面向对象谈起底层思维语言构造编译转换内存模型运行时机制抽象思维面向对象组件封装设计模式架构模式为什么要用设计模式因为软件使用者的需求、技术平台等等都在不断的变化,导致软件要随之变化,最后使得软件的内部结构越来越复杂。而设计模式就是为了解决软件的复杂性而诞生的。如何解决复杂性分解将大问题分解成多个小问题,将复杂问题分解为多个简单问题抽象由于不能掌握全部的复杂对象,我们选择忽视它的非本质细节,而去处理泛化和理想化的对象模型(即设计模式)解析:将具有相同属性的函数从代码中剥离出来,编程一个一个类,他们都继承一个具有相同属性的抽象函数,这个继承结构利用面向对象的多态性,使得主程序在使用时,可以用比之前简短的代码实现一个功能(有多少个子类就有多少种功能,根据需求选择调用哪一种),而且当此功能需要优化时,不需要更改主程序的代码,只需要找到调用的子类,对其进行修改即可,这种方法优异之处在复杂的项目中体现的淋漓尽致。软件设计的金科玉律:复用!重新认识面向对象理解隔离变化从宏观层面来看,面向对象的构建方式更能适应软件的变化,能将变化所带来的影响减到最小。各司其职从微观层面来看,面向对象的方式更强调各个类的“责任”由于需求变化导致的新增类型不应该影响原来类型的实现,而是各负其责对象是什么?从语言实现层面来看,对象封装了代码和数据从规格层面讲,对象是一系列可被使用的公共接口从概念层面讲,对象是某种拥有责任的抽象
-
什么是设计模式?每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动。从面向对象谈起底层思维语言构造编译转换内存模型运行时机制抽象思维面向对象组件封装设计模式架构模式为什么要用设计模式因为软件使用者的需求、技术平台等等都在不断的变化,导致软件要随之变化,最后使得软件的内部结构越来越复杂。而设计模式就是为了解决软件的复杂性而诞生的。如何解决复杂性分解将大问题分解成多个小问题,将复杂问题分解为多个简单问题抽象由于不能掌握全部的复杂对象,我们选择忽视它的非本质细节,而去处理泛化和理想化的对象模型(即设计模式)解析:将具有相同属性的函数从代码中剥离出来,编程一个一个类,他们都继承一个具有相同属性的抽象函数,这个继承结构利用面向对象的多态性,使得主程序在使用时,可以用比之前简短的代码实现一个功能(有多少个子类就有多少种功能,根据需求选择调用哪一种),而且当此功能需要优化时,不需要更改主程序的代码,只需要找到调用的子类,对其进行修改即可,这种方法优异之处在复杂的项目中体现的淋漓尽致。软件设计的金科玉律:复用!重新认识面向对象理解隔离变化从宏观层面来看,面向对象的构建方式更能适应软件的变化,能将变化所带来的影响减到最小。各司其职从微观层面来看,面向对象的方式更强调各个类的“责任”由于需求变化导致的新增类型不应该影响原来类型的实现,而是各负其责对象是什么?从语言实现层面来看,对象封装了代码和数据从规格层面讲,对象是一系列可被使用的公共接口从概念层面讲,对象是某种拥有责任的抽象
-
获得键盘输入会员号。将会员卡号存储在变量中。使用运算符分解会员卡号的个位上的数字。将分解后的数字相加判断是否中奖。首先要使用Scanner的类的方法获得用户从键盘输入的数据。Scanner类是用于扫描输入文本的使用程序。如果使用Scanner类,必须使用import语句导入Scanner类,即指定Scanner类的位置,它将位于java。util包中。(1)导入Scanner类import java.util.*;(2)创建Scanner对象,获得键盘输入的数据Scanner input = new Scanner(System.in):(3)将数据存入变量,输出这个变量.import java.util.Scanner; //导入Scanner类public class Lucky{ public static void main(String[] args){ int custNo; //客户会员号 //输入会员卡号 System.out.println("请输入4位会员卡号:"); Scanner input=new Scanner(System.in); //System.in代表系统输入 custNo=input.nextInt(); //nextInt()获取从键盘输入的一个整数,并赋值给num变量 System.out.println("会员卡号是:"+custNo); }}4位会员卡号和10求余可得个位数4位会员卡号除以10再和10求余可得十位数4位会员卡号除以100再和10求余可得百位数4位会员卡号除以1000可得十位数计算各位之和import java.util.Scanner; //导入Scanner类public class Lucky{ public static void main(String[] args){ int custNo; //客户会员号 //输入会员卡号 System.out.println("请输入4位会员卡号:"); Scanner input=new Scanner(System.in); //System.in代表系统输入 custNo=input.nextInt(); //nextInt()获取从键盘输入的一个整数,并赋值给num变量 System.out.println("会员卡号是:"+custNo); //利用"/"和"%"运算符获得每位数字 int ge=custNo%10; //分解获得个位数 int shi=custNo/10%10; //分解获得十位数 int bai=custNo/100%10; //分解获得百位数 int qian=custNo/1000; //分解获得千位数 System.out.print("千位数:"+qian+",百位数:"+bai+",十位数:"+shi+",个位数:"+ge,); //利用"+"运算符计算数字之和 int sum=ge+shi+bai+qian; System.out.println("会员卡号"+custNo+"各位之和:"+sum); }}10.使用关系运算符中的">"判断import java.util.Scanner; //导入Scanner类public class Lucky{ public static void main(String[] args){ int custNo; //客户会员号 //输入会员卡号 System.out.println("请输入4位会员卡号:"); Scanner input=new Scanner(System.in); //System.in代表系统输入 custNo=input.nextInt(); //nextInt()获取从键盘输入的一个整数,并赋值给num变量 System.out.println("会员卡号是:"+custNo); //利用"/"和"%"运算符获得每位数字 int ge=custNo%10; //分解获得个位数 int shi=custNo/10%10; //分解获得十位数 int bai=custNo/100%10; //分解获得百位数 int qian=custNo/1000; //分解获得千位数 System.out.print("千位数:"+qian+",百位数:"+bai+",十位数:"+shi+",个位数:"+ge,); //利用"+"运算符计算数字之和 int sum=ge+shi+bai+qian; System.out.println("会员卡号"+custNo+"各位之和:"+sum); //判断是否中奖 if(sum>20){ System.out.println("会员卡号"+custNo+"的会员,恭喜您中奖了!奖品是MP4!"); }else{ System.out.println("会员卡号"+custNo+"的会员,很遗憾,您没有中奖!"); } }}
-
经常在工作中会使用到XPath的相关知识,但每次总会在一些关键的地方不记得或不太清楚,所以免不了每次总要查一些零碎的知识,感觉即很烦又浪费时间,所以对XPath归纳及总结一下。在这篇文章中你将能学习到:XPath简介XPath 路径表达式详解XPath在DOM,XSLT及XQuery中的应用XPath简介XPath是W3C的一个标准。它最主要的目的是为了在XML1.0或XML1.1文档节点树中定位节点所设计。目前有XPath1.0和XPath2.0两个版本。其中Xpath1.0是1999年成为W3C标准,而XPath2.0标准的确立是在2007年。W3C关于XPath的英文详细文档请见:http://www.w3.org/TR/xpath20/ 。XPath是一种表达式语言,它的返回值可能是节点,节点集合,原子值,以及节点和原子值的混合等。XPath2.0是XPath1.0的超集。它是对XPath1.0的扩展,它可以支持更加丰富的数据类型,并且XPath2.0保持了对XPath1.0的相对很好的向后兼容性,几乎所有的XPath2.0的返回结果都可以和XPath1.0保持一样。另外XPath2.0也是XSLT2.0和XQuery1.0的用于查询定位节点的主表达式语言。XQuery1.0是对XPath2.0的扩展。关于在XSLT和XQuery中使用XPath表达式定位节点的知识在后面的实例中会有所介绍。在学习XPath之前你应该对XML的节点,元素,属性,原子值(文本),处理指令,注释,根节点(文档节点),命名空间以及对节点间的关系如:父(Parent),子(Children),兄弟(Sibling),先辈(Ancestor),后代(Descendant)等概念有所了解。这里不在说明。XPath路径表达式在本小节下面的内容中你将可以学习到:路径表达式语法相对/绝对路径表达式上下文谓词(筛选表达式)及轴的概念运算符及特殊字符常用表达式实例函数及说明这里给出一个实例Xml文件。下面的说明及实例都是基于该XML文件。1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465<?xml version="1.0" encoding="UTF-8"?><!-- edited with XMLSpy v2008 rel. 2 sp2 (http://www.altova.com ) by Administrator --><?xml-stylesheet type="text/xsl" href="messages.xsl" rel="external nofollow" ?><messages> <message id="1"> <sender>gukaitong@gmail.com</sender> <to>anonymous@gmail.com <group name="IT"> <address>111@gmail.com</address> <address>222@gmail.com</address> <address>aaa@gmail.com</address> <address>bbb@gmail.com</address> <address>ccc@gmail.com</address> </group> </to> <subject>This is a sample</subject> <datetime date="2008-12-11" time="12:00:00" formatted="12/11/2008 12:00AM">2008-12-11T12:00:00Z</datetime> <body> Are you interested in? <attachments> <attachment id="1"> <message id="0"> <sender>anonymous@gmail.com</sender> <to>gukaitong@gmail.com</to> <body>We strongly recommend the following books <books xmlns:amazon="http://www.amazon.com/books/schema "> <amazon:book> <name>Professional C# 2008 </name> <country>USA</country> <price>37.79</price> <year>2007</year> </amazon:book> <amazon:book> <name>Microsoft Visual C# 2008 Step by Step </name> <country>USA</country> <price>26.39 </price> <year>2008</year> </amazon:book> <amazon:book> <name>C# in Depth</name> <country>USA</country> <price>29.69 </price> <year>2006</year> </amazon:book> <amazon:book> <name>Thinking in Java</name> <country>USA</country> <price>23.69 </price> <year>2004</year> </amazon:book> </books> </body> </message> </attachment> </attachments> </body> </message> <message id="2"> <sender>333@gmail.com</sender> <to>444@gmail.com</to> <subject>No title</subject> <body/> </message></messages>路径表达式语法:路径 = 相对路径 | 绝对路径XPath路径表达式 = 步进表达式 | 相对路径 "/"步进表达式。步进表达式=轴 节点测试 谓词说明:其中轴表示步进表达式选择的节点和当前上下文节点间的树状关系(层次关系),节点测试指定步进表达式选择的节点名称扩展名,谓词即相当于过滤表达式以进一步过滤细化节点集。谓词可以是0个或多个。多个多个谓词用逻辑操作符and, or连接。取逻辑非用not()函数。请看一个典型的XPath查询表达式:/messages/message//child::node()[@id=0],其中/messages/message是路径(绝对路径以"/"开始),child::是轴表示在子节点下选择,node()是节点测试表示选择所有的节点。[@id=0]是谓词,表示选择所有有属性id并且值为0的节点。相对路径与绝对路径:如果"/"处在XPath表达式开头则表示文档根元素,(表达式中间作为分隔符用以分割每一个步进表达式)如:/messages/message/subject是一种绝对路径表示法,它表明是从文档根开始查找节点。假设当前节点是在第一个message节点【/messages/message[1]】,则路径表达式subject(路径前没有"/")这种表示法称为相对路径,表明从当前节点开始查找。具体请见下面所述的"表达式上下文"。表达式上下文(Context):上下文其实表示一种环境。以明确当前XPath路径表达式处在什么样的环境下执行。例如同样一个路径表达式处在对根节点操作的环境和处在对某一个特定子节点操作的环境下执行所获得的结果可能是完全不一样的。也就是说XPath路径表达式计算结果取决于它所处的上下文。XPath上下文基本有以下几种:当前节点(./):如./sender表示选择当前节点下的sender节点集合(等同于下面所讲的"特定元素",如:sender)父节点(../):如../sender表示选择当前节点的父节点下的sender节点集合根元素(/):如/messages表示选择从文档根节点下的messages节点集合.根节点(/*):这里的*是代表所有节点,但是根元素只有一个,所以这里表示根节点。/*的返回结果和/messages返回的结果一样都是messages节点。递归下降(//):如当前上下文是messages节点。则//sender将返回以下结果:/messages//sender :<sender>gkt1980@gmail.com</sender><sender>111@gmail.com</sender><sender>333@gmail.com</sender>/messages/message[1]//sender:<sender>gkt1980@gmail.com</sender><sender>111@gmail.com</sender>我们可以看出XPath表达式返回的结果是:从当前节点开始递归步进搜索当前节点下的所有子节点找到满足条件的节点集。特定元素如sender:表示选择当前节点下的sender节点集合,等同于(./sender)注意:在执行XPath时一定要注意上下文。即当前是在哪个节点下执行XPath表达式。这在XMLDOM中很重要。如:在XMLDOM中的selectNodes,selectSingleNode方法的参数都是一个XPath表达式,此时这个XPath表达式的执行上下文就是调用这个方法的节点及它所在的环境。更多信息请参见:http://www.w3.org/TR/xpath20/谓词(筛选表达式)及轴的概念:XPath的谓词即筛选表达式,类似于SQL的where子句.轴名称结果ancestor选取当前节点的所有先辈(父、祖父等)ancestor-or-self选取当前节点的所有先辈(父、祖父等)以及当前节点本身attribute选取当前节点的所有属性child选取当前节点的所有子元素。descendant选取当前节点的所有后代元素(子、孙等)。descendant-or-self选取当前节点的所有后代元素(子、孙等)以及当前节点本身。following选取文档中当前节点的结束标签之后的所有节点。namespace选取当前节点的所有命名空间节点parent选取当前节点的父节点。preceding直到所有这个节点的父辈节点,顺序选择每个父辈节点前的所有同级节点preceding-sibling选取当前节点之前的所有同级节点。self选取当前节点。运算符及特殊字符:运算符/特殊字符说明/此路径运算符出现在模式开头时,表示应从根节点选择。//从当前节点开始递归下降,此路径运算符出现在模式开头时,表示应从根节点递归下降。.当前上下文。..当前上下文节点父级。*通配符;选择所有元素节点与元素名无关。(不包括文本,注释,指令等节点,如果也要包含这些节点请用node()函数)@属性名的前缀。@*选择所有属性,与名称无关。:命名空间分隔符;将命名空间前缀与元素名或属性名分隔。( )括号运算符(优先级最高),强制运算优先级。[ ]应用筛选模式(即谓词,包括"过滤表达式"和"轴(向前/向后)")。[ ]下标运算符;用于在集合中编制索引。|两个节点集合的联合,如://messages/message/to | //messages/message/cc-减法。div,浮点除法。and, or逻辑运算。mod求余。not()逻辑非=等于!=不等于特殊比较运算符< 或者 <<= 或者 <=> 或者 >>= 或者 >=需要转义的时候必须使用转义的形式,如在XSLT中,而在XMLDOM的scripting中不需要转义。常用表达式实例:/Document Root文档根./*选择文档根下面的所有元素节点,即根节点(XML文档只有一个根节点)/node()根元素下所有的节点(包括文本节点,注释节点等)/text()查找文档根节点下的所有文本节点/messages/messagemessages节点下的所有message节点/messages/message[1]messages节点下的第一个message节点/messages/message[1]/self::node()第一个message节点(self轴表示自身,node()表示选择所有节点)/messages/message[1]/node()第一个message节点下的所有子节点/messages/message[1]/*[last()]第一个message节点的最后一个子节点/messages/message[1]/[last()]Error,谓词前必须是节点或节点集/messages/message[1]/node()[last()]第一个message节点的最后一个子节点/messages/message[1]/text()第一个message节点的所有子节点/messages/message[1]//text()第一个message节点下递归下降查找所有的文本节点(无限深度)/messages/message[1] /child::node()/messages/message[1] /node()/messages/message[position()=1]/node()//message[@id=1] /node()第一个message节点下的所有子节点//message[@id=1] //child::node()递归所有子节点(无限深度)//message[position()=1]/node()选择id=1的message节点以及id=0的message节点/messages/message[1] /parent::*Messages节点/messages/message[1]/body/attachments/parent::node()/messages/message[1]/body/attachments/parent::* /messages/message[1]/body/attachments/..attachments节点的父节点。父节点只有一个,所以node()和* 返回结果一样。(..也表示父节点. 表示自身节点)//message[@id=0]/ancestor::*Ancestor轴表示所有的祖辈,父,祖父等。向上递归//message[@id=0]/ancestor-or-self::*向上递归,包含自身//message[@id=0]/ancestor::node()对比使用*,多一个文档根元素(Document root)/messages/message[1]/descendant::node()//messages/message[1]//node()递归下降查找message节点的所有节点/messages/message[1]/sender/following::*查找第一个message节点的sender节点后的所有同级节点,并对每一个同级节点递归向下查找。//message[@id=1]/sender/following-sibling::*查找id=1的message节点的sender节点的所有后续的同级节点。//message[@id=1]/datetime/@date查找id=1的message节点的datetime节点的date属性//message[@id=1]/datetime[@date]//message/datetime[attribute::date]查找id=1的message节点的所有含有date属性的datetime节点//message[datetime]查找所有含有datetime节点的message节点//message/datetime/attribute::*//message/datetime/attribute::node()//message/datetime/@*返回message节点下datetime节点的所有属性节点//message/datetime[attribute::*]//message/datetime[attribute::node()]//message/datetime[@*]//message/datetime[@node()]选择所有含有属性的datetime节点//attribute::*选择根节点下的所有属性节点//message[@id=0]/body/preceding::node()顺序选择body节点所在节点前的所有同级节点。(查找顺序为:先找到body节点的顶级节点(根节点),得到根节点标签前的所有同级节点,执行完成后继续向下一级,顺序得到该节点标签前的所有同级节点,依次类推。)注意:查找同级节点是顺序查找,而不是递归查找。//message[@id=0]/body/preceding-sibling::node()顺序查找body标签前的所有同级节点。(和上例一个最大的区别是:不从最顶层开始到body节点逐层查找。我们可以理解成少了一个循环,而只查找当前节点前的同级节点)//message[@id=1]//*[namespace::amazon]查找id=1的所有message节点下的所有命名空间为amazon的节点。//namespace::*文档中的所有的命名空间节点。(包括默认命名空间xmlns:xml)//message[@id=0]//books/*[local-name()='book']选择books下的所有的book节点,注意:由于book节点定义了命名空间<amazone:book>.若写成//message[@id=0]//books/book则查找不出任何节点。//message[@id=0]//books/*[local-name()='book' and namespace-uri()='http://www.amazon.com/books/schema']选择books下的所有的book节点,(节点名和命名空间都匹配)//message[@id=0]//books/*[local-name()='book'][year>2006]选择year节点值>2006的book节点//message[@id=0]//books/*[local-name()='book'][1]/year>2006指示第一个book节点的year节点值是否大于2006.返回xs:boolean: true函数及说明:值得欣喜的是XPath函数和XSLT,XQuery等共享函数库,函数库为我们提供了功能丰富的各种函数的调用,我们也可以自定义自己的函数。这里不再对每个函数的用法逐一说明,中文的可以参考这个网站, https://www.jb51.net/w3school/xpath/index.htm XPath在DOM,XSLT及XQuery中的应用DOM:123456789101112131415161718192021<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd "><html xmlns="http://www.w3.org/1999/xhtml "><head><title>XPath Test</title></head><body><script language="javascript" type="text/javascript">var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");xmlDoc.async="false";xmlDoc.load("messages.xml");xmlDoc.setProperty("SelectionLanguage", "XPath"); var sPath = "/messages/message[1]//books/*[local-name()='book']";var bookNodes = xmlDoc.selectNodes(sPath);document.write("<ul>");for ( var i = 0; i < bookNodes.length; i++) {document.write("<li>" + bookNodes[i].childNodes[0].text + "</li>");}document.write("</ul>");</script></body></html>注意:我们若使用new ActiveXObject("Microsoft.XMLDOM")则需要注意的是:因为早期的XMLDOM的SelectionLanguage属性默认是正则表达式,不是XPath语言。所以需要指定这样一条语句xmlDoc.setProperty("SelectionLanguage", "XPath"); 以支持XPath查询表达式。.若没有指定SelectionLanguage属性值为XPath则要注意以下情况:数组下标从0开始(我们知道在XPath查询表达式中数组下标是从1开始的)不支持在XPath查询表达式中使用XPath函数。总结以上就是本文关于Xpath语法格式总结的全部内容,希望对大家有所帮助
-
1.Java基本数据类型与表达式,分支循环。 2.String和StringBuffer的使用、正则表达式。 3.面向对象的抽象,封装,继承,多态,类与对象,对象初始化和回收;构造函数、this关键字、方法和方法的参数传递过程、static关键字、内部类,Java的垃极回收机制,Javadoc介绍。 4.对象实例化过程、方法的覆盖、final关键字、抽象类、接口、继承的优点和缺点剖析;对象的多态性:子类和父类之间的转换、抽象类和接口在多态中的应用、多态带来的好处。 5.Java异常处理,异常的机制原理。 6.常用的设计模式:Singleton、Template、Strategy模式。 7.JavaAPI介绍:种基本数据类型包装类,System和Runtime类,Date和DateFomat类等。 8.Java集合介绍:Collection、Set、List、ArrayList、Vector、LinkedList、Hashset、 Tre eSet、Map、HashMap、TreeMap、Iterator、Enumeration等常用集合类API。 9.Java I/O输入输出流:File和FileRandomAccess类,字节流InputStream和OutputStream,字符流Reader和Writer,以及相应实现类,IO性能分析,字节和字符的转化流,包装流的概念,以及常用包装类,计算机编码。 10.Java高级特性:反射、代理和泛型。 11.多线程原理:如何在程序中创建多线程(Thread、Runnable),线程安全问题,线程的同步,线程之间的通讯、死锁。 12.Socket网络编程。
-
在科技创新的星辰大海中,众多物联网企业涌现“数智化”赛道,产业格局重构下释放哪些变革信号?12月8日,由慧聪物联网、慧聪电子网主办的2021(第十八届)中国物联网产业大会暨品牌盛会,在深圳盛大召开。大会以“物联芯生,数智世界”为主题,齐聚深圳同台论道,500+企业高层、权威专家、工程商、集成商等于一堂,共同探讨数智化时代转型过程中的“攻”与“守”。本届品牌盛会致力于站在科技创新的浪潮上,回望过去一年产业的发展成果。大会聚焦AI安防、物联网、智慧城市、数据智理、上游缺芯等热点话题,全力打造2021年度中国物联网产业年度盛事。
上滑加载中
推荐直播
-
探秘仓颉编程语言:华为开发者空间的创新利器
2025/02/22 周六 15:00-16:30
华为云讲师团
本期直播将与您一起探秘颉编程语言上线华为开发者空间后,显著提升开发效率,在智能化开发支持、全场景跨平台适配能力、工具链与生态完备性、语言简洁与高性能特性等方面展现出的独特优势。直播看点: 1.java转仓颉的小工具 2.仓颉动画三方库lottie 3.开发者空间介绍及如何在空间用仓颉编程语言开发
即将直播 -
大模型Prompt工程深度实践
2025/02/24 周一 16:00-17:30
盖伦 华为云学堂技术讲师
如何让大模型精准理解开发需求并生成可靠输出?本期直播聚焦大模型Prompt工程核心技术:理解大模型推理基础原理,关键采样参数定义,提示词撰写关键策略及Prompt工程技巧分享。
去报名 -
华为云 x DeepSeek:AI驱动云上应用创新
2025/02/26 周三 16:00-18:00
华为云 AI专家大咖团
在 AI 技术飞速发展之际,DeepSeek 备受关注。它凭借哪些技术与理念脱颖而出?华为云与 DeepSeek 合作,将如何重塑产品与应用模式,助力企业数字化转型?在华为开发者空间,怎样高效部署 DeepSeek,搭建专属服务器?基于华为云平台,又该如何挖掘 DeepSeek 潜力,实现智能化升级?本期直播围绕DeepSeek在云上的应用案例,与DTSE布道师们一起探讨如何利用AI 驱动云上应用创新。
去报名
热门标签