1.列表构建栈的数据结构(先进后出FILO)
栈,又叫堆栈,是一种运算受限的线性表,其限制仅允许在表的进行插入和删除运算。这一端叫做栈顶相应的,另一端叫栈尾或栈底,向一个栈中插入新元素又叫入栈,进栈,压栈。它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又叫做出栈退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
#!/usr/bin/env python
# coding=utf-8
#列表存放栈元素
stack = []
info = """
栈操作
1.入栈
2.出栈
3.栈长度
4.栈顶元素
5.退出
"""
print info
while 1:
choice = raw_input("请选择:")
if choice == "1":
in_value = raw_input('入栈元素:')
stack.append(in_value)
print "元素%s入栈成功" %(in_value)
print stack
elif choice == '2':
if not stack:
print "stack栈为空"
else:
out_value = stack.pop()
print "%s出栈成功" %out_value
print stack
elif choice == '3':
print "栈长度为%s" %len((stack))
elif choice =='4':
if stack:
print "栈顶元素%s" %stack[-1]
else:
print "栈为空"
elif choice == '5':
exit(0)
else:
print "请输入正确选择"
2.队列是一种特殊的线性表,它只允许再表的前端进行删除操作,而再表的后端进行插队操作,进行插入操作的端称作队尾,进行删除的一端成为队头。
#!/usr/bin/env python
# coding=utf-8
quen = []
info = """
队列
1.添加队列元素
2.删除队列元素
3.队长度
4.队头元素
5.队尾元素
6退出
"""
print info
while True:
choice = raw_input("请输入选择:")
if choice =='1':
in_value = raw_input("输入元素:")
quen.append(in_value)
print '元素%s添加成功' % in_value
print quen
elif choice == '2':
if quen:
quen.pop(0)
print '删除队列元素%s' %quen[0]
print quen
else:
print '队列为空'
elif choice == '3':
print '队列长度%s' % len(quen)
elif choice == '4':
if quen != "":
print "队头元素%s" %quen[0]
else:
print "队列为空"
elif choice =='5':
if quen:
print "队尾元素%s" %quen[-1]
elif choice =='6':
exit(0)
else:
print "请输入正确选择"
3.is和等于号(==)的区别
4.浅拷贝与新拷贝(需要加载copy模块)
直接赋值, 只是把新的变量指向li的内存空间, 没有复制;当li改变, li1也随之改变;
浅拷贝: 拷贝出一份副本, 但是没有拷贝子对象(列表里面的列表对象);不完全拷贝
浅拷贝方法一:切片实现li2=li[:]
浅拷贝方法二:copy.copy实现
深拷贝: 里面的所有对象重新拷贝, 包括子对象;开辟了新的内存空间
5.元组tuple
1.元组的定义,元组元素可以是多种不同数据类型
list = [1, 2, 3] ##列表
t = (1, 2, 3, 4) ##定义元组t,初始元素1,2,3,4
t1 = (1) ##这是一个int型数据类型,不是元组
t2 = ('hello') ##这是一个字符串类型
2. 定义元组, 只有一个元素, 必须加逗号;
t3 = (1, ) ##定义元组t3,只有一个元素3
t4 = tuple() ##定义空元组t4
3.远足的特性
和列表一样,有索引, 切片, 连接, 重复,成员操作符
4.元组属于可迭代数据类型
t = (1, 1.0, 1L, 1+2j, ‘hello’, [1,2])
for i in t:
print i
6.端口扫描服务器雏形
扫描172.25.254.0/24 这个网络所有主机的ftp, ssh, http, mariadb, samba(21, 22, 80, 3306,3020)
#!/usr/bin/env python
# coding=utf-8
ips = []
for i in range(1, 255):
# ip = '172.25.254.'+str(i)
ips.append('172.25.254.' + str(i))
ports = (21, 22, 80, 3306, 3020)
for ip in ips:
for port in ports:
print '[+] Scanning %s:%d' % (ip, port)
7.元组方法
元组是不可变的数据类型,仅有t.count 统计某一元素再元组中出现的次数,t.index查询某一元素第一次出现的索引号
8.变量的交换
c语言中变量交换需要借助中间变量
x = 1
y = 2
temp = x
x = y
y = temp
对于python来说不需要:
x=1
y=2
x,y = y,x
print x,y
1). 先计算右边的表达式y,x, 在内存中开辟内存空间, 生成元组t = (y,x);
2). 将x = t[0]; y = t[1]
测试两种数据值交换的时间对比;
from timeit import Timer
print Timer(‘temp = x;x = y;y = temp’, ‘x=2;y=1’).timeit()
print Timer(‘x,y = y,x’, ‘x=2;y=1’).timeit()
后者用时更短
8.字典
dict = {} ##列表方[]括号,元组圆()括号,字典{}花括号
8.1字典的简单定义
d = {
# :前面的称为键,key
# :后面的称为值,value
# 键值对(key-value)
'name': 'root',
'passwd':'westos'
}
print d['name']
print d['passwd']
字典的复杂定义
info = {
'root':{
'name': 'root',
'passwd':'westos',
'age':18,
'eamil':['westos@qq.com', 'redhat@qq.com']
},
'student': {
'name': 'student',
'passwd': 'westos',
'age': 18,
'eamil': ['westos@qq.com', 'redhat@qq.com']
},
}
print info['root']
8.2字典的三种创建方法
通过工厂函数创建字典
d = dict()
print type(d)
d = dict(a=1, b=2, c=3)
print d, type(d)
fromkeys方法创建字典
d = {}.fromkeys(['user1', 'user2', 'user3'])
print d
8.3字典的特性
不可行的特性: 索引, 切片, 连接, 重复, (因为dict是无序的数据类型;)
可行的特性: 成员操作符;
8.4字典的增加
d.update(key=value, …..)
- 如果key值存在, 更新该key对应的value值;
- 如果key不存在, 添加key-value值;
d.setdefault(key,value)
- 如果key值存在, 不操作;
- 如果key不存在, 添加key-value值;
8.5字典的查看
d.keys() ##用于查看字典的key
d.values() ##用于查看字典的value
d.items() ##用于查看字典的key-value
for i,j in d.items():
print i,j
d.has_key('a') ##用于判断字典的key是否存在
8.6字典的修改包括了字典元素的添加删除和更新
8.7字典元素的删除
pop
d.pop(k[,d]):
- 如果key存在, 删除key-value;
- 如果key不存在,判断d是否存在:
- 如果d不存在, 报错KeyError;
- 如果d存在, 返回d;
popitem()随机删除key-value对;当字典为空时报错;
8.8字典自身的删除
d.clean()删除字典中所有元素key-values对
del d 删除字典
练习题1
#!/usr/bin/env python
# coding=utf-8
useinfo = {
'root':{
'name':'root',
'passwd':'root',
'gender':'M',
'age':'19',
'email':'qq@.com'
}
}
info = """
用户管理系统
1.注册
2.登陆
3.删除用户
4.查看用户信息
5.退出
"""
print info
while 1:
choice = raw_input("请选择:")
if choice == '1':
print "注册系统界面".center(50,"*")
username = raw_input("注册名:")
if username in useinfo:
print "%s 用户存在" %username
else:
passwd =raw_input("注册密码:")
gender = raw_input("性别M/F:")
if gender == "":
gender = None
age = raw_input("年龄:")
if age == "":
age = None
email = raw_input("邮箱:")
if email == "":
email = None
useinfo [username] ={
'name':username,
'passwd':passwd,
'gender':gender,
'age':age,
'email':email,
}
elif choice == "2":
trycount = 0
while trycount <3:
trycount+=1
print "欢迎进入登陆界面".center(50,"*")
username = raw_input("登陆用户:")
if username not in useinfo:
print "没有%s该用户,清注册" %username
break
else:
passwd = raw_input("登陆密码:")
if passwd == useinfo[username]['passwd']:
print '登陆成功'
break
else:
print '密码错误'
else:
print "密码错误输入大于3次"
elif choice == '3':
usedel = raw_input("想删除的用户:")
if usedel not in useinfo:
print "%s该用户不存在:" %usedel
else:
passwddel = raw_input("请输入密码:")
if passwddel not in useinfo[usedel]['passwd']:
print "删除%s该用户的密码不正确" % usedel
else:
print "删除%s用户成功" % usedel
elif choice == '4':
usercheck = raw_input("请输入要查看用户名:")
if usercheck not in useinfo:
print "无%s用户" % usercheck
else:
cat = useinfo.get(usercheck)
print cat
elif choice == '5':
print 'bye'
exit(0)