*YTHON中的字典(DICT),列表(LIST),元组(TU*LE)

一,L*st:列表**>

pytho*内置的一种数据类型是列表:l*st.l*st是一种有序的数据集合,可以随意的添加和删除其中的数据。比如列出班里所有的同学的名字,列出所有工厂员工的工号等都是可以用到列表的,以下是pytho*列表的演示代码:

<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
1 &*t;&*t;&*t; l*st1 = ['zha**xueyou','l*udehua','wa**l*jua*','l*m***','shab*e']
2 &*t;&*t;&*t; l*st1
3 ['zha**xueyou','shab*e']
4 &*t;&*t;&*t; l*st2 = [000001,000002,000003,000004,000005,000006]
5 &*t;&*t;&*t; l*st2
6 [1,2,3,4,5,6]
7 &*t;&*t;&*t; 
<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
*v>

变量l*st1,l*st2都是一个列表的实例,可以使用le*()函数获得列表的长度(字典中的元素的个数):

<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
 1 &*t;&*t;&*t; l*st1 = ['zha**xueyou','shab*e']
 2 &*t;&*t;&*t; l*st1
 3 ['zha**xueyou','shab*e']
 4 &*t;&*t;&*t; l*st2 = [000001,000006]    #其实这里面写成字符串更合适
 5 &*t;&*t;&*t; l*st2
 6 [1,6]
 7 &*t;&*t;&*t; le*(l*st1)
 8 5
 9 &*t;&*t;&*t; le*(l*st2)
10 6
11 &*t;&*t;&*t; 
<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
*v>

可以使用索引来引用列表中的元素,注意:列表中的索引是从0开始的,并且在列表中还支持负索引,实例如下:

<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
 1 &*t;&*t;&*t; l*st1[0]
 2 'zha**xueyou'
 3 &*t;&*t;&*t; l*st1[2]
 4 'wa**l*jua*'
 5 &*t;&*t;&*t; l*st2[1]
 6 2
 7 &*t;&*t;&*t; l*st1[-1]
 8 'shab*e'
 9 &*t;&*t;&*t; l*st2[-2] #这就是负索引的实例
10 5
11 &*t;&*t;&*t; 
<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
*v>

当访问的下标越界的时候就会报I*dex error错:

1 &*t;&*t;&*t; l*st1[78]
2 Traceback (most rece*t call last):
3   F*le "<std**&*t;",l**e 1,** <module&*t;
4 I*dexError: l*st **dex out of ra**e
5 &*t;&*t;&*t; 
*v>

所以,记得在操作pytho*的列表的时候不要越界,记得最后一个元素的索引是:le*(l*st1)-1.

当你要取得最后一个元素的时候你除了记住索引之外还有一个更机智的办法即使使用pytho*的负索引的方法:

1 &*t;&*t;&*t; l*st1[le*(l*st1)-1]
2 'shab*e'
3 &*t;&*t;&*t; l*st1[-1]
4 'shab*e'
5 &*t;&*t;&*t; 
*v>

l*st是一个可以变的有序列表,因此可以往你自己的列表中添加和删除元素:在末尾添加元素用的是appe*d()方法,在指定的位置插入元素使用的是**sert()方法。

<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
 1 #在列表末尾追加元素
 2 &*t;&*t;&*t; l*st1.appe*d('x*j**p***')
 3 &*t;&*t;&*t; l*st1
 4 ['zha**xueyou','shab*e','x*j**p***']
 5 &*t;&*t;&*t; l*st2.appe*d(7)
 6 &*t;&*t;&*t; l*st2
 7 [1,6,7]
 8 &*t;&*t;&*t; 
 9  #也可以在指定的位置上添加元素
10 ... 
11 &*t;&*t;&*t; l*st1.**sert(1,'luot***')
12 &*t;&*t;&*t; l*st1
13 ['zha**xueyou','luot***','x*j**p***']
14 &*t;&*t;&*t; l*st2.**sert(0,8)
15 &*t;&*t;&*t; l*st2
16 [8,1,7]
17 &*t;&*t;&*t; 
<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
*v>

在列表中删除元素:删除末尾的元素使用的是pop()方法,删除指定位置的元素使用pop(*),其中*是索引下标,

<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
 1 &*t;&*t;&*t; l*st1
 2 ['zha**xueyou','x*j**p***']
 3 &*t;&*t;&*t; l*st1.pop()
 4 'x*j**p***'
 5 &*t;&*t;&*t; l*st1
 6 ['zha**xueyou','shab*e']
 7 &*t;&*t;&*t; 
 8 &*t;&*t;&*t; l*st1.pop(0)
 9 'zha**xueyou'
10 &*t;&*t;&*t; l*st1
11 ['luot***','shab*e']
12 &*t;&*t;&*t; l*st2.pop()
13 7
14 &*t;&*t;&*t; l*st2
15 [9,8,6]
16 &*t;&*t;&*t; l*st2.pop(0)
17 9
18 &*t;&*t;&*t; l*st2
19 [8,6]
20 &*t;&*t;&*t; 
<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
*v>

若想替换l*st中的某个元素,可以直接把该元素赋值给对应的元素下标即可:

1 &*t;&*t;&*t; l*st1
2 ['luot***','shab*e']
3 &*t;&*t;&*t; l*st1[2] = "wyl"
4 &*t;&*t;&*t; l*st1
5 ['luot***','wyl','shab*e']
6 &*t;&*t;&*t; 
*v>

在一个l*st中可以有不同的数据类型,可以有字符串类型,整型,或者bool等。

1 &*t;&*t;&*t; l*st3 = ['baba','mama',123,True]
2 &*t;&*t;&*t; l*st3
3 ['baba',True]
4 &*t;&*t;&*t; 
*v>

l*st的元素中也可以有另外一个l*st,就相当于一个循环的嵌套一样。

1 &*t;&*t;&*t; l*st4 = ['wa**','wu','luo',['la**','zha**'],'kua']
2 &*t;&*t;&*t; l*st4
3 ['wa**','kua']
4 &*t;&*t;&*t; 
*v>

在这个列表中,要取到‘la**’可以使用下标索引:l*st4[3][1],这就相当于c语言中的二维数组,同样的还可以层层递进的写到三维数组,四维数组等。

&*bsp;1&*bsp;&*t;&*t;&*t; l*st4[3][1]&*bsp;2&*bsp;3&*bsp;'luo'&*bsp;4&*bsp;5&*bsp;&*t;&*t;&*t;&*bsp;&*bsp;*>

如果,一个列表中一个元素都都没有的话,就是一盒空列表:

&*bsp;1&*bsp;&*t;&*t;&*t;&*bsp;2&*bsp;&*t;&*t;&*t; l*st5 =&*bsp;[]&*bsp;3&*bsp;&*t;&*t;&*t;&*bsp;le*(l*st5)&*bsp;4&*bsp;0&*bsp;5&*bsp;&*t;&*t;&*t;&*bsp;&*bsp;*>

&*bsp;

pytho*列表的高级应用:

1.用某个固定的值初始化列表:

<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
1 &*t;&*t;&*t; ***t*al_value = 0
2 &*t;&*t;&*t; l*st_le**th = 5
3 &*t;&*t;&*t; sample_l*st = [***t*al_value for * ** ra**e(10)]
4 &*t;&*t;&*t; sample_l*st = [***t*al_value]*l*st_le**th
5 &*t;&*t;&*t; sample_l*st
6 [0,0]
7 &*t;&*t;&*t; 
<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
*v>

2.产生一个数制递增的列表:

1 &*t;&*t;&*t; *um_**c_l*st = ra**e(30)
2 &*t;&*t;&*t; *um_**c_l*st
3 [0,7,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29]
4 &*t;&*t;&*t; 
*v>

3.创建连续的l*st
 L = ra**e(1,5)&*bsp;&*bsp;&*bsp;&*bsp;&*bsp; #即 L=[1,4],不含最后一个元素
 L = ra**e(1,2) #即 L=[1,9]

<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
1 &*t;&*t;&*t; L = ra**e(1,5)
2 &*t;&*t;&*t; L
3 [1,4]
4 &*t;&*t;&*t; L = ra**e(1,3)
5 &*t;&*t;&*t; L
6 [1,19]
7 &*t;&*t;&*t; 
<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
*v>

l*st的方法
L.appe*d(var)&*bsp;&*bsp; #追加元素
L.**sert(**dex,var)
L.pop(var)&*bsp;&*bsp;&*bsp;&*bsp;&*bsp; #返回最后一个元素,并从l*st中删除之
L.remove(var)&*bsp;&*bsp; #删除第一次出现的该元素

<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
1 &*t;&*t;&*t; l*st6 = [1,65,4]
2 &*t;&*t;&*t; l*st6
3 [1,4]
4 &*t;&*t;&*t; l*st6.remove(4)
5 &*t;&*t;&*t; l*st6
6 [1,4]
7 &*t;&*t;&*t; 
<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
*v>

L.cou*t(var)&*bsp;&*bsp;&*bsp; #该元素在列表中出现的个数

<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
 1 &*t;&*t;&*t; l*st6 = [1,4]
 2 &*t;&*t;&*t; l*st6
 3 [1,4]
 4 &*t;&*t;&*t; l*st6.remove(4)
 5 &*t;&*t;&*t; l*st6
 6 [1,4]
 7 &*t;&*t;&*t; 
 8 &*t;&*t;&*t; l*st6.cou*t(4)
 9 2
10 &*t;&*t;&*t; 
<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
*v>

L.**dex(var)&*bsp;&*bsp;&*bsp; #该元素的位置,无则抛异常&*bsp;

<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
1 &*t;&*t;&*t; l*st6
2 [1,4]
3 &*t;&*t;&*t; 
4 &*t;&*t;&*t; l*st6.cou*t(4)
5 2
6 &*t;&*t;&*t; l*st6.**dex(5)
7 3
8 &*t;&*t;&*t; 
<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
*v>

L.exte*d(l*st6)&*bsp; #追加l*st6,即合并l*st到L上

1 &*t;&*t;&*t; L
2 [1,19]
3 &*t;&*t;&*t; L.exte*d(l*st6)
4 &*t;&*t;&*t; L
5 [1,4]
6 &*t;&*t;&*t; 
*v>

这里注意,使用exte*d函数可以一次在一个列表中插入任意多个值,而不必须每次只使用appe*d()一次一值的插入:

L.sort()&*bsp;&*bsp;&*bsp;&*bsp;&*bsp;&*bsp;&*bsp; #排序

L.reverse()&*bsp;&*bsp;&*bsp;&*bsp; #倒序

<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
1 &*t;&*t;&*t; L
2 [1,4]
3 &*t;&*t;&*t; L.sort()
4 &*t;&*t;&*t; L
5 [1,65]
6 &*t;&*t;&*t; L.reverse()
7 &*t;&*t;&*t; L
8 [65,1]
9 &*t;&*t;&*t; 
<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
*v>

l*st 操作符:,+,*,关键字del

a[1:]&*bsp;&*bsp;&*bsp;&*bsp;&*bsp;&*bsp; #片段操作符,用于子l*st的提取
[1,2]+[3,4] #为[1,4]。同exte*d()
[2]*4&*bsp;&*bsp;&*bsp;&*bsp;&*bsp;&*bsp; #为[2,2]
del L[1]&*bsp;&*bsp;&*bsp; #删除指定下标的元素
del L[1:3]&*bsp; #删除指定下标范围的元素

<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
1 &*t;&*t;&*t; L
2 [65,1]
3 &*t;&*t;&*t; del L[1]
4 &*t;&*t;&*t; L
5 [65,1]
6 &*t;&*t;&*t; del L[0:3]
7 &*t;&*t;&*t; L
8 [12,1]
9 &*t;&*t;&*t; 
<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
*v>

复制l*st:

L1 = L&*bsp;&*bsp;&*bsp;&*bsp;&*bsp; #L1为L的别名,用C来说就是指针地址相同,对L1操作即对L操作。函数参数就是这样传递的
L1 = L[:]&*bsp;&*bsp; #L1为L的克隆,即另一个拷贝。

&*bsp;1&*bsp;&*t;&*t;&*t; l1 =&*bsp;L&*bsp;2&*bsp;&*t;&*t;&*t;&*bsp;l1&*bsp;3&*bsp;[12,1]&*bsp;4&*bsp;&*t;&*t;&*t; l1 = L[:]&*bsp;*>

&*bsp;

二,Tuple:元组**>

和列表类似,元组也是一种有序列表,虽然tuple和l*st非常之类似,但是l*st初始化之后使可以改变的,但是,元组一旦初始化之后就不可以改变。比如,同样的列出一组人的姓名:

1 &*t;&*t;&*t; tuple1 = ('wuya*l','wa**cc','wa***a**','de**dache**')
2 &*t;&*t;&*t; tuple1
3 ('wuya*l','de**dache**')
4 &*t;&*t;&*t; 
*v>

现在tuple1这个tuple不能变了,它也没有appe*d(),**sert()这样的方法。其他获取元素的方法和l*st是一样的,你可以正常地使用tuple1[0],tuple1[-1],但不能赋值成另外的元素。

不可变的tuple有什么意义?因为tuple不可变,所以代码更安全。如果可能,能用tuple代替l*st就尽量用tuple。

<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
1 &*t;&*t;&*t; tuple1[0]
2 'wuya*l'
3 &*t;&*t;&*t; tuple1[-1]
4 'de**dache**'
5 &*t;&*t;&*t; tuple1[4]
6 Traceback (most rece*t call last):
7   F*le "<std**&*t;",** <module&*t;
8 I*dexError: tuple **dex out of ra**e
9 &*t;&*t;&*t; #同样越界也是报出一个**dexError
<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
*v>

tuple的陷阱:当你定义一个tuple时,在定义的时候,tuple的元素就必须被确定下来,比如:

<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
 1 &*t;&*t;&*t; #定义一个空的元组
 2 ... 
 3 &*t;&*t;&*t; t = tuple()
 4 &*t;&*t;&*t; t
 5 ()
 6 &*t;&*t;&*t; t = (1,1)
 7 &*t;&*t;&*t; t
 8 (1,1)
 9 &*t;&*t;&*t; #定义一个只有一个元素的元组,可以这样定义:
10 ... 
11 &*t;&*t;&*t; t1 = (123,)
12 &*t;&*t;&*t; t1
13 (123,)
14 &*t;&*t;&*t; #如果你这样定义你定义的将是123这个元素,而不是一个元组
15 &*t;&*t;&*t; 
16 &*t;&*t;&*t; t2 = (123)
17 &*t;&*t;&*t; t2
18 123
19 &*t;&*t;&*t; 
<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
*v>

定义的不是tuple,是1这个数!这是因为括号()既可以表示tuple,又可以表示数学公式中的小括号,这就产生了歧义,因此,*ytho*规定,这种情况下,按小括号进行计算,计算结果自然是1

所以,只有1个元素的tuple定义时必须加一个逗号,,来消除歧义:

*ytho*在显示只有1个元素的tuple时,也会加一个逗号,,以免你误解成数学计算意义上的括号。

&*bsp;可以"改变"的tuple:

<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
1 &*t;&*t;&*t; tuple2 = ('aa','bb','cc',['a','b','c'],'dd')
2 &*t;&*t;&*t; tuple2
3 ('aa','dd')
4 &*t;&*t;&*t; tuple2[3][0] = '**'
5 &*t;&*t;&*t; tuple2[3][1] = 'YY'
6 &*t;&*t;&*t; tuple2
7 ('aa',['**','YY','dd')
8 &*t;&*t;&*t; #当一个元组中有列表时是可以改变元组的值的,其实实质是改变列表的值
<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
*v>

1.创建元组:

<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
 1 &*t;&*t;&*t; tuple1 = ('wudashe*','la**dache**','wa**che**che**')
 2 &*t;&*t;&*t; tuple2 = (1,6)
 3 &*t;&*t;&*t; tuple3 = "a","b","c","d"
 4 &*t;&*t;&*t; tuple1
 5 ('wudashe*','wa**che**che**')
 6 &*t;&*t;&*t; tuple2
 7 (1,6)
 8 &*t;&*t;&*t; tuple3
 9 ('a','c','d')
10 &*t;&*t;&*t; 
<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
*v>

创建一个空元组时可以直接创建一个括号,创建一个只有一个元素的元组时,必须在和面添加一个逗号(,):

<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
&*t;&*t;&*t; 
&*t;&*t;&*t; tuple4 = ()
&*t;&*t;&*t; tuple4
()
&*t;&*t;&*t; tuple5 = (1,)
&*t;&*t;&*t; tuple5
(1,)
&*t;&*t;&*t; 
<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
*v>

元组与字符串类似,下标索引从0开始,可以进行截取,组合等。

2.访问元组:

元组可以使用下标索引来访问元组中的值,如下实例:

<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
1 &*t;&*t;&*t; pr**t "tuple1[0]:",tuple1[0]
2 tuple1[0]: wudashe*
3 &*t;&*t;&*t; pr**t "tuple1[1:5]",tuple1[1:5]
4 tuple1[1:5] ('la**dache**','wa**che**che**')
5 &*t;&*t;&*t; pr**t "tuple2[1:5]",tuple2[1:5]
6 tuple2[1:5] (2,5)
7 &*t;&*t;&*t; 
<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
*v>

3.修改元组:

元组中的元素值是不允许修改的,但我们可以对元组进行连接组合,如下实例:

<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
 1 &*t;&*t;&*t; t1 = ('wuya*l','a*me*yu')
 2 &*t;&*t;&*t; t2 = (1,0)
 3 &*t;&*t;&*t; t1 
 4 ('wuya*l','a*me*yu')
 5 &*t;&*t;&*t; t2
 6 (1,0)
 7 &*t;&*t;&*t; t3 = t1 +t2
 8 &*t;&*t;&*t; t3
 9 ('wuya*l','a*me*yu',0)
10 &*t;&*t;&*t; 
<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
*v>

4.删除元组:

元组中的元素值是不允许删除的,但我们可以使用del语句来删除整个元组,如下实例:

<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
1 &*t;&*t;&*t; pr**t t1
2 ('wuya*l','a*me*yu')
3 &*t;&*t;&*t; del t1
4 &*t;&*t;&*t; t1
5 Traceback (most rece*t call last):
6   F*le "<std**&*t;",** <module&*t;
7 NameError: *ame 't1' *s *ot def**ed
8 &*t;&*t;&*t; 
<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
*v>

5.元组运算符:

与字符串一样,元组之间可以使用 + 号和 * 号进行运算。这就意味着他们可以组合和复制,运算后会生成一个新的元组。

&*bsp;

6.元组索引,截取:

因为元组也是一个序列,所以我们可以访问元组中的指定位置的元素,也可以截取索引中的一段元素,如下所示:

7. 元组的内置函数:

 (1),比较两个元组元素:cmp(tuple1,tuple2)

<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
 1 &*t;&*t;&*t; tuple1
 2 ('wudashe*','wa**che**che**')
 3 &*t;&*t;&*t; tuple2
 4 (1,6)
 5 &*t;&*t;&*t; cmp(tuple1,tuple2)
 6 1
 7 &*t;&*t;&*t; #两个元组不相等则返回1
 8 ... 
 9 &*t;&*t;&*t; tt1 = (1,3)
10 &*t;&*t;&*t; tt1
11 (1,3)
12 &*t;&*t;&*t; tt2 = (1,3)
13 &*t;&*t;&*t; tt2
14 (1,3)
15 &*t;&*t;&*t; cmp(tt1,tt2)
16 0
17 &*t;&*t;&*t; #两个元组相等则返回0
18 ... 
19 &*t;&*t;&*t; 
<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
*v>

(2),计算元组的长度:le*(tuple1):

<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
1 &*t;&*t;&*t; le*(tt1)
2 3
3 &*t;&*t;&*t; le*(tt2)
4 3
5 &*t;&*t;&*t; le*(tuple1)
6 3
7 &*t;&*t;&*t; le*(tuple2)
8 6
9 &*t;&*t;&*t; 
<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
*v>

(3),返回元组中的最大值:max(tuple2),m**(tuple2)

<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
 1 &*t;&*t;&*t; 
 2 &*t;&*t;&*t; max(tt1)
 3 3
 4 &*t;&*t;&*t; max(tuple1)
 5 'wudashe*'
 6 &*t;&*t;&*t; max(tuple2)
 7 6
 8 &*t;&*t;&*t; max(tuple3)
 9 'd'
10 &*t;&*t;&*t; m**(tt1)
11 1
12 &*t;&*t;&*t; m**(tuple3)
13 'a'
14 &*t;&*t;&*t; #返回元组中的最小值
<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
*v>

(4),将列表转换成元组:

1 &*t;&*t;&*t; l*st1
2 ['luot***','shab*e']
3 &*t;&*t;&*t; lt = tuple(l*st1)
4 &*t;&*t;&*t; lt
5 ('luot***','shab*e')
6 &*t;&*t;&*t; 
*v>

元组的知识就先介绍到这里,以下详细的来说一下重头戏--字典:

三,D*ct:字典**>

*ytho*内置了字典:d*ct的支持,d*ct全称d*ct*o*ary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。

在这里可以举一个例子,假如你通过列表来查看工人的名字和对应的工资的话,在这里你需要设置两个列表,一个用于存储名字,一个用于存储工资:

<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
1 &*t;&*t;&*t; *ame = ['zha**sa*','l*s*','wa**wu','doub*e']
2 &*t;&*t;&*t; *ame
3 ['zha**sa*','doub*e']
4 &*t;&*t;&*t; salary = [20000,30000,200000,123000]
5 &*t;&*t;&*t; salary
6 [20000,123000]
7 &*t;&*t;&*t; 
<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
*v>

给定一个名字,要查找对应的成绩,就先要在*ame中找到对应的位置,再从salary取出对应的成绩,l*st越长,耗时越长。

如果用d*ct实现,只需要一个“名字”-“薪水”的对照表,直接根据名字查找成绩,无论这个表有多大,查找速度都不会变慢。

用*ytho*写一个d*ct如下:

1 &*t;&*t;&*t; d*ct1 = {'zha**sa*':30000,'l*s*':321000,'wa**er':123654,'wa**wu':123878}
2 &*t;&*t;&*t; d*ct1
3 {'l*s*': 321000,'zha**sa*': 30000,'wa**er': 123654,'wa**wu': 123878}
4 &*t;&*t;&*t; 
*v>

为什么d*ct查找速度这么快?因为d*ct的实现原理和查字典是一样的。假设字典包含了1万个汉字,我们要查某一个字,一个办法是把字典从第一页往后翻,直到找到我们想要的字为止,这种方法就是在l*st中查找元素的方法,l*st越大,查找越慢。

第二种方法是先在字典的索引表里(比如部首表)查这个字对应的页码,然后直接翻到该页,找到这个字,无论找哪个字,这种查找速度都非常快,不会随着字典大小的增加而变慢。

d*ct就是第二种实现方式,给定一个名字,比如'zha**sa*',d*ct在内部就可以直接计算出zha**sa*l对应的存放成绩的“页码”,也就是30000这个数字存放的内存地址,直接取出来,所以速度非常快。

你可以猜到,这种key-value存储方式,在放进去的时候,必须根据key算出value的存放位置,这样,取的时候才能根据key直接拿到value。

把数据放入d*ct的方法,除了初始化时指定外,还可以通过key放入:

<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
 1 &*t;&*t;&*t; d*ct1 = {'zha**sa*':30000,'wa**wu':123878}
 2 &*t;&*t;&*t; d*ct1
 3 {'l*s*': 321000,'wa**wu': 123878}
 4 &*t;&*t;&*t; d*ct1['zha**sa*']
 5 30000
 6 &*t;&*t;&*t; d*ct1['wa**wu']
 7 123878
 8 &*t;&*t;&*t; d*ct1['l*s*']
 9 321000
10 &*t;&*t;&*t; 
<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
*v>

油魚一個key只能對應一个值,因此,倘若你多次对同一个key赋值的话,以前赋的值会被覆盖掉。

<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
1 &*t;&*t;&*t; d*ct1
2 {'l*s*': 321000,'wa**wu': 123878}
3 &*t;&*t;&*t; d*ct1['zha**sa*'] = 1000000
4 &*t;&*t;&*t; d*ct1
5 {'l*s*': 321000,'zha**sa*': 1000000,'wa**wu': 123878}
6 &*t;&*t;&*t; d*ct1['zha**sa*'] = 100
7 &*t;&*t;&*t; d*ct1
8 {'l*s*': 321000,'zha**sa*': 100,'wa**wu': 123878}
9 &*t;&*t;&*t; 
<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
*v>

如果你想赋值的key不存在就会报错:

<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
 1 &*t;&*t;&*t; d*ct1['x*dada'] = 4563221
 2 &*t;&*t;&*t; d*ct1
 3 {'l*s*': 321000,'x*dada': 4563221,'wa**wu': 123878}
 4 &*t;&*t;&*t; d*ct1['wa**cc']
 5 Traceback (most rece*t call last):
 6   F*le "<std**&*t;",** <module&*t;
 7 KeyError: 'wa**cc'
 8 &*t;&*t;&*t; d*ct1['wyl'] = 888888
 9 &*t;&*t;&*t; d*ct1
10 {'wa**er': 123654,'l*s*': 321000,'wa**wu': 123878,'wyl': 888888,'zha**sa*': 100}
11 &*t;&*t;&*t; 
<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
*v>

由以上的代码可以看出,当你的字典中没有这个key,但是你还给这个key赋值的话,是不会报错的,并且你的值可以插入这个字典中,但是假如你访问一个没有的key值,就会报出一个KeyError,

&*bsp;因此,要想判断key值是否存在,可以有两个方法。

方法一:使用**语句判断:

<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
1 &*t;&*t;&*t; d*ct1
2 {'wa**er': 123654,'zha**sa*': 100}
3 &*t;&*t;&*t; 'zha**sa*' ** d*ct1
4 True
5 &*t;&*t;&*t; 'l*udehua' ** d*ct1
6 False
7 &*t;&*t;&*t; d*ct1
<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
*v>

方法二:使用d*ct提供的*et()方法,若key值不存在就返回No*e或者自己指定的返回值:

1 &*t;&*t; d*ct1
2 {'wa**er': 123654,'zha**sa*': 100}
3 &*t;&*t;&*t; d*ct1.*et('zha**dada','*ot a*y')
4 '*ot a*y'
5 &*t;&*t;&*t; #使用自己定义的返回值
*v> <*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
1 &*t;&*t;&*t; d*ct1
2 {'wa**er': 123654,'zha**sa*': 100}
3 &*t;&*t;&*t; 
4 &*t;&*t; d*ct1.*et('zha**sa*')
5 100
6 &*t;&*t;&*t; d*ct1.*et('x*elaoda')
7 &*t;&*t;&*t; #什么都没有返回(NONE)
8 ... 
9 &*t;&*t;&*t; 
<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
*v>

注意:返回No*e的时候*ytho*的交互式命令行不显示结果。

和列表和元组类似,当你要删除一个字典值的时候,你可以使用pop(key)的方法达到删除字典元素的目的:

<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
 1 &*t;&*t;&*t; d*ct1
 2 {'wa**er': 123654,'zha**sa*': 100}
 3 &*t;&*t;&*t; d*ct1.pop('wa**er')
 4 123654
 5 &*t;&*t;&*t; d*ct1
 6 {'x*dada': 4563221,'zha**sa*': 100}
 7 &*t;&*t;&*t; d*ct1.pop('x*dada')
 8 4563221
 9 &*t;&*t;&*t; d*ct1
10 {'l*s*': 321000,'zha**sa*': 100}
11 &*t;&*t;&*t; 
<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
*v>

注意,d*ct内部存放的顺序和key放入的顺序是没有关系的。

和l*st比较,d*ct有以下几个特点:

    查找和插入的速度极快,不会随着key的增加而增加;*> 需要占用大量的内存,内存浪费多。*>

而l*st相反:

    查找和插入的时间随着元素的增加而增加;*> 占用空间小,浪费内存很少。*>

所以,d*ct是用空间来换取时间的一种方法。

d*ct可以用在需要高速查找的很多地方,在*ytho*代码中几乎无处不在,正确使用d*ct非常重要,需要牢记的第一条就是d*ct的key必须是不可变对象**>。

这是因为d*ct根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那d*ct内部就完全混乱了。这个通过key计算位置的算法称为哈希算法(Hash)。

要保证hash的正确性,作为key的对象就不能变。在*ytho*中,字符串、整数等都是不可变的,因此,可以放心地作为key。而l*st是可变的,就不能作为key:

&*bsp;

字典的高级应用:

<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
 1 &*t;&*t;&*t; d*ct2 = {'a':1,'b':2,'c':3}
 2 &*t;&*t;&*t; d*ct2
 3 {'a': 1,'c': 3,'b': 2}
 4 &*t;&*t;&*t; d*ct3 = d*ct2
 5 &*t;&*t;&*t; d*ct3
 6 {'a': 1,'b': 2}
 7 &*t;&*t;&*t; del d*ct2['a'] #删除key为'a'的条目
 8 &*t;&*t;&*t; d*ct2
 9 {'c': 3,'b': 2}
10 &*t;&*t;&*t; d*ct2.clear()
11 &*t;&*t;&*t; d*ct2.clear()
12 &*t;&*t;&*t; d*ct2.clear()#清空字典;
13 &*t;&*t;&*t; d*ct2
14 {}
15 &*t;&*t;&*t; del d*ct2 #直接删除整个字典
16 &*t;&*t;&*t; d*ct2
17 Traceback (most rece*t call last):
18   F*le "<std**&*t;",** <module&*t;
19 NameError: *ame 'd*ct2' *s *ot def**ed
20 &*t;&*t;&*t; #删除之后再输出d*ct2字典确实出错了
21 ... 
22 &*t;&*t;&*t; 
<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
*v>

字典键的特性:

(1),在字典中同一个key不可以出现两次或以上:

1 &*t;&*t;&*t; d*ct4 = {'*ame':123,'*ame':1236}
2 &*t;&*t;&*t; d*ct4
3 {'*ame': 1236}
4 &*t;&*t;&*t; #两次设置*ame但是只显示一次
*v>

(2),键必须不可变,所以可以用数,字符串或元组充当,所以用列表就不行,如下实例:换言之就是

1 &*t;&*t;&*t; d*ct4 = {'*ame1':123,'*ame2':1236,'*ame3':1}
2 &*t;&*t;&*t; d*ct4
3 {'*ame2': 1236,'*ame3': 1,'*ame1': 123}
4 &*t;&*t;&*t; 
*v>

字典的内置函数和方法:

(1),字典中的cmp函数用于比较两个字典是不是相等的:

<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
1 &*t;&*t;&*t; d*c1 = {'a':1,'c':3}
2 &*t;&*t;&*t; d*c2 = d*c1
3 &*t;&*t;&*t; d*c3 = {'e':3,'r':5,'y':7}
4 &*t;&*t;&*t; cmp(d*c1,d*c2)
5 0
6 &*t;&*t;&*t; cmp(d*c2,d*c3)
7 -1
8 &*t;&*t;&*t; #两个字典比较,如果相同就返回0 否则返回-1
9 ... #cmp函数就是用于比较两个字典是不是相等的字典内置函数
<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
*v>

(2),le*(d*ct):计算字典元素个数,即键的总数。

<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
1 &*t;&*t;&*t; le*(d*c1)
2 3
3 &*t;&*t;&*t; le*(d*c2)
4 3
5 &*t;&*t;&*t; le*(d*c3)
6 3
7 &*t;&*t;&*t; le*(d*ct1)
8 4
9 &*t;&*t;&*t; 
<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
*v>

(3),str(d*ct):输出字典可打印的字符串表示。

<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
1 &*t;&*t;&*t; str(d*c1)
2 "{'a': 1,'b': 2}"
3 &*t;&*t;&*t; str(d*c2)
4 "{'a': 1,'b': 2}"
5 &*t;&*t;&*t; str(d*c3)
6 "{'y': 7,'r': 5,'e': 3}"
7 &*t;&*t;&*t; str(d*ct1)
8 "{'l*s*': 321000,'zha**sa*': 100}"
9 &*t;&*t;&*t; 
<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
*v>

(4),type(var*able):返回输入的变量类型,如果变量是字典就返回字典类型。

<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
1 &*t;&*t;&*t; type(d*c1)
2 <type 'd*ct'&*t;
3 &*t;&*t;&*t; type(d*c2)
4 <type 'd*ct'&*t;
5 &*t;&*t;&*t; type(d*ct1)
6 <type 'd*ct'&*t;
7 &*t;&*t;&*t; 
<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
*v>

&*bsp;

*ytho*字典包含了以下内置方法:
1、rad*a*sd*ct.clear():删除字典内所有元素

1 &*t;&*t;&*t; d*c1
2 {'a': 1,'b': 2}
3 &*t;&*t;&*t; d*c1.clear()
4 &*t;&*t;&*t; d*c1
5 {}
6 &*t;&*t;&*t; 
*v>

2、rad*a*sd*ct.copy():返回一个字典的浅复制

<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
1 &*t;&*t;&*t; d*c3
2 {'y': 7,'e': 3}
3 &*t;&*t;&*t; d*c3.copy()
4 {'y': 7,'e': 3}
5 &*t;&*t;&*t; d*c3
6 {'y': 7,'e': 3}
7 &*t;&*t;&*t; 
<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
*v>

3、rad*a*sd*ct.fromkeys():创建一个新字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值

4、rad*a*sd*ct.*et(key,default=No*e):返回指定键的值,如果值不在字典中返回default值

1 &*t;&*t;&*t; d*ct1.*et('zha**xueyou','*ot a*y')
2 '*ot a*y'
3 &*t;&*t;&*t; 
*v>

5、rad*a*sd*ct.has_key(key):如果键在字典d*ct里返回true,否则返回false

<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
1 &*t;&*t;&*t; d*ct1
2 {'l*s*': 321000,'zha**sa*': 100}
3 &*t;&*t;&*t; d*ct1.has_key('wa**wu')
4 True
5 &*t;&*t;&*t; d*ct1.has_key('wa**')
6 False
7 &*t;&*t;&*t; 
<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
*v>

6、rad*a*sd*ct.*tems():以列表返回可遍历的(键,值) 元组数组

1 &*t;&*t;&*t; d*ct1.*tems()
2 [('l*s*',321000),('wa**wu',123878),('wyl',888888),('zha**sa*',100)]
3 &*t;&*t;&*t; 
*v>

7、rad*a*sd*ct.keys():以列表返回一个字典所有的键

1 &*t;&*t;&*t; l*st2 = {'a':1,'c':3,'d':4}
2 &*t;&*t;&*t; l*st2
3 {'a': 1,'b': 2,'d': 4}
4 &*t;&*t;&*t; l*st2.keys()
5 ['a','d']
6 &*t;&*t;&*t; 
*v>

8、rad*a*sd*ct.setdefault(key,default=No*e):和*et()类似,但如果键不已经存在于字典中,将会添加键并将值设为default

9、rad*a*sd*ct.update(d*ct2):把字典d*ct2的键/值对更新到d*ct里

10、rad*a*sd*ct.values():以列表返回字典中的所有值

1 &*t;&*t;&*t; l*st2
2 {'a': 1,'d': 4}
3 &*t;&*t;&*t; l*st2.values()
4 [1,4]
5 &*t;&*t;&*t; 
*v>

四,set

本来,打算只讲一下字典,元组,列表的一些基本用法,但是现在扩展探讨一下pytho*中的set的用法:

set和d*ct类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。

要创建一个set,需要提供一个l*st作为输入集合:

&*bsp;1&*bsp;&*t;&*t;&*t; s = set([1,9])&*bsp;2&*bsp;&*t;&*t;&*t;&*bsp;s&*bsp;3&*bsp;set([1,9])&*bsp;4&*bsp;&*t;&*t;&*t;&*bsp;&*bsp;*>

注意,传入的参数[1,3]是一个l*st,而显示的set([1,3])只是告诉你这个set内部有1,2,3这3个元素,显示的[]不表示这是一个l*st。

重复元素在set中自动被过滤:

<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
1 &*t;&*t;&*t; s = set([1,9])
2 &*t;&*t;&*t; s
3 set([1,9])
4 &*t;&*t;&*t; s = set([1,89,97,7])
5 &*t;&*t;&*t; s
6 set([1,89])
7 &*t;&*t;&*t; 
<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
*v>

这一点,有点想数学中的集合的互异性类似。

在此,你还可以使用add()方法添加元素到set找你刚,当你重复添加的时候是不会报错的,只是不会在set中看到重复的值,它会自己过虐掉的。

<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
1 &*t;&*t;&*t; s
2 set([1,89])
3 &*t;&*t;&*t; s.add(100)
4 &*t;&*t;&*t; s.add(100)
5 &*t;&*t;&*t; s.add(123)
6 &*t;&*t;&*t; s.add(321)
7 &*t;&*t;&*t; s
8 set([1,321,100])
9 &*t;&*t;&*t; 
<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
*v>

若你想删除set中的值,你可以使用方法remove(key)达到你想要的效果。

1 &*t;&*t;&*t; s
2 set([1,123])
3 &*t;&*t;&*t; s.remove(1)
4 &*t;&*t;&*t; s
5 set([2,123])
6 &*t;&*t;&*t; 
*v>

set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作:

<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
 1 &*t;&*t;&*t; s1 = set([1,9])
 2 &*t;&*t;&*t; s1
 3 set([1,9])
 4 &*t;&*t;&*t; s2 = set([4,6])
 5 &*t;&*t;&*t; s2
 6 set([2,6])
 7 &*t;&*t;&*t; s1 & s2
 8 set([2,6])
 9 &*t;&*t;&*t; s1 | s2
10 set([1,9])
11 &*t;&*t;&*t; 
<*m* src="https://commo*.c*blo*s.com/*ma*es/copycode.**f" alt="复制代码" />*>*v>
*v>

set和d*ct的唯一区别仅在于没有存储对应的value,但是,set的原理和d*ct一样,所以,同样不可以放入可变对象,因为无法判断两个可变对象是否相等,也就无法保证set内部“不会有重复元素”。试试把l*st放入set,看看是否会报错。

&*bsp;

转载自:https://www.c*blo*s.com/blo*ofwyl/p/4284131.html*>

原文地址:https://www.cnblogs.com/zmdComeOn

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Python中的函数(二) 在上一篇文章中提到了Python中函数的定义和使用,在这篇文章里我们来讨论下关于函数的一些更深的话题。在学习C语言函数的时候,遇到的问题主要有形参实参的区别、参数的传递和改变、变量的作用域。同样在Python中,关于对函数的理解和使用也存在这些问题。下面来逐一讲解。一.函
Python中的字符串 可能大多数人在学习C语言的时候,最先接触的数据类型就是字符串,因为大多教程都是以&quot;Hello world&quot;这个程序作为入门程序,这个程序中要打印的&quot;Hello world&quot;就是字符串。如果你做过自然语言处理方面的研究,并且用Python
Python 面向对象编程(一) 虽然Python是解释性语言,但是它是面向对象的,能够进行对象编程。下面就来了解一下如何在Python中进行对象编程。一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法。 类是对现实世界中一些事物的封装,
Python面向对象编程(二) 在前面一篇文章中谈到了类的基本定义和使用方法,这只体现了面向对象编程的三大特点之一:封装。下面就来了解一下另外两大特征:继承和多态。 在Python中,如果需要的话,可以让一个类去继承一个类,被继承的类称为父类或者超类、也可以称作基类,继承的类称为子类。并且Pytho
Python中的函数(一) 接触过C语言的朋友对函数这个词肯定非常熟悉,无论在哪门编程语言当中,函数(当然在某些语言里称作方法,意义是相同的)都扮演着至关重要的角色。今天就来了解一下Python中的函数用法。一.函数的定义 在某些编程语言当中,函数声明和函数定义是区分开的(在这些编程语言当中函数声明
在windows下如何快速搭建web.py开发框架 用Python进行web开发的话有很多框架供选择,比如最出名的Django,tornado等,除了这些框架之外,有一个轻量级的框架使用起来也是非常方便和顺手,就是web.py。它由一名黑客所创建,但是不幸的是这位创建者于2013年自杀了。据说现在由
将Sublime Text 2搭建成一个好用的IDE 说起编辑器,可能大部分人要推荐的是Vim和Emacs,本人用过Vim,功能确实强大,但是不是很习惯,之前一直有朋友推荐SUblime Text 2这款编辑器,然后这段时间就试了一下,就深深地喜欢上这款编辑器了...
Python中的模块 有过C语言编程经验的朋友都知道在C语言中如果要引用sqrt这个函数,必须用语句&quot;#include&lt;math.h&gt;&quot;引入math.h这个头文件,否则是无法正常进行调用的。那么在Python中,如果要引用一些内置的函数,该怎么处理呢?在Python中
Python的基础语法 在对Python有了基础的认识之后,下面来了解一下Python的基础语法,看看它和C语言、java之间的基础语法差异。一.变量、表达式和语句 Python中的语句也称作命令,比如print &quot;hello python&quot;这就是一条语句。 表达式,顾名思义,是
Eclipse+PyDevʽjango+Mysql搭建Python web开发环境 Python的web框架有很多,目前主流的有Django、Tornado、Web.py等,最流行的要属Django了,也是被大家最看好的框架之一。下面就来讲讲如何搭建Django的开发环境。一.准备工作 需要下载的
在windows下安装配置Ulipad 今天推荐一款轻便的文本编辑器Ulipad,用来写一些小的Python脚本非常方便。 Ulipad下载地址: https://github.com/limodou/ulipad http://files.cnblogs.com/dolphin0520/u...
Python中的函数(三) 在前面两篇文章中已经探讨了函数的一些相关用法,下面一起来了解一下函数参数类型的问题。在C语言中,调用函数时必须依照函数定义时的参数个数以及类型来传递参数,否则将会发生错误,这个是严格进行规定的。然而在Python中函数参数定义和传递的方式相比而言就灵活多了。一.函数参数的
在Notepad++中搭配Python开发环境 Python在最近几年一度成为最流行的语言之一,不仅仅是因为它简洁明了,更在于它的功能之强大。它不仅能够完成一般脚本语言所能做的事情,还能很方便快捷地进行大规模的项目开发。在学习Python之前我们来看一下Python的历史由来,&quot;Pytho
Python中的条件选择和循环语句 同C语言、Java一样,Python中也存在条件选择和循环语句,其风格和C语言、java的很类似,但是在写法和用法上还是有一些区别。今天就让我们一起来了解一下。一.条件选择语句 Python中条件选择语句的关键字为:if 、elif 、else这三个。其基本形式如
关于raw_input( )和sys.stdin.readline( )的区别 之前一直认为用raw_input( )和sys.stdin.readline( )来获取输入的效果完全相同,但是最近在写程序时有类似这样一段代码:import sysline = sys.stdin.readline()
初识Python 跟学习所有的编程语言一样,首先得了解这门语言的编程风格和最基础的语法。下面就让我们一起来了解一下Python的编程风格。1.逻辑行与物理行 在Python中有逻辑行和物理行这个概念,物理行是指在编辑器中实际看到的一行,逻辑行是指一条Python语句。在Python中提倡一个物理行只
当我们的代码是有访问网络相关的操作时,比如http请求或者访问远程数据库,经常可能会发生一些错误,有些错误可能重新去发送请求就会成功,本文分析常见可能需要重试的场景,并最后给出python代码实现。
1.经典迭代器 2.将Sentence中的__iter__改成生成器函数 改成生成器后用法不变,但更加简洁。 3.惰性实现 当列表比较大,占内存较大时,我们可以采用惰性实现,每次只读取一个元素到内存。 或者使用更简洁的生成器表达式 4.yield from itertools模块含有大量生成器函数可
本文介绍简单介绍socket的常用函数,并以python-kafka中的源码socketpair为例,来讲解python socket的运用
python实践中经常出现编码相关的异常,大多网上找资料而没有理解原理,导致一次次重复错误。本文对常用Unicode、UTF-8、GB2312编码的原理进行介绍,接着介绍了python字符类型unicode和str以及常见编解码错误UnicodeEncodeError和UnicodeDEcodeEr