列表

>>> 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

练习:模拟栈结构


  1. 栈是一个后进先出的结构
  2. 编写一个程序,用列表实现栈结构
  3. 需要支持压栈、出栈、查询功能
  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
  1. 思考程序有哪些功能,将功能定义成函数
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:模拟用户登陆信息系统


  1. 支持新用户注册,新用户名和密码注册到字典中
  2. 支持老用户登陆,用户名和密码正确提示登陆成功
  3. 主程序通过循环询问进行何种操作,根据用户的选择,执行注册或是登陆操作

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])

↓↓↓↓↓↓

最近刚申请了个微信公众号,上面也会分享一些运维知识,大家点点发财手关注一波,感谢大家。 ​【原创公众号】:非著名运维 【福利】:公众号回复 “资料” 送运维自学资料大礼包哦!​

Python学习笔记_Day05_用户名

如果你觉得这篇文章还不错,就请动动你的发财手为本文留个言,或者转发一下吧,因为这将是我持续输出更多优质文章的最强动力