Python之路【第二篇】:Python基础2之数据类型

一、字符串操作

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# 字符基础方法
name = 'CoCoa-Z'
print(name.capitalize())    # 首字母大写,结果:Cocoa-z
print(name.casefold())      # 大写全部变小写,结果:cocoa-z
print(name.swapcase())      # 大小写互换,结果:cOcOA-z
print(name.center(20,'-'))  # 输出 ------CoCoa-Z-------
print(name.count('Co'))     # 统计'Co'出现的次数,结果:2
print(name.endswith('-Z'))  # 判断字符串是否以-Z结尾,结果:True
print(name.find('a'))       # 查找a,找到返回其索引,找不到返回-1,结果:4
print("Alex\tLi".expandtabs(10)) # 输出'Alex      Li', 将\t转换成多长的空格
print(name.index('a'))      # 返回a第一次出现所在字符串的索引

# 字符串格式化
msg = 'my name is {0}, and age is {1}'
print(msg.format('Alex','18'))          # my name is Alex, and age is 18

msg = 'my name is {name}, and age is {age}'
print(msg.format(age=20,name='Alex'))   # my name is Alex, and age is 18

msg = 'my name is {name}, and age is {age}'
print(msg.format_map({'name':'alex','age':22})) # my name is Alex, and age is 18

# 字符串格式化输出, strip()去除用户输入的前后的空白字符
name = input('plases input your name:').strip()
age = input('plases input your age:')
job = input('plases input your job:').strip()
salary = input('plases input your salary:')
str = '''
Personal infomation of %s:
	Name: %s
	Age : %s
	Job : %s
    Salary: %s
---------------------------------
''' %(name,name,age,job,salary)

print(str)

字符串拼接中万恶的'+'号:

# 通过‘+’号字符串进行拼接内存的保持n+1份(n为+号出现的次数)
print('abc'+'cde'+'efg')
# abc
# abccde
# abccdeefg

# 使用占位符%s等进行字符串拼接内存只会存2份数据
print('abc%s%s' %('cde','efg'))
# abc
# abccdeefg

将列表按指定的分隔符组合成字符串:

name_list = ['A','l','e','x','s','b']
name_str = '-'.join(name_list)
print(name_str) #A-l-e-x-s-b

 

二. 列表操作

# 定义列表
names = ['Alex',"Tenglan",'Eric']
# 通过下标访问列表中的元素,下标从0开始计数
print(names[0])
print(names[1])
print(names[2])
# 还可以倒着取
print(names[-1])
print(names[-2])

# 切片:取多个元素 
names = ["Alex","Tenglan","Eric","Rain","Tom","Amy"]
names[1:4]  # 取下标1至下标4之间的数字,包括1,不包括4
['Tenglan', 'Eric', 'Rain']
names[1:-1] # 取下标1至-1的值,不包括-1
['Tenglan', 'Eric', 'Rain', 'Tom']
names[0:3]  # 取列表中钱3个元素
['Alex', 'Tenglan', 'Eric']
names[:3]   # 如果是从头开始取,0可以忽略,跟上句效果一样
['Alex', 'Tenglan', 'Eric']
names[3:]   # 如果想取最后一个,必须不能写-1,只能这么写
['Rain', 'Tom', 'Amy']
names[3:-1] # 这样-1就不会被包含了
['Rain', 'Tom']
names[0::2] # 后面的2是代表,每隔一个元素,就取一个
['Alex', 'Eric', 'Tom']
names[::2]  # 和上句效果一样
['Alex', 'Eric', 'Tom']

# 追加
names.append('new_name')
['Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy', 'new_name']

# 插入
names.insert(2,'插入到所有为2的位置')
['Alex', 'Tenglan', '插入到所有为2的位置', 'Eric', 'Rain', 'Tom', 'Amy', 'new_name']

# 修改
names[2] = '更新'
['Alex', 'Tenglan', '更新', 'Eric', 'Rain', 'Tom', 'Amy', 'new_name']

# 根据元素的值删除指定元素
names.remove('更新')
['Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy', 'new_name']

# 根据元素的索引删除指定元素,默认删除列表最后一个值
names.pop(1)
['Alex', 'Eric', 'Rain', 'Tom', 'Amy', 'new_name']

# 扩展
a = ['a','b','c']
b = [1, 2, 3]
a.extend(b)
['a', 'b', 'c', 1, 2, 3]

# 拷贝
names = ['Alex', 'Tenglan', 'Rain', 'Tom', 'Amy', 1, 2, 3]
names_copy = names.copy()
['Alex', 'Tenglan', 'Rain', 'Tom', 'Amy', 1, 2, 3]

# 排序
names =[19, 22, 8, 88, 65, 21]
names.sort()
[8, 19, 21, 22, 65, 88]

# 翻转
names.reverse()
[88, 65, 22, 21, 19, 8]

# 统计: 统计Amy在列表中出现的次数
names = ['Alex', 'Tenglan', 'Amy', 'Tom', 'Amy', 1, 2, 3]
print(names.count('Amy')) 

# 获取下标
names = ['Alex', 'Tenglan', 'Amy', 'Tom', 'Amy', 1, 2, 3]
print(names.index("Amy")) # 只返回找到的第一个下标

二. 元组操作

元组其实跟列表差不多,也是存一组数,只不是它一旦创建,便不能再修改,所以又叫只读列表

 语法:

names = ("alex","jack","eric")

 它只有2个方法,一个是count,一个是index

 注意:元组的元素是不能修改的,但是元组中元素中的元素是可以修改的。

#!/usr/bin/env python3

tup =  ('a','b',{'name':'cocoa-z'})

# 元组的元素是不能修改的,修改后会报一下错误.
tup[2] = 'c'                #TypeError: 'tuple' object does not support item assignment
# 元组的元素中的元素是可以修改.
tup[2]['name'] = 'cocoa-f'  #('a', 'b', {'name': 'cocoa-f'})

三、 字典操作

字典一种key - value 的数据类型,使用就像我们上学用的字典,通过笔划、字母来查对应页的详细内容。

# 创建一个字典
stu_info = {
    'stu1101': "TengLan Wu",
    'stu1102': "LongZe Luola",
    'stu1103': "XiaoZe Maliya",
}

# 增加
stu_info['stu1104'] = "Binbin Fan"
{'stu1101': 'TengLan Wu', 'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1104': 'Binbin Fan'}

# 修改
stu_info['stu1104'] = "Binbin Li"
{'stu1101': 'TengLan Wu', 'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1104': 'Binbin Li'}

# 删除
stu_info.pop('stu1104')  # 根据key删除某个元素
{'stu1103': 'XiaoZe Maliya', 'stu1101': 'TengLan Wu', 'stu1102': 'LongZe Luola'}
stu_info.popitem()       # 随机删除某个元素
{'stu1101': 'TengLan Wu', 'stu1103': 'XiaoZe Maliya'}

# 查找
stu_info = {'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya'}
"stu1102" in stu_info    # 标准用法
stu_info.get("stu1102")  # 获取
stu_info["stu1102"]      # 同上

# 结果集
stu_info = {'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya'}
print(stu_info.keys())
(['stu1102', 'stu1103'])
print(stu_info.values())
(['LongZe Luola', 'XiaoZe Maliya'])
print(stu_info.items())
([('stu1102', 'LongZe Luola'), ('stu1103', 'XiaoZe Maliya')])

# 扩展: 将两个字典中不相同的内容合并成一个
stu_info = {'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya'}
stu_info2 = {'stu1104': 'Binbin Li', 'stu1103':'XiaoZe Maliya'}
stu_info.update(stu_info2)
print(stu_info)
{'stu1103': 'XiaoZe Maliya', 'stu1104': 'Binbin Li', 'stu1102': 'LongZe Luola'}

# 循环dict 
#方法1
for key in stu_info:
    print(key,info[key])

#方法2
for k,v in stu_info.items(): #会先把dict转成list,数据里大时莫用
    print(k,v) 

get的特殊用法, 如果key不存在,则返回默认值None,也可以当key不存在时自己设置默认值.

dic = {'key1':'val1','key2':'val2'}
print(dic['key1'])
print(dic['key2'])
#print(dic['key3']) # 此处会报告异常,KeyError: 'key3'

print(dic.get('key1'))
print(dic.get('key2'))
print(dic.get('key3'))  # 此处会输出key3的默认值None
print(dic.get('key3','default'))  # 此处会输出key3的设置的默认值default

四、 集合操作

集合是一个无序的,不重复的数据组合,它的主要作用如下:

  • 去重,把一个列表变成集合,就自动去重了
  • 关系测试,测试两组数据之前的交集、差集、并集等关系

 1、基本操作

chs = set("Hello")         # 创建一个唯一字符的集合
{'o', 'H', 'l', 'e'}
chs.add('s')               # 添加一项
{'H', 'l', 's', 'e', 'o'}
chs.update(['a','b','c'])  # 添加多项
{'a', 's', 'H', 'l', 'e', 'o', 'b', 'c'}
chs.remove('s')            # 删除一项
{'H', 'e', 'a', 'c', 'b', 'o', 'l'}
# difference:找出两个集合中的不同的元素并创建一个集合返回
set1 = set(['alex','eric','tony','alex'])
set2 = set(['alex','eric'])
set3 = set1.difference(set2)
print(set3)

# difference_update:找出两个集合中的不同的元素并修改原来集合中的内容
set1 = set(['alex','eric','tony','alex'])
set2 = set(['alex','eric'])
set1.difference_update(set2)
print(set1)

# pop: 删除集合中的最后一个元素并返回该元素
set_name = {'Alex','Eric','Tony'}
name = set_name.pop()
print(name)

# remove: 删除集合中指定的元素
set_name = {'Alex','Eric','Tony'}
set_name.remove('Eric')
print(set_name)

2、集合运算

x = {'a','b','c','d'}
y = {'c','d','e','f'}
x & y 			    # 求交集 x.intersection(y)
{'d', 'c'}
x | y 			    # 求并集 x.union(y)
{'a', 'c', 'b', 'f', 'd', 'e'}
x ^ y 			    # 求对称差集 x.symmetric_difference(y)
{'e', 'f', 'a', 'b'}
x - y 			    # 求差集 x.difference(y)
{'a', 'b'}
y - x                    # 求差集 y.difference(x)
{'e', 'f'}

x.issubset(y)   	# x是y的子集
x.issuperset(y) 	# x是否包含y

练习:寻找差异

# 数据库中原有
old_dict = {
    "#1":{ 'hostname':'c1', 'cpu_count': 2, 'mem_capicity': 80 },
    "#2":{ 'hostname':'c1', 'cpu_count': 2, 'mem_capicity': 80 },
    "#3":{ 'hostname':'c1', 'cpu_count': 2, 'mem_capicity': 80 }
}

# cmdb 新汇报的数据
new_dict = {
    "#1":{ 'hostname':'c1', 'cpu_count': 2, 'mem_capicity': 800 },
    "#3":{ 'hostname':'c1', 'cpu_count': 2, 'mem_capicity': 80 },
    "#4":{ 'hostname':'c1', 'cpu_count': 2, 'mem_capicity': 80 }
}

old_set = set(old_dict.keys())
new_set = set(new_dict.keys())

update_set = old_set & new_set
delete_set = old_set ^ update_set
insert_set = new_set ^ update_set
print(update_set,delete_set,insert_set)

 五、文件操作

对文件操作流程

  1. 打开文件,得到文件句柄并赋值给一个变量
  2. 通过句柄对文件进行操作
  3. 关闭文件
# 以只读的方式打开文件并处理 [这样处理后没行就是一个列表]
f = open("passwd","r")
for line in f.readlines():
  line = line.strip("\n").split(":")
  print(line)
f.close()

# 以只写的方式打开文件,在写入新的内容后原来的数据将会会覆盖
f2 = open("passwd","w")
f2.write("new line\n")
f2.flush()
f2.close()

# 以追加的方式打开文件,在写入新的内容后原来的数据将会保留
f3 = open("passwd","a")
f3.write("Second line\n")
f3.write("Thrid line\n")
f3.flush()

打开文件的模式有:

  • r, 只读模式(默认)
  • w, 只写模式 【不可读;不存在则创建;存在则删除内容;】
  • a, 追加模式 【可读;   不存在则创建;存在则只追加内容;】

"+" 表示可以同时读写某个文件

  • r+,可读写文件。【可读;可写;可追加】
  • w+,写读
  • a+,同a

为了避免打开文件后忘记关闭,可以通过with语句管理上下文,即:

with open('log','r') as f:
     
    ...

六、collection类

Counter是一个简单的计数器,例如,统计字符出现的个数:

import collections
c_str = collections.Counter('programming')
print(c_str)

c_list = collections.Counter(['avi','abc','act','avi','act','trp'])
print(c_list)

#结果
Counter({'g': 2, 'm': 2, 'r': 2, 'p': 1, 'n': 1, 'a': 1, 'o': 1, 'i': 1})
Counter({'act': 2, 'avi': 2, 'trp': 1, 'abc': 1})

 

OrderdDict是对字典类型的补充,他记住了字典元素添加的顺序:

from collections import OrderedDict

# 普通的字典中的数据是无序的
dict_test = {'jen':'python','sarah':'c','edward':'ruby','phil':'python'}
for key in dict_test:
   print(key+ "'s favorite language is  " + dict_test[key] + ".")

# orderdDict字典中的数据是有序的,按插入的顺序进行排序,原理为这个字典在内部维护了一个key的列表
favorite_languages = OrderedDict()
favorite_languages['jen'] = 'python'
favorite_languages['sarah'] = 'c'
favorite_languages['edward'] = 'ruby'
favorite_languages['phil'] = 'python'
for name,language in favorite_languages.items():
    print(name.title() + "'s favorite language is  " + language.title() + ".")

# 结果
sarah's favorite language is  c.
edward's favorite language is  ruby.
jen's favorite language is  python.
phil's favorite language is  python.
--------------------------------------
Jen's favorite language is  Python.
Sarah's favorite language is  C.
Edward's favorite language is  Ruby.
Phil's favorite language is  Python.

 

defaultdict是对字典的类型的补充,他默认给字典的值设置了一个类型:

有如下值集合 [11,22,33,44,55,66,77,88,99...],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。

即: {'k1': 大于66 , 'k2': 小于66}

from collections import defaultdict
num_lst = [11,22,33,44,55,66,77,88,99]
default_dict_test = defaultdict(list)
for num in num_lst:
    if num < 66:
        default_dict_test['k1'].append(num)
    else:
        default_dict_test['k2'].append(num)
print(default_dict_test)

看出神奇的地方了么?我们可以不需要在空字典中指定value的值,直接执行append,就可以向字典中插入值了,

就是因为我们使用defauldict(list)方式定义了一个value值默认为list的字典。

否则我们就要这么写才行:

num_list = [11,22,33,44,55,66,77,88,99,100]
num_dict = {'key1':[],'key2':[]}
for num in num_list:
    if num > 55:
        num_dict['key1'].append(num)
    else:
        num_dict['key2'].append(num)
print(num_dict)

Eric的方法:

num_lst = [11,22,33,44,55,66,77,88,99,90]
dic = {}
for num in num_lst:
    if num < 66:
        if 'k1'in dic.keys():
            dic['k1'].append(num)
        else:
            dic['k1'] = [num,]
    else:
        if 'k2'in dic.keys():
            dic['k2'].append(num)
        else:
            dic['k2'] = [num,]
print(dic)

 

可命名元组: 

Mytupleclass = collections.namedtuple('Mytupleclass',['x','y','z'])
mytuplecclass = Mytupleclass(11,22,33)
print(mytuplecclass.x)
print(mytuplecclass.y)
print(mytuplecclass.z)

 

双向队列:collections.deque()

d = collections.deque()
d.append('11')
d.append('22')
d.appendleft('00')
print(d)    # deque(['00', '11', '22'])
d.extend(['xx','yy','zz'])
d.extendleft(['aa','bb','cc'])
print(d)    # deque(['cc', 'bb', 'aa', '00', '11', '22', 'xx', 'yy', 'zz'])
d.pop()
d.popleft()
print(d)    # deque(['bb', 'aa', '00', '11', '22', 'xx', 'yy'])
d.insert(0,'aaa')
print(d)    # deque(['aaa', 'bb', 'aa', '00', '11', '22', 'xx', 'yy'])
d.rotate(3)
print(d)    # deque(['22', 'xx', 'yy', 'aaa', 'bb', 'aa', '00', '11'])

 

单项队列:queue.Queue() 先进先出 

import queue
q = queue.Queue()
q.put('aa')
q.put('bb')
q.put('cc')
print(q.get())

七、深浅copy

#!/usr/bin/evn python3
import copy

"""
字符串和数字中的赋值以及深浅copy
"""
#str1 = 'abc'
str1 = 123

str2 = str1
print(id(str1) == id(str2))     # True

str3 = copy.copy(str1)
print(id(str1) == id(str3))     # True

str4 = copy.deepcopy(str1)
print(id(str1) == id(str4))     # True

print('-------------')
"""
其它类型中的赋值以及深浅copy
"""
dict1 = {'key1':'abc','key2':123,'key3':['Alex',456]}

dict2 = dict1
print(id(dict1) == id(dict2))       # True

dict3 = copy.copy(dict1)
print(id(dict1) == id(dict3))                   # False
print(id(dict1['key3']) == id(dict3['key3']))   # True

dict4 = copy.deepcopy(dict1)
print(id(dict1) == id(dict4))                   # False
print(id(dict1['key3']) == id(dict4['key3']))   # False

"""
深浅copy的应用:
以下数据模板一直在使用,老机器都使用此模板,但是新机器的性能不同,
需要使用新的模板,此时copy数据的时候就要使用deepcopy了。
"""

dict_old = {
    'CPU':[80,],
    'MEM':[80,],
    'DISK':[80,]
}

dict_new = copy.copy(dict_old)
dict_new['MEM'][0] = 50
print(dict_old)
print(dict_new)

# 这里的数据(dict_new和dict_old)都改变了,但是老的数据模板还在使用,这里就必须使用deepcopy
dict_new = copy.deepcopy(dict_old)
dict_new['MEM'][0] = 60
print(dict_old)
print(dict_new)

  

八、练习

程序1:购物车程序

需求:

  1. 启动程序后,让用户输入工资,然后打印商品列表
  2. 允许用户根据商品编号购买商品
  3. 用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒 
#!/usr/bin/env python
# -*- coding: utf-8 -*-

#定义一个商品列表
goods_list = [
('Iphone',5800),
('Bike',800),
('Book',45),
('Coffee',35),
('Solo 2 Beats',1590),
('MX4',1999),
('quit',0)
]
#定义购物车列表
buy_list = []

def show_all_goods():
    """
    显示所有的商品
    :return: None
    """
    for item, goods in enumerate(goods_list,1):
        print(item, goods[0], goods[1])

def get_choise_goods_info(choise_goods_item):
    """
    获取用户选择的商品信息
    :param choise_goods_item: 选择商品的编号
    :return: 商品的名称,商品的编号
    """
    choise_goods_name = goods_list[choise_goods_item-1][0]
    choise_goods_price = goods_list[choise_goods_item-1][1]
    return choise_goods_name, choise_goods_price

def account_balance(choise_goods_price, balance):
    """
    :param choise_goods_price: 选择的商品价格
    :param budget: 余额
    :return: 当前余额大于当前商品价格返回,减去商品价格的余额;反之返回-1
    """
    if balance > choise_goods_price:
        balance -= choise_goods_price
        return balance
    else:
        return -1

def append_to_buy_list(choise_goods_name):
    """
    将选择的商品加入购物车
    :param choise_goods_name: 选择商品的名字
    :return:None
    """
    buy_list.append(choise_goods_name)


def show_buy_goods(buy_list):
    """
    显示已经购买的商品
    :param buy_list:购买商品列表
    :return: None
    """
    for item, goods in enumerate(buy_list,1):
        print(item, goods)


#输入预算
budget = int(input("please input your budget:").strip())
balance = budget
while True:
    # 列出所有的商品
    print('本店商品:')
    show_all_goods()

    # 根据用户输入的商品编号获取商品信息
    choise_goods_item = int(input('请选择您需要的商品编号:').strip())
    choise_goods_name, choise_goods_price = get_choise_goods_info(choise_goods_item)

    print('------',choise_goods_name,'------')

    # 将商品加入购物车并对账户进行操作
    balance = account_balance(choise_goods_price, balance)
    if balance != -1:
        # 将用户的商品信息加入到购物车
        append_to_buy_list(choise_goods_name)
        print('当前账户余额为:',balance)
    else:
        # 余额不足,退出程序
        print('余额不足!')
        break

    # 显示已经购买的商品
    print('已经购买了以下商品:')
    show_buy_goods(buy_list)

  

程序2: 三级菜单

要求: 

  1. 打印省、市、县三级菜单
  2. 可返回上一级
  3. 可随时退出程序
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys

# 定义省市县
menu_dict = {
    '安徽省':{'池州市':['东至县','青阳县','石台县'],
           '合肥市':['蜀山区','经开区','政务区'],
           '安庆市':['宿松县','怀宁县','枞阳县']},

    '江西省':{'九江市':['湖口县','彭泽县','修水县'],
           '南昌市':['东湖区','西湖区','湾里区'],
           '赣州市':['安远县','崇义县','大余县']}
}

def show_province():
    """
    显示所有的省
    :return: 
    """
    for province in menu_dict.keys():
        print(province)

def is_province(input_province):
    """
    判断输入是否是一个省
    :param input_province: 输入的省
    :return: 
    """
    if input_province in menu_dict.keys():
        return True
    else:
        return False

def show_city(province):
    """
    显示当前省下面所有的市
    :param input_province: 输入的省
    :return: 
    """
    for city in menu_dict[province].keys():
        print(city)

def is_city(input_province,input_city):
    """
    判断输入是否是一个市
    :param input_province: 输入的省
    :param input_city: 输入的市
    :return: 
    """
    if input_city in menu_dict[input_province].keys():
        return True
    else:
        return False

def show_county(province, city):
    """
    显示当前市下面所有的县
    :param province: 输入的省
    :param city: 输入的市
    :return: 
    """
    for county in menu_dict[province][city]:
        print(county)

def is_county(input_province,input_city,input_county):
    """
    判断输入是否是一个县
    :param input_province: 输入的省
    :param input_city: 输入的市
    :param input_county: 输入的县
    :return: 
    """
    if input_county in menu_dict[input_province][input_city]:
        return True
    else:
        return False

while True:
    show_province()
    input_province = input('请选择你所在的省(输入quit返回上级菜单,输入exit退出程序.):')
    if input_province == 'quit':
        continue
    if input_province == 'exit':
        sys.exit()
    if not is_province(input_province):
        print('您所输入的省不存在,请重新输入:')
        continue

    while True:
        show_city(input_province)
        input_city = input('请选择你所在的市(输入quit返回上级菜单,输入exit退出程序.):')
        if input_city == 'quit':
            break
        if input_city == 'exit':
            sys.exit()
        if not is_city(input_province,input_city):
            print('您所输入的市不存在,请重新输入:')
            continue

        while True:
            show_county(input_province, input_city)
            input_county = input('请选择你所在的县(输入quit返回上级菜单,输入exit退出程序.):')
            if input_county == 'quit':
                break
            if input_county == 'exit':
                sys.exit()
            if not is_county(input_province,input_city,input_county):
                print('您所输入的县不存在,请重新输入:')
                continue

            print('您目前居住在{0},{1},{2}'.format(input_province, input_city, input_county))
            sys.exit()

  

程序3: 用户登录接口

要求: 

  1. 用户名密码输入正确后提示登录成功
  2. 登录错误三次后锁定用
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import sys

# 检查用户名和密码是否正确
def user_isexist(input_username, input_password):
  user_list = open('userList.txt','r')
  status = True
  for line in user_list.readlines():
    user =  line.strip("\n").split()
    username = user[0]
    password = user[1]
    if input_username == username and input_password == password:
      status = True
      break
    else:
      status = False
  user_list.close()
  return status

# 判断用户是否已经被锁定
def user_islocked(input_username):
  dropuser_list = open('dropUser.txt', 'r')
  status = True
  for line in dropuser_list.readlines():
    drop_username = line.strip("\n")
    if drop_username == input_username:
      status = True
      break
    else:
      status = False
  dropuser_list.close()
  return status

# 如果用户密码输入错误三次,锁定用户
def user_locked(input_username):
  dropuser_list = open('dropUser.txt', 'a')
  dropuser_list.write(input_username)
  dropuser_list.write('\n')
  dropuser_list.close() 

# Main
input_username = input('Please input you username:')
count = 0
while count < 3:
  # 如果用户没有被锁定
  if not user_islocked(input_username):
    input_password = input('Please input you password:')
    # 如果用户存在
    if user_isexist(input_username, input_password):
       print('welcome ...')
       sys.exit()
    # 如果用户不存在
    else:
       print('You input username or password is error!')
  # 如果用户已经被锁定
  else:
    print("You account has been locked,please contact the administrator!")
    sys.exit()
  count += 1
# 输入错误三次,锁定用户
if count == 3:
  user_locked(input_username)
  print('You account has been locked!')

  

转载于:https://www.cnblogs.com/cocoa-z/p/6397280.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值