列表
>>> alist = [10, 5, 32, 1, 8, 20]
>>> alist[0] = 100
>>> alist[1:3] = [45, 88, 12, 24]
>>> alist
[100, 45, 88, 12, 24, 1, 8, 20]
>>> alist[2:2]
[]
>>> alist[2:2] = [12, 8]
>>> alist
[100, 45, 12, 8, 88, 12, 24, 1, 8, 20]
# 列表的方法
>>> alist.append(12) # 追加
>>> alist.extend([55, 32, 1]) # 加入多项
>>> alist.remove(8) # 移除第一个8
>>> alist.index(12) # 返回第一个12的下标
>>> alist.reverse() # 翻转
>>> blist = alist.copy() # 将alist的值copy后,赋值给blist
>>> alist.insert(2, 88) # 在下标为2的位置插入88
>>> alist.sort() # 升序排列
>>> alist.sort(reverse=True) # 降序
>>> alist.count(12) # 统计12出现的次数
>>> alist.pop() # 将最后一项弹出
>>> alist.pop(2) # 弹出下标为2的项目
元组
相当于是静态的列表。
>>> atuple = (10, 20, 15)
>>> atuple.count(10) # 统计10出现的次数
1
>>> atuple.index(15) # 获取15的下标
2
>>> a = (10)
>>> type(a) <class 'int'>
>>> a
10
>>> b = (10,) # 单元素元组必须有逗号
>>> type(b) <class 'tuple'>
>>> len(b)
1
练习:模拟栈结构
- 栈是一个后进先出的结构
- 编写一个程序,用列表实现栈结构
- 需要支持压栈、出栈、查询功能
- 思考程序的运作方式
(0) 压栈
(1) 出栈
(2) 查询
(3) 退出
请选择(0/1/2/3): 2
[]
(0) 压栈
(1) 出栈
(2) 查询
(3) 退出
请选择(0/1/2/3): 0
数据: hello
(0) 压栈
(1) 出栈
(2) 查询
(3) 退出
请选择(0/1/2/3): 0
数据: world #后进先出(后写进去的内容先被取出 ) (0) 压栈
(1) 出栈
(2) 查询
(3) 退出
请选择(0/1/2/3): 2 ['hello', 'world'] (0) 压栈
(1) 出栈
(2) 查询
(3) 退出
请选择(0/1/2/3): 1
从栈中弹出: world
(0) 压栈
(1) 出栈
(2) 查询
(3) 退出
请选择(0/1/2/3): 2 ['hello'] (0) 压栈
(1) 出栈
(2) 查询
(3) 退出
请选择(0/1/2/3): 1
从栈中弹出: hello
(0) 压栈
(1) 出栈
(2) 查询
(3) 退出
请选择(0/1/2/3): 1
空栈
(0) 压栈
(1) 出栈
(2) 查询
(3) 退出
请选择(0/1/2/3): 3
bye-bye
- 思考程序有哪些功能,将功能定义成函数
def push_it(): #压栈
def pop_it(): #出栈
def view_it(): #查询
def show_menu(): #所有实现功能的其他判断语句汇总成一个函数
if __name__ == '__main__':
show_menu()
3.在各个函数中编写具体的功能语句
第一种方法:
stack = []
def push_it():
data = input('请输入数据:').strip()
if data:
stack.append(data)
else:
print('数据为空,未添加')
def pop_it():
if stack:
print('从栈中弹出: %s' % stack.pop())
else:
print('空栈')
def view_it():
print(stack)
def show_menu():
prompt = '''
(0) 压栈
(1) 出栈
(2) 查询
(3) 退出
请选择(0/1/2/3):'''
while True:
choice = input(prompt).strip()
if choice not in ['0','1','2','3']:
print('无效输入,请重试!')
continue
if choice == '0':
push_it()
elif choice == '1':
pop_it()
elif choice == '2':
view_it()
else:
print('Bye_bye')
break
if __name__ == '__main__':
show_menu()
第二种方法(使用字典):
stack = []
def push_it():
data = input('数据: ').strip()
if data:
stack.append(data)
else:
print('数据为空,未添加 ')
def pop_it():
if stack:
print('从栈中弹出: %s' % stack.pop())
else:
print('空栈')
def view_it():
print(stack)
def show_menu():
# 字典是容器类型,可以把任意对象存入,本例中存入函数
cmds = {'0': push_it, '1': pop_it, '2': view_it}
prompt = """(0) 压栈
(1) 出栈
(2) 查询
(3) 退出
请选择(0/1/2/3): """
while True:
choice = input(prompt).strip() # 去掉字符串两端空白字符
if choice not in ['0', '1', '2', '3']:
print('无效输入,请重试。 ')
continue
if choice == '3':
print('Bye-bye')
break
cmds[choice]() # 在字典中取出相应的函数进行调用
if __name__ == '__main__':
show_menu()
字典
- 映射、可变、容器
- 字典key不能重复
- 为字典赋值时,key存在则修改,不存在则新建
- 字典的key必须是不可变对象
>>> dict(['ab', ['name', 'bob'], ('age', 20)])
{'a': 'b', 'name': 'bob', 'age': 20}
>>> dict([('name', 'tom'), ('age', 20), ('mail', 'tom@tedu.cn')])
{'name': 'tom', 'age': 20, 'mail': 'tom@tedu.cn'}
>>> {}.fromkeys(['tom', 'jerry', 'bob'], 20)
{'tom': 20, 'jerry': 20, 'bob': 20}
>>> info = dict([('name', 'tom'), ('age', 20), ('mail', 'tom@tedu.cn')])
>>> info
{'name': 'tom', 'age': 20, 'mail': 'tom@tedu.cn'}
>>> for key in info:
... print(key, info[key])
...
name tom
age 20
mail tom@tedu.cn
>>> '%(name)s is %(age)s years old' % info
'tom is 20 years old'
>>> '%s is %s years old' % (info['name'], info['age'])
'tom is 20 years old'
>>> info['age'] = 22
>>> info['phone'] = '15012345678'
>>> info
{'name': 'tom', 'age': 22, 'mail': 'tom@tedu.cn', 'phone': '15012345678'}
>>> 'tom' in info
False
>>> 'name' in info
True
>>> len(info) 4
>>> info.keys() # 取出所有的key
dict_keys(['name', 'age', 'mail', 'phone'])
>>> info.values() # 取出所有的value
dict_values(['tom', 22, 'tom@tedu.cn', '15012345678'])
>>> info.items() # 取出键值对
dict_items([('name', 'tom'), ('age', 22), ('mail', 'tom@tedu.cn'), ('phone',
'15012345678')])
>>> list(info.items()) # 将键值对转成列表
[('name', 'tom'), ('age', 22), ('mail', 'tom@tedu.cn'), ('phone', '15012345678')]
>>> info.popitem() # 弹出字典中的一项
('phone', '15012345678')
>>> info.pop('mail') # 弹出key是mail的项目
>>> info.update({'mail': 'tom@qq.com'}) # 更新字典
>>> {(1, 2): 'tom'} # 元组作为key
{(1, 2): 'tom'}
>>> {[1, 2]: 'tom'} # 列表是可变的,不能成为 key,报错
# **字典中最重要的方法 **
>>> info.get('name') # 在字典中取出key为name的值
'tom'
>>> print(info.get('phone')) # key不在字典中,默认返回 None
None
>>> print(info.get('phone', 'not found')) # 找不到key返回not found
not found
>>> info.get('name', 'not found')
'tom'
>>> print(info.get('phone', '110'))
110
案例2:模拟用户登陆信息系统
- 支持新用户注册,新用户名和密码注册到字典中
- 支持老用户登陆,用户名和密码正确提示登陆成功
- 主程序通过循环询问进行何种操作,根据用户的选择,执行注册或是登陆操作
import getpass
userdb = {} # 用于存储用户名和密码
def register():
username = input('用户名: ').strip()
if username == '':
print('用户名不能为空 ')
elif not username.isalnum():
print('用户名只能包含字母和数字 ')
elif username in userdb:
print('用户已存在')
else:
password = input('密码: ')
userdb[username] = password
def login():
username = input('用户名: ').strip()
password = getpass.getpass('密码: ').strip()
# if username not in userdb or userdb[username] != password:
if userdb.get(username) != password:
print('\033[31;1m登陆失败\033[0m')
else:
print('\033[32;1m登陆成功\033[0m')
def show_menu():
cmds = {'0': register, '1': login}
prompt = """(0) 注册
(1) 登陆
(2) 退出
请选择(0/1/2): """
while True:
choice = input(prompt).strip()
if choice not in ['0', '1', '2']:
print('无效的选择,请重试。 ')
continue
if choice == '2':
print('Bye-bye')
break
cmds[choice]()
if __name__ == '__main__':
show_menu()
验证:
# python 05.py
(0) 注册
(1) 登陆
(2) 退出
请选择(0/1/2): 0
用户名:lss
密码:123
(0) 注册
(1) 登陆
(2) 退出
请选择(0/1/2): 1
用户名: lss
密码:
登陆成功
(0) 注册
(1) 登陆
(2) 退出
请选择(0/1/2): 2
Bye-bye
集合
集合是一个数学上的概念
- 它由不同元素构成
- 集合元素必须是不可变对象
- 集合是无序的
- 集合就像是一个无值的字典
- 集合分成可变集合和不可变集合
>>> frozenset('abc') # 不可变集合,集合一旦创建,不能做增删改操作
frozenset({'b', 'a', 'c'})
>>> set(['tom', 'jerry', 'bob'])
{'jerry', 'tom', 'bob'}
>>> aset = set('abc')
>>> bset = set('bcd')
>>> aset
{'b', 'a', 'c'}
>>> bset
{'b', 'd', 'c'}
>>> aset & bset # 交集,两个集合中都有的元素
{'b', 'c'}
>>> aset | bset # 并集,两个集合中所有的元素
{'b', 'd', 'a', 'c'}
>>> aset - bset # 差补,aset中有,bset中无
{'a'}
>>> bset - aset # 差补,bset中有,aset中无
{'d'}
>>> aset
{'b', 'a', 'c'}
>>> len(aset)
3
>>> 'a' in aset
True
>>> for ch in aset:
... print(ch)
>>> aset.add(10) # 向集合中加入新项目
>>> aset.pop() # 弹出任意一个元素
'b'
>>> aset.remove(10) # 删除指定的元素
>>> aset.update(['tom', 'jerry', 'bob'])
>>> aset
{'tom', 'a', 'jerry', 'bob', 'c'}
>>> aset = set('abc')
>>> bset = set('bcd')
>>> aset.union(bset) # aset | bset
{'b', 'd', 'a', 'c'}
>>> aset.intersection(bset) # aset & bset
{'b', 'c'}
>>> aset.difference(bset) # aset - bset
{'a'}
>>> cset = aset.union(bset)
>>> aset.issubset(cset) # aset是cset的子集吗?
True
>>> cset.issuperset(aset) # cset是aset的超集吗?
True
# 经常使用集合实现去重操作
>>> from random import randint
>>> nums = [randint(1, 20) for i in range(20)]
>>> nums
[6, 12, 18, 19, 1, 1, 16, 15, 5, 6, 18, 19, 14, 11, 17, 13, 2, 5, 20, 16]
>>> result = []
>>> for i in nums:
... if i not in result:
... result.append(i)
>>> result
[6, 12, 18, 19, 1, 16, 15, 5, 14, 11, 17, 13, 2, 20]
>>> list(set(nums))
[1, 2, 5, 6, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
练习:
- 模拟unix2dos程序
- windows系统把\r\n作为行结束标志
- 非windows系统把\n作为行结束标志
python l2w.py userdb.py =>生成新文件,已经具有windows的换行符
"""
转换为windows换行格式
把源文件的每行结尾的空白字符删除,再拼接上 \r\n
"""
---->解决的是linux上的文本文件拿到 windows上打开后就成一行显示 ,没有回车,需要将文本文件转换后即
可.
import sys
def unix2dos(src, dst):
with open(src) as src_fobj:
with open(dst, 'w') as dst_fobj:
for line in src_fobj:
line = line.rstrip() + '\r\n'
dst_fobj.write(line)
if __name__ == '__main__':
unix2dos(sys.argv[1], sys.argv[2])
↓↓↓↓↓↓
最近刚申请了个微信公众号,上面也会分享一些运维知识,大家点点发财手关注一波,感谢大家。 【原创公众号】:非著名运维 【福利】:公众号回复 “资料” 送运维自学资料大礼包哦!
如果你觉得这篇文章还不错,就请动动你的发财手为本文留个言,或者转发一下吧,因为这将是我持续输出更多优质文章的最强动力!