一、列表
列表的修改
通过索引的重新赋值
service = ['http','ftp','ssh']
print(service)
service[0]='mysql' ##通过索引改变列表service的第一个元素
print(service)
通过切片
service = ['http','ftp','ssh']
print(service[:2])
service[:2] = 'firewalld','iptables' ##通过切片改变列表service的前俩个元素
print(service[:2])
列表的查看
service = ['http','ftp','ssh','http']
print(service.count('http')) ##查看元素http出现的次数
print(service.index('http')) ## 查看指定元素的索引值,默认显示靠前的
print(service.index('http',2,4)) ##查看指定元素的索引值,并指定索引范围
二、排序
按照ASCII码进行排序
service = ['http','samba','nfs','iscsi','http']
service.sort()
print(service)
import random ## 用数字呈现ascii码的排序更直观
li = list(range(10))
print(li) ## 按正常从小到大的顺序
random.shuffle(li) ## 按ascii码的排列
print(li)
练习
用户登陆系统
练习1:
#users = [‘root’,‘redhat’]
#passwd = [‘123’,‘456’]
1.用户名是否存在
2.如果存在:1)判断密码是否正确(如果正确,登录成功并退出循环)。2)错误(重新登录,只有3次机会)
3.用户不存在(重新登录,只有3次机会)
users = ['root','redhat']
passwd = ['123','456']
i = 0
while i < 3 : ##只有三次机会,需要限制循环次数
username=input('请输入需要登陆的用户:')
if username in users: ##判断用户列表内是否有输入的用户名
userpasswd=input('请输入密码:')
if users.index(username) == passwd.index(userpasswd):
## 通过索引对应用户和相应的密码
print('登陆成功')
exit()
else:
print('密码错误,登陆失败,你总共只有三次机会')
i += 1
else:
print('登录失败,该用户不存在,你总共只有三次机会')
i += 1
测试:
########
练习2:
#users = [‘root’,‘redhat’]
#passwd = [‘123’,‘456’]
#1.后台管理员用户:admin,密码:westos
#2.管理员登录后,可管理用户信息
#3.用户信息包括:1添加用户信息,2删除用户信息,3查看用户信息,4退出
print('管理员登录'.center(40,'*'))
aduser = input('Username: ')
adpasswd = input('Password: ')
users = ['root','redhat']
passwd = ['123','456']
if aduser == 'admin' and adpasswd == 'westos':
print('管理员登录成功!')
print('用户登录'.center(40, '*'))
while True:
print("""
菜单
1.添加用户信息
2.删除用户信息
3.查看用户信息
4.退出
""")
choice = input('请输入你的选择: ')
if choice == '1':
print('添加用户信息'.center(40,'*'))
adduser = input('添加用户名: ')
if adduser in users:
print('用户%s已经存在' %adduser)
else:
addpasswd = input('密码: ')
users.append(adduser)
passwd.append(addpasswd)
print(f"用户{adduser}添加成功")
elif choice == '2':
print('删除用户信息'.center(40, '*'))
deluser = input('删除用户名: ')
if deluser in users:
delindex = users.index(deluser)
users.remove(deluser)
passwd.pop(delindex)
print(f"删除用户{deluser}成功")
else:
print(f"用户{deluser}不存在")
elif choice == '3':
print('查看用户信息'.center(40, '*'))
print('\t用户名\t密码')
userlenth = len(users)
for i in range(userlenth):
print('\t%s\t%s' %(users[i],passwd[i]))
elif choice == '4':
exit()
else:
print('请输入正确的选择!')
else:
print('管理员登录失败!')
测试:
练习3:
栈的实现(栈类似于杯子一样的容器,先进后出,后进先出)
1.入栈 2.出栈 3.栈顶元素 4.栈的长度 5.栈是否为空
zhan = ['2']
print('栈的实现'.center(60,'#'))
while True:
print("""
菜单
1.入栈
2.出栈
3.栈顶元素
4.栈的长度
5.退出
""")
choose = input('请输入你要进行的内容:')
if choose == '1':
print('入栈的数据'.center(60,'#'))
date = input('请输入需要入栈的数据:')
zhan.append(date)
elif choose == '2':
print('出栈'.center(60,'#'))
a = len(zhan)
if a == 0:
print('栈为空,不可以进行出栈操作')
else:
a = zhan.pop()
print('出栈的数据为%s' %(a))
elif choose == '3':
print('栈顶元素'.center(60,'#'))
a = len(zhan)
if a == 0:
print("栈中没有数据")
else:
c = zhan[a-1]
print('栈顶元素为%s' %(c))
elif choose == '4':
print('栈的长度'.center(60,'#'))
d = len(zhan)
print('栈的长度为%d' %(d))
elif choose == '5':
exit()
else:
print('请输入正确的内容')
测试:
三、python中常用的内置方法
min(2,3,4,5) ##显示最小的值
max(2,3,4,5) ##显示最大的值
sum(range(1,101)) ## 一百以内的整数和
sum(range(1,101,2)) ## 一百以内奇数和
sum(range(2,101,2)) ##一百以内偶数和
sum 可以配合range进行求和。
枚举:返回索引值和对应的value值
for i,v in enumerate('westos'):
print(i,v)
zip
可以把俩个list变成一个list
s1 = ‘abc’
s2 = ‘123’
for i in zip(s1,s2):
print(i)
print(' '.join(i))
四、元组
元组:元组本身是不可变数据类型,没有增删改查
元组可以存储任意数据类型
t = (1,2.3,'westos',‘redhat’)
print(t,type(t))
元组里包含可变数据类型,可以间接修改元组内容
t1 = ([1,2,3],4)
t1[0].append(5)
print(t1)
只有一个元素的元组
t2 = ('hello')
print(t2,type(t2))
t2 = ('hello',) ##只有一个元素的元组,需要在元素后面加 ,
print(t2,type(t2))
元组的特性
元组没有增删改查,但支持索引切片等
索引 & 切片:
users = ('root','westos','redhat')
passwds = ('123','456','789')
print(users[0]) ##显示第一个元素
print(users[-1]) ##显示最后一个元素
print(passwds[::-1]) ##到叙
print(passwds[:2]) ##显示前俩个元素
重复:
print(users * n) ## 重复显示n次
连接:
print(passwds + ('http','https'))
成员操作符:
判断元素 ‘westos’ 是否在 users 中
print('westos' in users)
print('westos' not in users)
元组可以使用for循环遍历
for user in users:
print(user) ## for循环遍历 users
for index,user in enumerate(users):
print(index,'-->',user) ## index 循环遍历索引,user 循环遍历 users
for user,passwd in zip(users,passwds):
print(user,':',passwd) ## user 和 passwd 分别循环遍历users 和 passwds
t = (1,1.2,True,'westos')
print(t.count('westos')) ##显示元素westos 的个数
print(t.index('westos')) ## 显示元素westos的索引
排序
scores = (100,89,45,77,65)
第一种方式
scoreli = list(scores)
scoreli.sort()
print(scoreli)
第二种方式
scores = sorted(scores)
print(scores)
例:
scores = (100,89,45,77,65)
去掉最大的数和最小的数,求剩下三个数的平均值
minscore,*middlescore,maxscore = scores
^ *mid 表示所有的中间数
print(minscore) ## minscore 默认为最小的数
print(middlescore) ## middlescore 默认为居中间的数
print(maxscore) ##maxscore 默认为最大的数
print('最终成绩为: %.2f' %(sum(middlescore) / len(middlescore)))
五、集合
集合里的元素是不可重复的
s={1,3,5,7,9,3,2,1,}
print(s,type(s))
定义一个空的集合
s1 = {}
print(type(s1)) ## 直接定义空显示的是 dict 类型
s2 = set([]) ## 利用set转化类型定义
print(s2,type(s2))
集合的特性
集合只支持成员操作符和for循环
s = {1,2,3,4}
对集合进行索引切片等操作会报错。
成员操作符:
print(1 in s)
print(1 not in s)
for 循环
s={1,3,5,7}
for i in s;
print(s)
集合的常用方法
增加元素
s = {6,7,8,9}
s.add(1) ## 增加一个元素
print(s)
s.update({5,3,2}) ## 增加多个元素
print(s)
删除:
s = {6,7,8,9}
s.pop() ## 删除并返回集合中的任意元素
print(s)
s.remove(6) ##删除指定元素
print(s)
交集 并集 差集
s1 = {1,2,3}
s2 = {2,3,4}
并集
print('并集:',s1.union(s2))
print('并集:',s1 | s2) ## 俩种方式都可以完成并集
交集:
print('交集:',s1.intersection(s2))
print('交集:',s1 & s2)
差集:
print('差集:',s1.difference(s2)) ##s1 - (s1 & s2)
print('差集:',s2.difference(s1))
s3 = {1,2}
s4 = {1,2,3}
print(s4.issuperset(s3)) ##s4是否包含s3
print(s3.issubset(s4)) ##s3是否被s4包含
print(s3.isdisjoint(s4)) ##s3是否不在s4内
集合练习:
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性
他先用计算机生成了N个1~1000之间的随机整数(N<=1000),N是用户输入的,
对于其中重复的数字,只保留一个,把其余相同的数字去掉,不同的数对应
着不同的学生的学号,然后再把这些
数从小到大排序,按照排好的顺序去找同学做调查,请你协助明明完成
“去重”与排序工作
import random
s = set([])
for i in range(int(input('N: '))):
s.add(random.randint(1,1000))
print(sorted(s))
六、字典
字典是一个无序的数据集合
通常输出顺序和定义顺序不一样
字典有 key 值和value值 {‘key’:‘value’}
users = ['user1','user2']
passwds = ['123','456']
print(list(zip(users,passwds)))
print(dict(zip(users,passwds))) ## 以列表 来与dict字典比较更为直观
#字典中value值可以是任意数据类型
s = {
'westos':[100,99,88],
'redhat':[50,60,70]
}
print(s,type(s))
字典的嵌套
在字典里面可以嵌套字典
students = {
'03113009':{
'name':'wsp',
'age':18,
'score':90
},
'12345678':{
'name':'Tom',
'age':22,
'score':80
}
}
print(students['12345678']['name']) ## 可以精准的查看想要查看的元素
所有的key的value值一样
print({}.fromkeys({'1','2'},'hahaha'))
字典的特性
不支持索引切片
d = dict(a=1,b=2)
print(d[0])
字典的key值唯一,所以字典的重复显示没有意义。
成员操作符:
print('a' in d)
print('a' not in d)
for 循环:
for i in d :
print(i) ##循环key值
print(i,d[i]) ##循环key值和索引
字典的增加
services = {
'http':80,
'ftp':21,
'mysql':3306
}
增加一个元素
如果key值存在,则更新对应的value值
如果key值不存在,添加key-value值
services['ssh'] = 22 ##添加key-value值
print(services)
services['http'] = 443 ##更新value值
print(services)
添加多个key-value值
services_backup = {
'https':443,
'tomcat':8080,
'ssh':22
}
services.update(services_backup) ##在services内添加 serice_backup
print(services)
services.update(flask=9000,http=8000)
##在serices内更新http的value值和添加key值flask及value值9000
print(services)
字典的删除
services = {
'http':80,
'ftp':21,
'mysql':3306
}
del services['http'] ##指定删除 ‘http’元素
print(services)
pop删除指定的key的key-value
如果key存在,删除,并返回删除key对应的value
如果key不存在,报错
item = services.pop('mysql')
print(servie)
print(item)
没有的元素会报错
popitem默认删除最后一个key-value
item = services.popitem()
print(item)
print(services)
清空字典内容
services.clear()
print(services)
字典的查看
services = {
'http':80,
'ftp':21,
'mysql':3306
}
查看字典的key值
print(services.keys())
查看字典的value值
print(services.values())
查看字典对应的key-value值
print(services.items())
查看指定key的value值
key不存在,默认返回None
key不存在,有default,则返回default
print(services.get('http'))
指定key不存在时,输出none
get方法获取指定key值对应的value值
如果key值存在,返回对应的value值
如果key值不存在,默认返回None,如果需要指定返回值,传值即可
print(services.get('https','key not exist'))
^ 指定的返回值
字典练习
数字统计:
1)随机生成1000个整数
2)范围[20,100]
3)升序输出所有不同的数字及每个数字重复的次数
import random
nums = []
for i in range(1000):
nums.append(random.randint(20,100)
sorted_nums = sorted(nums) ##排序添加到字典中
num_dict = {}
for num in sorted_nums:
if num in num_dict:
num_dict[num] += 1
else:
num_dict[num] = 1
print(num_dict)
测试: