字典
- 又称为(# hash,映射,关联数组)
- “字” —> 先找首字母,查到这个字的解释所在的页数;
字典的定义:
d = {}
d = {"key1":"value1"}
d = {"key1":"value1","key2":"value3"}
a=("name","age")
b=("hallo","18")
d=dict(zip(a,b))
d ##{'name': 'hallo', 'age': '18'}
字典的特性
- 字典是可变数据类型;可使用len(d)内置函数,计算字典的长度;
- 字典是无序的,与序列(str,list,tuple)不同的是,不支持索引,切片,连接与重复。只能通过key值获取对应的value值;
- 字典支持异构,支持嵌套;
python字典的一些方法:
dict.clear ##清空字典
dict.get ##查询是否存在某个key
dict.iteritems
dict.keys
dict.setdefault
dict.viewitems
dict.copy ##拷贝字典,id会改变
dict.has_key
dict.iterkeys
dict.pop ##根据key删除值
dict.update ##更新字典,往字典里添加元素
dict.viewkeys
dict.fromkeys
dict.items
dict.itervalues
dict.popitem ##随机删除
dict.values
dict.viewvalues
del(dict['key']) ##删除指定的key
del(dict) ##删除字典
字典的增加
d.update()
d.setdefault(key[,value])
## 如果key存在,不更改;如果key不存在,添加key-value到字典中;
## 如果key值有,并不存在d字典中,默认value值为None;
字典的删除
d.pop(key) ## 根据某个key值删除字典中的key-value值;
d.popitem() ## 随机删除key-value值
d.clear() ## 清空字典的所有内容,字典还存在
del(d["key"]) ## 删除指定的key值
del(d) ## 删除字典d,d直接不存在
字典的修改
d["key2"]="value3"
字典信息的查看
d.get("key") # 如果key存在,返回value值;如果不存在,返回None;
d["key"] # 如果key存在,返回value值;如果不存在,直接报错;
d.has_keys("key") # 如果key存在,返回True;如果不存在,返回False;
d.items()
d.keys()
d.values()
注意:如何遍历字典的所有key-value值:
for key,value in d.items():
print key, value
字典的复制
d.copy()
In [105]: d1 = d.copy()
In [106]: id(d)
Out[106]: 20314528
In [107]: id(d1)
Out[107]: 20338192
In [108]: d2 = d
In [109]: id(d2)
Out[109]: 20314528
字典支持异构、嵌套
d = {
"172.25.254.143":
{
"user":"root",
"password":"westos",
"command":"hostname"
},
"172.25.254.243":
{
"user":"westos",
"password":"westos1",
"command":"hostname"
}
}
常用用法示例
a=("name","age")
b=("hallo","18")
d=dict(zip(a,b))
d ##{'name': 'hallo', 'age': '18'}
d.items() ##[('name', 'hallo'), ('age', '18')]
d.values() ##['hallo', '18']
d.keys() ##['name', 'age']
d.update("weight","65")
d ##{'name': 'hallo', 'age': '18', 'weight': '65'}
for key,value in d.items():
print "k=",key,"v=",value
## k= name v= hallo
## k= age v= 18
## k= weight v= 65
i=d.iteritems()
i.next() ##('name', 'hallo')
i.next() ##('age', '18')
del(d) ##删除字典
函数(python的乐高积木一)
内置函数(BIF,built-in function)
min,max,sum,zip,abs,
int,float,str,list,tuple,bool,
函数实质上是一个变量;函数名是一个指向函数对象的引用,完全可以把函数赋值给一个变量,相当于给这个函数起了个别名;
In [59]: a = abs # a变量指向abs函数
In [60]: a(-1) # 可以通过a实现abs的功能;
Out[60]: 1
In [61]: abs(-1)
Out[61]: 1
定义与调用函数
def 函数名([形式参数]): ##函数定义
函数体 ## 函数要执行的程序
return 返回值 ## 如果没有return返回,默认返回值为None;
函数名([实参]) ##调用函数
注意:有返回值 的函数,用print fun()可以打印出返回值;
函数的返回值
- 在函数中,一旦遇到return关键字,函数就执行结束;
- 函数返回值只能返回一个,如果想间接返回多个值,返回值实际是一个元组;
def maxSum(num1,num2,num3):
print num2
return max(num1,num2,num3),sum([num1,num2,num3])
num1 += 2
print num1
print type(maxSum(1,4,2))
print maxSum(1,4,2)
函数的参数传值
- 必选参数:形参与实参的个数必须相同,否则直接报错;
- 默认参数:在定义函数时,给形参一个默认值;
- 可变参数:传入的参数个数是可变的,可以是1-n个,也可以是0个;一般实参中用*args来表示可变参数;
args接收的是一个元组(tuple),例如:
def func(*arg):
print "len=\t",len(arg)
for i in arg:
print"i=\t", i
func(1,2,3,4)
变量的作用域
- 全局参数:在函数外定义的函数
- 局部参数:在函数内部定义的函数;
- global:声明局部变量为全局变量;
name = "westos"
def fun():
name="hello"
fun()
print "name=",name ##westos
++++++++++++++++++++++++++++++++++++++
name = "westos"
def fun():
global name
name="hello"
fun()
print "name=",name ##hello
编程练习:
- 实现一个简单的用户管理系统,有用户的注册、登录、退出、注销、查看,并且设置一定的用户权限。
示例代码如下:
def UserManage():
print"""
欢迎来到用户管理系统
请选择你的操作
#########################################
(A|a) :添加一个用户
(D|d) :删除一个用户
(V|v) :查看用户信息
(I|i) :用户登陆
(O|o) :用户登出
(Q|q) :退出系统
"""
flag = True
UserLogin = False
UserName = ''
UserDict={'student':{'password':'student','level':'student'}}
while flag:
Operation = input('请选择: ')
if Operation.lower == 'a':
username = input('请输入用户名: ')
if UserDict.get(username):
print('用户 {} 已存在!'.format(username))
continue
password = input('请输入密码: ')
userinfo={}
userinfo.setdefault('password',password)
userinfo.setdefault('level', 'user')
userDict.setdefault(username,userinfo)
elif userInput in 'dD':
username = input('请输入用户名: ')
if userDict.get(username) and userDict[username]['level'] != 'student':
userDict.pop(username)
else:
print('用户不存在或不能被删除!')
elif Operation.lower == 'v':
if UserLogin == True and UserDict[userName]['level'] == 'student':
print(UserDict)
else:
print('只有登陆的用户才能查看!')
elif Operation.lower == 'i':
if userName != '':
print('用户 {} 已登陆, 请先登出!'.format(userName))
continue
username = input('请输入用户名: ')
password = input('请输入密码: ')
if not userDict.get(username):
print('用户不存在!')
continue
if password == userDict[username]['password']:
print('登陆成功!')
userLogin = True
userName = username
else:
print('用户名或者密码不正确!')
elif Operation in 'oO':
print('用户 {} 已登出!'.format(userName))
userLogin = False
userName = ''
elif Operation in 'qQ':
goon = False
else:
print('输入有误,请重新输入!')
print('欢迎再来!')
UserManage()
优化后的代码:
#!user/bin/env python
#coding:utf-8
"""
file: UserManage
date: 2017 - 08 - 30 22:14
author: fang
version: 1.0
desc:
"""
db = {
"root": "westos",
"kiosk": "redhat",
}
def isUserExist(user):
if db.has_key(user):
return True
else:
print "{} 用户不存在!".format(user)
return False
def register():
user = raw_input("请输入你要注册的用户名:")
if isUserExist(user):
return "%s 已经存在,请重新输入" % user
else:
password = raw_input("请输入{}的密码:".format(user, ))
db[user] = password
return "{} 用户注册成功!".format(user, )
def login():
trycount = 0
while True:
if trycount == 3:
return "你已经登陆超过三次"
user = raw_input("输入登陆用户名:")
password = raw_input("密码:")
if isUserExist(user):
if db[user] == password:
return "login ok"
else:
print "用户密码错误"
trycount += 1
def deleteUser():
user = raw_input("输入你要删除的用户:")
if isUserExist(user):
del (db[user])
return "{} 用户删除成功".format(user, )
else:
return "{} 用户不存在".format(user, )
def userInfo():
a = "user\tpassword\n"
for key, value in db.items():
s = "%s\t%s\n" % (key, value)
a += s
return a + s
def main():
pro = """
用户管理系统
1. 用户注册
2. 用户登陆
3. 用户注销
4. 用户信息显示
5. 退出
请输入你的选择:"""
dic = {
1: register,
2: login,
3: deleteUser,
4: userInfo,
5: exit,
}
while True:
choice = input(pro)
print dic.get(choice)()
main()