心就是AI

共知心是水,安见我非鱼

0%

容器是一种可以把多个元素放在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in等关键字判断某个元素是否包含在容器中。Python中,容器包括列表(list)、元组(tuple)、字典(dict)、集合(set)等。

list容器

列表(list)是一种有序的容器,放入list中的元素,将会按照一定顺序排列

list的基本使用

1
2
3
4
5
6
7
8
scores = [56, 66, 35, 82, 99, 100]
names = ['Bill', 'Niki', 'Linda', 'Kimi', 'Don', 'Silvia']

#python是动态语言,list或要放入任意类型数据
anyList = ['Kimi', 66, 'Linda', True, 33.4, 'False']

#可以使用print打印
print(anyList) # ===> ['Kimi', 66, 'Linda', True, 33.4, 'False']

list的访问

1
2
3
4
5
6
7
8
9
10
11
#按顺序访问
for item in anyList:
print(item)

#按索引访问
print(anyList[0]) # ===> Kimi
print(anyList[1]) # ===> 66

#倒序访问
print(anyList[-1]) # ===> False
print(anyList[-2]) # ===> 33.4

list切片

1
2
3
4
5
6
7
8
9
10
11
print(anyList[1:3]) # ===> [66, 'Linda']
print(anyList[1:-1]) # ===> [66, 'Linda', True, 33.4]
print(anyList[-3:-1]) # ===> [True, 33.4]

#切片还可以指定步长
print(anyList[0:5:2]) # ===> ['Kimi', 'Linda', 33.4]
print(anyList[1:5:2]) # ===> [66, True]

#步长还可以是负数
print(anyList[-1:-6:-1]) # ===> ['False', 33.4, True, 'Linda', 66]
print(anyList[-1:-6:-2]) # ===> ['False', True, 66]

list添加元素

使用append()在列表末尾添加元素

1
2
names.append('Nancy')
print(names) # ===> ['Bill', 'Niki', 'Linda', 'Kimi', 'Don', 'Silvia', 'Nancy']

使用insert()在指定位置添加元素

1
2
names.insert(2, 'Carol')
print(names) # ===> ['Bill', 'Niki', 'Carol', 'Linda', 'Kimi', 'Don', 'Silvia', 'Nancy']

list删除元素

1
2
3
4
5
6
7
8
9
#使用pop()删除最后一个元素
n = names.pop()
print(n) # ===> Nancy
print(names) # ===> ['Bill', 'Niki', 'Carol', 'Linda', 'Kimi', 'Don', 'Silvia']

#删除指定位置的元素
n = names.pop(3)
print(n) # ===> Linda
print(names) ===> ['Bill', 'Niki', 'Carol', 'Kimi', 'Don', 'Silvia']

tuple容器

元组(tuple)和list一样,也是一个有序容器,在元组中,同样可以包含0个或者多个元素,并且也支持索引访问、切片等操作。
tuple和list不一样的是,tuple是固定不变的,一旦变成tuple,tuple中的每一个元素都不可被改变,同时也不能再往tuple中添加数据。
在运行上tuple的性能是list的数倍。

tuple的基本用法

1
2
3
4
5
6
7
8
9
10
11
12
namesTuple = ('Alice', 'Bob', 'Candy', 'David', 'Ema')
print(namesTuple) # ===> ('Alice', 'Bob', 'Candy', 'David', 'Ema')

#顺序与倒序访问
print(namesTuple[0]) # ===> Alice
print(namesTuple[1]) # ===> Bob
print(namesTuple[-1]) # ===> Ema

#切片
print(namesTuple[-4:-1]) # ===> ('Bob', 'Candy', 'David')
print(namesTuple[-4:-1:2]) # ===> ('Bob', 'David')
print(namesTuple[-1:-5:-2]) # ===> ('Ema', 'Candy')

list转tuple

1
2
3
anyList = ['Kimi', 66, 'Linda', True, 33.4, 'False']
anyTuple = tuple(anyList)
print(anyTuple) # ===> ('Kimi', 66, 'Linda', True, 33.4, 'False')

tuple的一些其它方法

统计tuple中某个元素出现了多少次

1
2
3
tp = (1,2,3,6,4,2,3,2,1,2,9)
print(tp.count(1)) # ===> 2
print(tp.count(2)) # ===> 4

使用index()方法获取指定元素的下标,如果指定元素不存在,则报错

1
2
print(tp.index(6)) # ===> 3
>>> print(tp.index(2)) # ===> 1 #多次出现,返回第一次出现的位置

创建单个元素的tuple

1
2
tp = (1,)
print(tp) # ===> (1,)

对于多个元素的tuple,最后加不加这个逗号,效果是一样的

1
2
tp = (1, 2, 3,)
print(tp) # ===> (1, 2, 3)

Python的字符串

字符串可以用''或者""括起来表示

1
2
3
"I'm OK"
'I think "Python" is OK'
'Python said \"I\'m OK\".'

raw字符串与多行字符串

在字符串前面加一个r,里面的字符串就不会转义了

1
r'\(~_~)/ \(~_~)/'

多行字符串,用''''...'''表示

1
2
3
'''第一行
第二行
第三行'''

多行字符串前面也可以加r变成raw字符串

1
2
3
r'''Python is amazing program language.
It is easy to learn and use.
We all use python, \(~_~)/'''

字符串format

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 字符串模板
template = 'Hello {}'
# 模板数据内容
world = 'World'
result = template.format(world)
print(result) # ==> Hello World

#指定顺序
template = 'Hello {0}, Hello {1}, Hello {2}.'
result = template.format('World', 'Python', 'DengYong')
print(result) # ==> Hello World, Hello Python, Hello DengYong.

#调整顺序
template = 'Hello {2}, Hello {1}, Hello {0}.'
result = template.format('World', 'Python', 'DengYong')
print(result) # ==> Hello DengYong, Hello Python, Hello World.

模板参数还可以指名对应名称

1
2
3
template = 'Hello {a}, Hello {b}, Hello {c}, Hello {d}.'
result = template.format(a = 'world', b = 'china', c = 'python', d = 'dengyong')
print(result) # ===> Hello world, Hello china, Hello python, Hello dengyong.

字符串切片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
s = 'ABCDEFGHIJK'
a = s[0] # 第一个
b = s[1] # 第二个
c = s[2] # 第三个
print(a) # ==> A
print(b) # ==> B
print(c) # ==> C

ab = s[0:2] # 取字符串s中的第一个字符到第三个字符,不包括第三个字符
print(ab) # ==> AB

print(s[0:4]) # ===> ABCD
print(s[2:6]) # ===> CDEF

#还可以取负值,表示倒数
print(s[-1]) # ===> K
print(s[-3:-1]) # ===> IJ
print(s[2:-1]) # ===> CDEFGHIJ

整数

Python可以处理任意大小的整数,例如:1, 2, 3, 10, 100, 100, -100
二进制: 使用前缀0b表示,比如:0b0110, 0b1100
十六进制: 使用前缀0x表示,比如:0x12ef, 0xde2431af

浮点数

示例:0.1, 0.5, 12.34, 3.1415926
把10用e替代,比如:1.23x10^9就是1.23e9,或者12.3e80.000012可以写成1.2e-5
整数和浮点数在计算机内部存储的方式是不同的,整数运算永远是精确的,而浮点数运算则可能会有四舍五入的误差

1
2
3
>>> 0.1 + 0.2
0.30000000000000004
>>>

字符串

在Python中,字符串是以''""括起来的任意文本,比如'abc'"xyz"等等

1
2
3
>>> print('Hello World')
Hello World
>>>

布尔值

布尔值只有TrueFalse两种值
布尔值可以用andornot运算

空值

空值是Python里一个特殊的值,用None表示。

整数与浮点数基本运算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>>> 10/4
2.5
>>> 10//4
2
>>> 10/2.5
4.0
>>> 10//2.5
4.0
>>> 10/2.2
4.545454545454545
>>> 10//2.2
4.0
>>> 10/3
3.3333333333333335
>>> round(10/3, 2)
3.33
>>>

布尔运算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#与运算
True and True # ==> True
True and False # ==> False
False and True # ==> False
False and False # ==> False

#或运算
True or True # ==> True
True or False # ==> True
False or True # ==> True
False or False # ==> False

#非运算
not True # ==> False
not False # ==> True

#not计算的优先级是高于and和or
True and not False # ==> True

布尔类型还可以与其他数据类型(字符串,数字等)做 and、or和not运算

1
2
3
4
5
6
7
8
9
10
a = True
print(a and 0 or 99) # ==> 99
print(a and 'Hello') # ==> 'Hello'
print(a or 'Hello') # ==> True

b = False
print(b and 4 or 6) # ==>6
print(b and 4 and 6) # ==> False
print(b and 'Hello') # ==> False
print(b or 'Hello') # ==> Hello

js时间日期格式化

javascript没有提供标准可用的时间格式化相关方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//格式化时间
$.formatDate = function(date,format){
var padNum = function(num){
return ("" + num).replace(/^(\d)$/,"0$1");
}
//指定格式字符
var cfg = {
yyyy : date.getFullYear() //年
,yy : date.getFullYear().toString().substring(2)
,M : date.getMonth() + 1 //月
,MM : padNum(date.getMonth() + 1)
,d : date.getDate() //日
,dd : padNum(date.getDate())
,H : date.getHours() //时: 24小时制
,HH : padNum(date.getHours())
,h : date.getHours()>12?date.getHours()-12:date.getHours() //时:12小时制
,hh : padNum(date.getHours()>12?date.getHours()-12:date.getHours())
,m : date.getMinutes()
,mm : padNum(date.getMinutes()) //分
,s : date.getSeconds()
,ss : padNum(date.getSeconds()) //秒
,SSS: (1000 + date.getMilliseconds() + "").substring(1) //毫秒
}
format || (format = "yyyy-MM-dd HH:mm:ss");
return format.replace(/([yMdHhmsS])(\1)*/ig,function(m){
var v = cfg[m];
return v === undefined ? m : v;
});
}

说明

  1. 该函数的两个参数分别为:1)时间日期 2)格式化字符串
  2. 返回值:按照format格式化的时间日期字符串
  3. 举例说明(以当前时间为2014-12-13 15:30:12为例, var date = new Date(); ):
调用方式 返回值
$.formatDate(date, ‘yyyy-MM-dd HH:mm:ss,SSS’); 2014-12-13 15:30:12,000
$.formatDate(date, ‘yyyy-MM-dd HH:mm:ss’); 2014-12-13 15:30:12
$.formatDate(date, ‘yyyy-MM-dd HH:mm’); 2014-12-13 15:30
$.formatDate(date, ‘HH:mm:ss’); 15:30:12
$.formatDate(date, ‘yyyy年MM月dd日’); 2014年12月13日

时间日期处理(时间日期的计算)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
/**
* 获取指定格式日期字符串
* 参数:可传入三个参数,参数不分先后
* Date类型参数:表示指定的时间,如果没有则为当前时间
* String类型参数:格式,如果没有则为yyyy-MM-dd HH:mm:ss
* Object类型参数:对时间的处理,该参数可以有的属性:
* d:表示日,M:表示月,m:表示分钟,H:表示小时,y:表示年
* 示例:$.getDateStr(new Date,'yyyy-MM-dd HH:mm:ss', {d:-3,H:5});将得5小时后的3天前
*/
$.getDateStr = function(){
var date, format, options;

for(var i=0; i<arguments.length; i++){
var arg = arguments[i];
if(arg === null || arg === undefined){
continue;
}
if((typeof arg === 'string') && arg.constructor == String){
format = arg;
} else if((typeof arg === 'object')) {
if(arg.constructor == Date){
date = arg;
} else {
options = arg;
}
}
}

date = date || new Date();
format = format || "yyyy-MM-dd HH:mm:ss";
options = options || {};

var cfg = {
d: function(v){//天
date.setDate(date.getDate() + v);
},
M: function(v){//月
date.setMonth(date.getMonth() + v);
},
m: function(v){//分钟
date.setMinutes(date.getMinutes() + v);
},
H: function(v){//小时
date.setHours(date.getHours() + v);
},
y: function(v){//年
date.setFullYear(date.getFullYear() + v);
},
s: function(v){//秒
date.setSeconds(date.getSeconds() + v);
},
S: function(v){//毫秒
date.setMilliseconds(date.getMilliseconds() + v);
}
}
for(var k in options){
cfg[k] && cfg[k](options[k]);
}
return $.formatDate(date, format);
}

说明

调用方式 返回值
$.getDateStr() 2014-12-13 15:30:12
$.getDateStr({d: 1}) 2014-12-14 15:30:12
$.getDateStr({d: -1}) 2014-12-12 15:30:12
$.getDateStr({d: -13}) 2014-11-30 15:30:12
$.getDateStr({H: -1}) 2014-12-13 14:30:12
$.getDateStr({M:-1, d: 1}) 2014-11-14 14:30:12
$.getDateStr('yyyy-MM-dd') 2014-12-13
$.getDateStr({M:-1},'yyyy-MM') 2014-11
var d = new Date();
d.setDate(25);
$.getDateStr(d,{M:-1},'yyyy-MM-dd 00:00:00');
2014-11-25 00:00:00

EasyUI时间控件datetimebox的初始化

刚使用EasyUI的时间控件时,遇到一个问题,那就是如何初始化该该控件为系统当前时间或当前时间前一个小时,在网上搜了很久也没有满意答案
本文前两点时间格式化和时间日期计算都是为了这个EasyUI时间控件初始化做准备的
使用方式如下

1
2
3
<input name="startTime" id="startTime"  class="easyui-datetimebox"
data-options="required:true,missingMessage:'开始时间不能为空', editable:false,
value:$.getDateStr({H:-1})" style="width:183px;" />

说明
这里的value:$.getDateStr({H:-1})即是设置初始时间为当前时间的前一个小时

说在前面的话

前段时间做前后端分离,前端采用jQuery EasyUI。 EasyUI确实是个不错的东东,在使用过程中还是很有收获的,决定写几篇关于EasyUI的文章(当然不会写使用教程之类的东东,因为官方文档已经足够详细了)

问题描述

在使用datagrid组件时,发现一个很奇怪的问题,那就是当页面向后台请求数据时,如果未请求到数据,则会再请求一次,很显然这是不合理的、多余的
EasyUI的版本:1.4

解决办法

原来的代码

1
2
3
4
5
6
7
8
if(_615.total!=data.total){
_614.pagination("refresh",{total:data.total});
if(opts.pageNumber!=_615.pageNumber){
opts.pageNumber=_615.pageNumber;
_5d7(_60f);
}
}
}

修改后的代码,在_5d7(_60f);外加了一个判断语句

1
2
3
4
5
6
7
8
9
10
if(_615.total!=data.total){
_614.pagination("refresh",{total:data.total});
if(opts.pageNumber!=_615.pageNumber){
opts.pageNumber=_615.pageNumber;
if(_615.pageNumber!=0){
_5d7(_60f);
}
}
}
}

说明

  1. _5d7(_60f); 这一行的作用就是向后台请求数据
  2. _615.pageNumber 则是请求到的数据页数,没数据时,它是0
  3. opts.pageNumber 则是默认时页数,它是1
  4. 很显然,没请求到数据时(即数据条数为0),以上两个值不相等,按原来的代码就会再去请求一次,加上判断后,问题解决
  5. datagrid加载数据这一块代码,其实是一个间接递归的过程,有意者可自行调试看看(因这并不是真正的源码,而是经过压缩过的,调试起来比较费劲)