判断python字典中key是否存在的两种方法

使用自带函数实现

python的字典的属性方法里面有一个has_key()方法,可以直接判断字典中是否有某个key

1
2
3
4
5
>>> dic = {"name":"duanmuxu", "sex":"male"}
>>> dic.has_key("name")
True
>>> dic.has_key("address")
False

in方法做判断

1
2
3
4
5
>>> dic = {"name":"duanmuxu", "sex":"male"}
>>> "name" in dic.keys()
True
>>> "address" in dic.keys()
False

同理,not in 方法也可做判断

1
2
3
4
5
>>> dic = {"name":"duanmuxu", "sex":"male"}
>>> "name" not in dic.keys()
False
>>> "address" not in dic.keys()
True

input()和raw_input()的区别

版本差异

  • Python2.X 中input()和raw_input()都可使用
  • Python3.X 中只能使用input(),raw_input()已经与input()结合了

输入格式差异

以下代码使用Python2.X版本实现

raw_input()
1
2
3
4
5
6
7
8
9
10
11
12
>>> name= raw_input('输入姓名:')
输入姓名:duanmuxu
>>> name
'duanmuxu'
>>> type(name)
<type 'str'>
>>> age= raw_input('输入年龄:')
输入年龄:21
>>> age
'21'
>>> type(age)
<type 'str'>

对于任何类型的数据都是直接输入,返回一个字符串类型的变量

input()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
>>> name= input('输入姓名:')
输入姓名:duanmuxu
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1, in <module>
NameError: name 'duanmuxu' is not defined
>>> name= input('输入姓名:')
输入姓名:'duanmuxu'
>>> name
'duanmuxu'
>>> type(name)
<type 'str'>
>>> age= input('输入年龄:')
输入年龄:21
>>> age
21
>>> type(age)
<type 'int'>

需要根据输入数据的类型进行输入,字符串型数据输入时加上 ‘ ‘,数字就是数字

使用场景
  • 输入的类型为字符的时候可以用raw_input(),当然不怕麻烦也可以用input()手动加引号

  • int类型的时候最好用input()

Python 随机数函数

随机数可以用于数学,游戏,安全等领域中,还经常被嵌入到算法中,用以提高算法效率,并提高程序的安全性。

choice() 函数

描述

choice() 方法返回一个列表,元组或字符串的随机项。

使用
1
2
3
4
5
import random

random.choice(seq)

# seq -- 可以是一个列表,元组或字符串。
实例
1
2
3
4
5
6
7
8
9
#!/usr/bin/env python
import random

print "choice([1, 2, 'a', 'b']) : ", random.choice([1, 2, 'a', 'b'])
print "choice('String') : ", random.choice('String')

# 输出:
choice([1, 2, 'a', 'b']) : a
choice('String') : S

randrange() 函数

描述

randrange() 方法返回指定递增基数集合中的一个随机数,基数缺省值为1。

使用
1
2
3
import random

random.randrange ([start,] stop [,step])
  • start – 指定范围内的开始值,包含在范围内。
  • stop – 指定范围内的结束值,不包含在范围内。
  • step – 指定递增基数。
实例
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import random

# 输出 100 <= number < 1000 间的偶数
print "randrange(100, 1000, 2) : ", random.randrange(100, 1000, 2)

# 输出 100 <= number < 1000 间的其他数
print "randrange(100, 1000, 3) : ", random.randrange(100, 1000, 3)

# 输出:
randrange(100, 1000, 2) : 762
randrange(100, 1000, 3) : 532

random() 函数

描述

random() 方法返回随机生成的一个实数,它在[0,1)范围内。

使用
1
2
3
import random

random.random()
实例
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import random

for i in range(0, 3):
print "第%s个随机数:" %(i+1) , random.random()

# 输出:
第1个随机数: 0.683753845699
第2个随机数: 0.146315223384
第3个随机数: 0.328288508196

seed() 函数

描述

seed() 方法改变随机数生成器的种子,可以在调用其他随机模块函数之前调用此函数。

Random初始化的时候,可以以一个INT32作为参数,称为seed,MSDN上的解释是:“伪随机数是以相同的概率从一组有限的数字中选取的……随机数的生成是从种子值开始……”

也就是说,当seed的值设为一样时,所产生的随机数也是相同的

使用
1
2
3
import random

random.seed ( [x] )

x – 改变随机数生成器的种子seed。

实例
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import random

for i in range(0, 3):
random.seed(5)
print "第%s个随机数:" %(i+1) , random.random()

# 输出:
第1个随机数: 0.62290169489
第2个随机数: 0.62290169489
第3个随机数: 0.62290169489

shuffle() 函数

描述

shuffle() 方法将序列的所有元素随机排序。

使用
1
2
3
import random

random.shuffle (lst )

lst – 可以是一个列表。

实例
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import random

li = [1, 2, 3, 4, 5]
for i in range(1, 4):
random.shuffle(li)
print "第%s次随机排序列表,结果是:" %i , li

# 输出:
第1次随机排序列表,结果是: [4, 1, 2, 3, 5]
第2次随机排序列表,结果是: [4, 3, 2, 5, 1]
第3次随机排序列表,结果是: [1, 3, 4, 5, 2]

uniform() 函数

描述

uniform() 方法将随机生成下一个实数,它在 [x, y] 范围内。

使用
1
2
3
import random

random.uniform(x, y)
  • x – 随机数的最小值,包含该值。
  • y – 随机数的最大值,不包含该值。
  • 返回一个浮点数 N,取值范围为如果 x<y 则 x <= N < y,如果 y<x 则y <= N < x。
实例
1
2
3
4
5
6
7
8
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import random

print "uniform(3, 6)生成的随机数为:",random.uniform(3, 6)

# 输出
uniform(3, 6)生成的随机数为: 3.71157971278

r/R 打印原始字符串

有时候字符串中带有 \n 、 \t 等特殊字符,会被识别成特殊操作而不被输出。此时在字符串前加上 r/R 即可打印原始字符串

1
2
3
4
5
6
7
>>> print "原始字符串\n"
原始字符串

>>> print r"原始字符串\n"
原始字符串\n
>>> print R"原始字符串\n"
原始字符串\n

三引号(triple quotes)

python三引号允许一个字符串跨多行,字符串中可以包含换行符、制表符以及其他特殊字符。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
HTML_wd = '''
<HTML><HEAD><TITLE>
Friends CGI Demo</TITLE></HEAD>
<BODY><H3>ERROR</H3>
<B>%s</B><P>
<FORM><INPUT TYPE=button VALUE=Back
ONCLICK="window.history.back()"></FORM>
</BODY></HTML>
'''
print HTML_wd

# 输出:
<HTML><HEAD><TITLE>
Friends CGI Demo</TITLE></HEAD>
<BODY><H3>ERROR</H3>
<B>%s</B><P>
<FORM><INPUT TYPE=button VALUE=Back
ONCLICK="window.history.back()"></FORM>
</BODY></HTML>

所见即所得

直接赋值(=)、浅拷贝(copy)和深度拷贝(deepcopy)

  • 直接赋值:其实就是对象的引用(别名)。
  • 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。
  • 深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。

直接上例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/env python
# -*-coding:utf-8 -*-

import copy
a = [1, 2, 3, 4, ['a', 'b']] #原始对象

b = a #赋值,传对象的引用
c = copy.copy(a) #对象拷贝,浅拷贝
d = copy.deepcopy(a) #对象拷贝,深拷贝

a.append(5) #修改对象a
a[4].append('c') #修改对象a中的['a', 'b']数组对象

print( 'a = ', a )
print( 'b = ', b )
print( 'c = ', c )
print( 'd = ', d )

# 输出:
('a = ', [1, 2, 3, 4, ['a', 'b', 'c'], 5])
('b = ', [1, 2, 3, 4, ['a', 'b', 'c'], 5])
('c = ', [1, 2, 3, 4, ['a', 'b', 'c']])
('d = ', [1, 2, 3, 4, ['a', 'b']])
  • b = a: 赋值引用,a 和 b 都指向同一个对象。
  • b = a.copy(): 浅拷贝, a 和 b 是一个独立的对象,但他们的子对象还是指向统一对象(是引用)。
  • b = copy.deepcopy(a): 深度拷贝, a 和 b 完全拷贝了父对象及其子对象,两者是完全独立的。