python基础二

一、用户与程序交互

#在python3中
input:用户输入任何值,都存成字符串类型

#在python2中
input:用户输入什么类型,就存成什么类型
raw_input:等于python3的input

二、基本数据类型

什么是数据?为何要有多种类型的数据?

#数据即变量的值,如age=18,18则是我们保存的数据。
#变量的是用来反映/保持状态以及状态变化的,毫无疑问针对不同的状态就应该用不同类型的数据去标识
概括地说,编程语言的划分方式有以下三种

1、编译型or解释型

2、强类型or弱类型
2.1 强类型语言: 数据类型不可以被忽略的语言
即变量的数据类型一旦被定义,那就不会再改变,除非进行强转。
在python中,例如:name = 'egon',这个变量name在被赋值的那一刻,数据类型就被确定死了,是字符型,值为'egon'2.2 弱类型语言:数据类型可以被忽略的语言
比如linux中的shell中定义一个变量,是随着调用方式的不同,数据类型可随意切换的那种。

3、动态型or静态型
3.1 动态语言 :运行时才进行数据类型检查
即在变量赋值时,就确定了变量的数据类型,不用事先给变量指定数据类型

3.2 静态语言:需要事先给变量进行数据类型定义

所以综上所述,Python是一门解释型的强类型动态语言

数字

#int整型
定义:age=10 #age=int(10)
用于标识:年龄,等级,身份证号,qq号,个数

#float浮点型
定义:salary=3.1 #salary=float(3.1)
用于标识:工资,身高,体重,
#int(整型)
在32位机器上,整数的位数为32位,取值范围为-2**31~2**31-1,即-2147483648~2147483647
在64位系统上,整数的位数为64位,取值范围为-2**63~2**63-1,即-9223372036854775808~9223372036854775807
#long(长整型)
跟C语言不同,Python的长整数没有指定位宽,即:Python没有限制长整数数值的大小,但实际上由于机器内存有限,我们使用的长整数数值不可能无限大。
注意,自从Python2.2起,如果整数发生溢出,Python会自动将整数数据转换为长整数,所以如今在长整数数据后面不加字母L也不会导致严重后果了。
注意:在Python3里不再有long类型了,全都是int
>>> a= 2**64
>>> type(a)  #type()是查看数据类型的方法
<type 'long'>
>>> b = 2**60
>>> type(b)
<type 'int'>

#complex复数型
>>> x=1-2j
>>> x.imag
-2.0
>>> x.real
1.0

字符串

#在python中,加了引号的字符就是字符串类型,python并没有字符类型。
定义:name='egon' #name=str('egon') 
用于标识:描述性的内容,如姓名,性别,国籍,种族
#那单引号、双引号、多引号有什么区别呢? 让我大声告诉你,单双引号木有任何区别,只有下面这种情况 你需要考虑单双的配合
msg = "My name is Egon , I'm 18 years old!"

#多引号什么作用呢?作用就是多行字符串必须用多引号
msg = '''
今天我想写首小诗,
歌颂我的同桌,
你看他那乌黑的短发,
好像一只炸毛鸡。
'''
print(msg)
#数字可以进行加减乘除等运算,字符串呢?让我大声告诉你,也能?what ?是的,但只能进行"相加"和"相乘"运算。
>>> name='egon'
>>> age='18'
>>> name+age #相加其实就是简单拼接
'egon18'
>>> name*5 
'egonegonegonegonegon'


#注意1:字符串相加的效率不高
字符串1+字符串3,并不会在字符串1的基础上加字符串2,而是申请一个全新的内存空间存入字符串1和字符串3,相当字符串1与字符串3的空间被复制了一次,

#注意2:只能字符串加字符串,不能字符串加其他类型
字符串拼接(只能在字符串之间进行,且只能相加或相乘)

 列表

#在[]内用逗号分隔,可以存放n个任意类型的值
定义:students=['egon','alex','wupeiqi',] #students=list(['egon','alex','wupeiqi',]) 
用于标识:存储多个值的情况,比如一个人有多个爱好
#存放多个学生的信息:姓名,年龄,爱好
>>> students_info=[['egon',18,['play',]],['alex',18,['play','sleep']]]
>>> students_info[0][2][0] #取出第一个学生的第一个爱好
'play'

字典

#为何还要用字典?
存放一个人的信息:姓名,性别,年龄,很明显是多个值,既然是存多个值,我们完全可以基于刚刚学习的列表去存放,如下
>>> info=['egon','male',18]
定义列表的目的不单单是为了存,还要考虑取值,如果我想取出这个人的年龄,可以用
>>> info[2]
18
但这是基于我们已经知道在第3个位置存放的是年龄的前提下,我们才知道索引2对应的是年龄
即:
        #name, sex, age
info=['egon','male',18]
而这完全只是一种假设,并没有真正意义上规定第三个位置存放的是年龄,于是我们需要寻求一种,即可以存放多个任意类型的值,又可以硬性规定值的映射关系的类型,比如key=value,这就用到了字典
#在{}内用逗号分隔,可以存放多个key:value的值,value可以是任意类型
定义:info={'name':'egon','age':18,'sex':18} #info=dict({'name':'egon','age':18,'sex':18})
用于标识:存储多个值的情况,每个值都有唯一一个对应的key,可以更为方便高效地取值
info={
    'name':'egon',
    'hobbies':['play','sleep'],
    'company_info':{
        'name':'Oldboy',
        'type':'education',
        'emp_num':40,
    }
}
print(info['company_info']['name']) #取公司名


students=[
    {'name':'alex','age':38,'hobbies':['play','sleep']},
    {'name':'egon','age':18,'hobbies':['read','sleep']},
    {'name':'wupeiqi','age':58,'hobbies':['music','read','sleep']},
]
print(students[1]['hobbies'][1]) #取第二个学生的第二个爱好

布尔

#布尔值,一个True一个False
#计算机俗称电脑,即我们编写程序让计算机运行时,应该是让计算机无限接近人脑,或者说人脑能干什么,计算机就应该能干什么,人脑的主要作用是数据运行与逻辑运算,此处的布尔类型就模拟人的逻辑运行,即判断一个条件成立时,用True标识,不成立则用False标识
>>> a=3
>>> b=5
>>> 
>>> a > b #不成立就是False,即假
False
>>> 
>>> a < b #成立就是True, 即真
True

接下来就可以根据条件结果来干不同的事情了:
if a > b 
   print(a is bigger than b )

else 
   print(a is smaller than b )
上面是伪代码,但意味着, 计算机已经可以像人脑一样根据判断结果不同,来执行不同的动作。 

布尔类型的重点知识!!!:

#所有数据类型都自带布尔值
1、None,0,空(空字符串,空列表,空字典等)三种情况下布尔值为False
2、其余均为真 

重点

#1.可变类型:在id不变的情况下,value可以变,则称为可变类型,如列表,字典

#2.不可变类型:value一旦改变,id也改变,则称为不可变类型(id变,意味着创建了新的内存空间)

 三、格式化输出

    程序中经常会有这样场景:要求用户输入信息,然后打印成固定的格式

    比如要求用户输入用户名和年龄,然后打印如下格式:

    My name is xxx,my age is xxx.

    很明显,用逗号进行字符串拼接,只能把用户输入的名字和年龄放到末尾,无法放到指定的xxx位置,而且数字也必须经过str(数字)的转换才能与字符串进行拼接。

    这就用到了占位符,如:%s、%d

#%s字符串占位符:可以接收字符串,也可接收数字
print('My name is %s,my age is %s' %('egon',18))
#%d数字占位符:只能接收数字
print('My name is %s,my age is %d' %('egon',18))
print('My name is %s,my age is %d' %('egon','18')) #报错

#接收用户输入,打印成指定格式
name=input('your name: ')
age=input('your age: ') #用户输入18,会存成字符串18,无法传给%d

print('My name is %s,my age is %s' %(name,age))

#注意:
#print('My name is %s,my age is %d' %(name,age)) #age为字符串类型,无法传给%d,所以会报错
练习:用户输入姓名、年龄、工作、爱好 ,然后打印成以下格式
------------ info of Egon -----------
Name  : Egon
Age   : 22
Sex   : male
Job   : Teacher 
------------- end -----------------

# 方法一
name = input('请输入名字:')
age = input('请输入年龄:')
sex = input('请输入性别:')
job = input('请输入你的工作:')
s = '''
------ info of {name}------
Name:{name}
Age:{age}
Sex:{sex}
Job:{job}
------ end ------
'''.format(name=name, age=age, sex=sex, job=job)
print(s)
# 方法二
name = input()
age = input()
sex = input()
job = input()
s = '''
------ info of {0}------
Name:{0}
Age:{1}
Sex:{2}
Job:{3}
------ end ------
'''.format(name, age, sex, job)
print(s)

四、基本运算符

计算机可以进行的运算有很多种,可不只加减乘除这么简单,运算按种类可分为算数运算、比较运算、逻辑运算、赋值运算、成员运算、身份运算、位运算,今天我们暂只学习算数运算、比较运算、逻辑运算、赋值运算

赋值运算符

# python语法中除了有 = 号这种简单的赋值运算外,还支持增量赋值、链式赋值、交叉赋值、解压赋值,
# 这些赋值运算符存在的意义都是为了让我们的代码看起来更加精简。
# (1)增量赋值+=,-=,/=,*=,//=,%=,**=
# 1、链式赋值
'''
如果我们想把同一个值同时赋值给多个变量名,可以这么做
>>> x=y=z=10
>>> x,y,z
(10, 10, 10)
'''
# 2、交叉赋值
'''
我们定义两个变量m与n>>> m=10
>>> n=20如果我们想将m与n的值交换过来,可以这么做>>> temp=m
>>> m=n
>>> n=temp
>>> m,n
(20, 10)交叉赋值指的是一行代码可以搞定这件事>>> m=10
>>> n=20
>>> m,n=n,m # 交叉赋值
>>> m,n
(20, 10)

'''

# 3、解压赋值
'''
>>> nums=[11,22,33,44,55]
>>> 
>>> a=nums[0]
>>> b=nums[1]
>>> c=nums[2]
>>> d=nums[3]
>>> e=nums[4]
>>> a,b,c,d,e
(11, 22, 33, 44, 55)  # 解压赋值指的是一行代码可以搞定这件事>>> a,b,c,d,e=nums # nums包含多个值,就好比一个压缩包,解压赋值因此得名

但如果我们只想取头尾的几个值,可以用*_匹配,取两头,字典是去key值

>>> a,b,*_=nums
>>> a,b
(11, 22)

ps:字符串、字典、元组、集合类型都支持解压赋值

 

算数运算

    以下假设变量:a=10,b=20

print(4/3)  #保留小数
print(2355//3)  #只保留整数部分
print(2355%3)  #取模,取余数
print(4**3)  #去多少次方

比较运算

    以下假设变量:a=10,b=20

逻辑运算

#1、三者的优先级关系:not>and>or,同一优先级默认从左往右计算。
>>> 3>4 and 4>3 or 1==3 and 'x' == 'x' or 3 >3
False

#2、最好使用括号来区别优先级,其实意义与上面的一样
'''
原理为:
(1) not的优先级最高,就是把紧跟其后的那个条件结果取反,所以not与紧跟其后的条件不可分割

(2) 如果语句中全部是用and连接,或者全部用or连接,那么按照从左到右的顺序依次计算即可

(3) 如果语句中既有and也有or,那么先用括号把and的左右两个条件给括起来,然后再进行运算
'''
>>> (3>4 and 4>3) or (1==3 and 'x' == 'x') or 3 >3
False 

#3、短路运算:逻辑运算的结果一旦可以确定,那么就以当前处计算到的值作为最终结果返回
>>> 10 and 0 or '' and 0 or 'abc' or 'egon' == 'dsb' and 333 or 10 > 4
我们用括号来明确一下优先级
>>> (10 and 0) or ('' and 0) or 'abc' or ('egon' == 'dsb' and 333) or 10 > 4
短路:       0      ''            'abc'                    
            假     假              真

返回:                            'abc'

#4、短路运算面试题:
>>> 1 or 3
1
>>> 1 and 3
3
>>> 0 and 2 and 1
0
>>> 0 and 2 or 1
1
>>> 0 and 2 or 1 or 4
1
>>> 0 or False and 1
False 

成员运算符

# in ;
# print("l" in "liuqiao")
# 判断列表、判断字典时,是判断key.
# not in;

身份运算

#is比较的是id
#而==比较的是值

 

五、流程控制之if...else

 既然我们编程的目的是为了控制计算机能够像人脑一样工作,那么人脑能做什么,就需要程序中有相应的机制去模拟。人脑无非是数学运算和逻辑运算,对于数学运算在上一节我们已经说过了。对于逻辑运算,即人根据外部条件的变化而做出不同的反映,比如

1 如果:女人的年龄>30岁,那么:叫阿姨

 

age_of_girl=31
if age_of_girl > 30:
    print('阿姨好')

 2 如果:女人的年龄>30岁,那么:叫阿姨,否则:叫小姐

age_of_girl=18
if age_of_girl > 30:
    print('阿姨好')
else:
    print('小姐好')

3 如果:女人的年龄>=18并且<22岁并且身高>170并且体重<100并且是漂亮的,那么:表白,否则:叫阿姨

age_of_girl = 18
height = 171
weight = 99
is_pretty = True
if age_of_girl >= 18 and age_of_girl < 22 and height > 170 and weight < 100 and is_pretty == True:
    print('表白...')
else:
    print('阿姨好')
#在表白的基础上继续:
#如果表白成功,那么:在一起
#否则:打印。。。

age_of_girl=18
height=171
weight=99
is_pretty=True

success=False

if age_of_girl >= 18 and age_of_girl < 22 and height > 170 and weight < 100 and is_pretty == True:
    if success:
        print('表白成功,在一起')
    else:
        print('什么爱情不爱情的,爱nmlgb的爱情,爱nmlg啊...')
else:
    print('阿姨好')

4 如果:成绩>=90,那么:优秀

       如果成绩>=80且<90,那么:良好

       如果成绩>=70且<80,那么:普通

       其他情况:很差

score = input('请输入分数:')
score = int(score)

if score >= 90:
    print('优秀')
elif score >= 80 and score < 90:
    print('良好')
elif score >=70 and score <80:
    print('普通')
else:
    print('很差')
if 条件1:

    缩进的代码块

  elif 条件2:

    缩进的代码块

  elif 条件3:

    缩进的代码块

  ......

  else:  

    缩进的代码块

练习一:

'''
egon --> 超级管理员
tom  --> 普通管理员
jack,rain --> 业务主管
其他 --> 普通用户
'''
name = input('请输入姓名:')

if name == 'egon':
    print('超级管理员')
elif name == 'tom':
    print('普通管理员')
elif name == 'jack' or name == 'rain':
    print('业务主管')
else:
    print('普通用户')

练习二:

today = input('请输入星期几:')
if today in ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', ]:
    print('上班')
elif today in ['Saturday', 'Sunday',]:
    print('出去浪')
else:
    print('请输入正确星期几')

六、流程控制之while循环

1、 条件循环:while,语法如下

while 条件:    
    # 循环体
    # 如果条件为真,那么循环体则执行,执行完毕后再次循环,重新判断条件。。。
    # 如果条件为假,那么循环体不执行,循环终止
# 打印0-10
count=0
while count <= 10:
    print('loop',count)
    count+=1
# 打印0-10之间的偶数
count = 0
while count <= 10:
    if count % 2 == 0:
        print(count)
    count += 1
# 打印0-10之间的奇数
count = 0
while count <= 10:
    if count % 2 == 1:
        print(count)
    count += 1

2、死循环

import time

num = 0
while True:
    print('count', num)
    time.sleep(1)
    num += 1

3、循环嵌套与tag

tag=True 

  while tag:

    ......

    while tag:

      ........

      while tag:

        tag=False
#练习,要求如下:
    1 循环验证用户输入的用户名与密码
    2 认证通过后,运行用户重复执行命令
    3 当用户输入命令为quit时,则退出整个程序
ag = True
while tag:
    name = input('请输入用户名:')
    password = input('请输入密码:')
    if name == 'lq' and password == '123':
        while tag:
            cmd = input('请输入命令:')
            if not cmd:
                continue
            if cmd == 'quit':
                tag = False
                continue
            print('请执行该命令{}'.format(cmd))
    else:
        print('用户名或密码错误')

4、 break与continue

#break用于退出本层循环
while True:
    print("123")
    break
    print("456")

#continue用于退出本次循环,继续下一次循环
while True:
    print("123")
    continue
    print("456")

5、while+else

#与其它语言else 一般只与if 搭配不同,在Python 中还有个while ...else 语句,while 后面的else 作用是指,当while 循环正常执行完,中间没有被break 中止的话,就会执行else后面的语句
count = 0
while count <= 5 :
    count += 1
    print("Loop",count)

else:
    print("循环正常执行完啦")
print("-----out of while loop ------")
输出
Loop 1
Loop 2
Loop 3
Loop 4
Loop 5
Loop 6
循环正常执行完啦
-----out of while loop ------

#如果执行过程中被break啦,就不会执行else的语句啦
count = 0
while count <= 5 :
    count += 1
    if count == 3:break
    print("Loop",count)

else:
    print("循环正常执行完啦")
print("-----out of while loop ------")
输出

Loop 1
Loop 2
-----out of while loop ------

6、while循环练习题

# 1. 使用while循环输出1 2 3 4 5 6     8 9 10
count = 1
while count <= 10:
    if count == 7:
        count+=1
        continue
    print(count)
    count += 1
# 2. 求1-100的所有数的和
res = 0
count = 1
while count <= 100:
    res += count
    count += 1
print(res)
# 3. 输出 1-100 内的所有奇数
count = 1
while count <= 100:
    if count % 2 == 1:
        print(count)
    count += 1
# 4. 输出 1-100 内的所有偶数
count = 1
while count <= 100:
    if count % 2 == 0:
        print(count)
    count += 1
# 5. 求1-2+3-4+5 ... 99的所有数的和
res1 = 0
res2 = 0
count = 1
while count < 100:
    if count % 2 == 0:
        res1 -= count
    if count % 2 == 1:
        res2 += count
    count += 1
print(res1 + res2)
# 6. 用户登陆(三次机会重试)
count = 0
while count < 3:
    name = input('请输入用户名:')
    password = input('请输入登录密码:')
    if name == 'lq' and password == '123':
        print('登录成功')
        break
    else:
        count += 1
        print('用户名或密码错误')
else:
    print('三次机会用完,请等60秒后登录')
# 7:猜年龄游戏
# 要求:
#     允许用户最多尝试3次,3次都没猜对的话,就直接退出,如果猜对了,打印恭喜信息并退出
age=35
count=0
while count<3:
    guess_age=int(input('输入年龄'))
    if guess_age==35:
        print('guess success')
        break
    else:
        count+=1
# 8:猜年龄游戏升级版
# 要求:
#     允许用户最多尝试3次
#     每尝试3次后,如果还没猜对,就问用户是否还想继续玩,如果回答Y或y, 就继续让其猜3次,以此往复,如果回答N或n,就退出程序
#     如何猜对了,就直接退出
age = 35
count = 0
while count < 3:
    guess_age = int(input('输入年龄'))
    if guess_age == 35:
        print('guess success')
        break
    else:
        count += 1
        if count == 3:
            answer = input('是否想继续')
            if answer == 'Y' or answer == 'y':
                count = 0
            else:
                break

七、流程控制之for循环

 迭代式循环:for,语法如下

  for i in range(10):

    缩进的代码块

2 break与continue(同上)

3 循环嵌套

九九乘法表
for
i in range(1, 10): for j in range(1, i + 1): print('{}*{}={}'.format(i, j, i * j), end=' ') print() # 默认换行

 

# 打印金字塔
#分析
'''

             #max_level=5
    *        #current_level=1,空格数=4,*号数=1
   ***       #current_level=2,空格数=3,*号数=3
  *****      #current_level=3,空格数=2,*号数=5
 *******     #current_level=4,空格数=1,*号数=7
*********    #current_level=5,空格数=0,*号数=9

#数学表达式
空格数=max_level-current_level
*号数=2*current_level-1

'''

#实现
max_level=5
for current_level in range(1,max_level+1):
    for i in range(max_level-current_level):
        print(' ',end='') #在一行中连续打印多个空格
    for j in range(2*current_level-1):
        print('*',end='') #在一行中连续打印多个空格
    print()

八、开发工具IDE

1 为何要用IDE

到现在为止,我们也是写过代码的人啦,但你有没有发现,每次写代码要新建文件、写完保存时还要选择存放地点,执行时还要切换到命令行调用python解释器,好麻烦呀,能否一气呵成,让我简单的写代码?此时开发工具IDE上场啦,一个好的IDE能帮你大大提升开发效率。

很多语言都有比较流行的开发工具,比如JAVA 的Eclipse, C#,C++的VisualStudio, Python的是啥呢? Pycharm,最好的Python 开发IDE

2 安装

下载地址:https://www.jetbrains.com/pycharm/download 选择Professional 专业版

Comunnity社区版是免费的,但支持的功能不多,比如以后我们会学的Django就不支持,所以还是用专业版,但专业版是收费的,一年一千多,不便宜。唉,万能的淘宝。。。不宜再多说啦。

 注册完成后启动,会让你先创建一个项目,其实就是一个文件夹,我们以后的代码都存在这里面

3 创建目录

你以后写的项目可能有成百上千个代码文件 ,全放在一起可不好,所以一般把同样功能的代码放在一个目录,我们现在以天为单位,为每天的学习创建一个目录day1,day2,day3...这样

九、作业

 

1 练习题

*简述编译型与解释型语言的区别,且分别列出你知道的哪些语言属于编译型,哪些属于解释型

C、C++编译型 python解释型

*执行 Python 脚本的两种方式是什么

 

  • 交互运行方式和 Windows 系统上的 cmd 类似,启动 Python 解释器后,解释器等待用户输入指令,在接收到用户指令后就去执行该指令,指令执行完毕后接着等待用户的下一条指令。
  • 而脚本运行方式则是将用户执行存入到一个文本文件中,然后让解释器去执行该文本文件中的所有指令。

 

* Pyhton 单行注释和多行注释分别用什么?

# 单行

'''

''' 多行注释

布尔值分别有什么?

False True

声明变量注意事项有那些?

 

  • 变量 和 数据 是分开存储的
  • 数据 保存在内存中的一个位置
  • 变量 中保存着数据在内存中的地址
  • 变量 中 记录数据的地址,就叫做 引用

如何查看变量在内存中的地址?

 

  • 使用 id() 函数可以查看变量中保存数据所在的 内存地址

写代码

实现用户输入用户名和密码,当用户名为 seven 且 密码为 123 时,显示登陆成功,否则登陆失败!

实现用户输入用户名和密码,当用户名为 seven 且 密码为 123 时,显示登陆成功,否则登陆失败,失败时允许重复输入三次

实现用户输入用户名和密码,当用户名为 seven 或 alex 且 密码为 123 时,显示登陆成功,否则登陆失败,失败时允许重复输入三次

 

count = 0
while count < 3:
name = input('请输入用户名:')
password = int(input('请输入密码:'))
if name == 'seven' or name == 'alex' and password == 123:
print('登录成功')
break
else:
print('登录失败')
count += 1
else:
print('给你三次机会了,请关机')

 

 

写代码

a. 使用while循环实现输出2-3+4-5+6...+100 的和

 

count = 2
sec1 = 0
sec2 = 0
while count <= 100:
if count % 2 == 0:
sec1 += count
else:
sec2 -= count
count += 1
print(sec1+sec2)

 

b. 使用 while 循环实现输出 1,2,3,4,5, 7,8,9, 11,12

 

count = 1
while count <= 12:
if count == 10:
count += 1
continue
print(count)
count += 1

 

c. 使用 while 循环实现输出 1-100 内的所有奇数

 

count = 1
while count <= 100:
if count % 2 == 1:
print(count)
count += 1

d. 使用 while 循环实现输出 1-100 内的所有偶数

 

count = 1
while count <= 100:
if count % 2 == 0:
print(count)
count += 1

 

现有如下两个变量,请简述 n1 和 n2 是什么关系?

n1 = 123456 n2 = n1

value相等,内存地址不同

2 作业:编写登陆接口

基础需求:

  • 让用户输入用户名密码
  • 认证成功后显示欢迎信息
  • 输错三次后退出程序
dic={
    'egon1':{'password':'123','count':0},
    'egon2':{'password':'123','count':0},
    'egon3':{'password':'123','count':0},

}


while True:
    name=input('username>>: ')

    if not name in dic:
        print('用户不存在')
        continue
    if dic[name]['count'] > 2:
        print('尝试次数过多,锁定')
        continue

    password=input('password>>: ')


    if password == dic[name]['password']:
        print('登录成功')
        break
    else:
        print('用户名或密码错误')
        dic[name]['count']+=1

升级需求:

  • 可以支持多个用户登录 (提示,通过列表存多个账户信息)
  • 用户3次认证失败后,退出程序,再次启动程序尝试登录时,还是锁定状态(提示:需把用户锁定的状态存到文件里)
#db.txt内容:egon1|egon2|
dic={
    'egon1':{'password':'123','count':0},
    'egon2':{'password':'123','count':0},
    'egon3':{'password':'123','count':0},
}

count=0
while True:
    name=input('u>>: ')
    if name not in dic:
        print('用户不存在')
        continue

    with open('db.txt','r') as f:
        lock_users=f.read().split('|')
        if name  in lock_users:
            print('用户%s已经被锁定' %name)
            break

    if dic[name]['count'] > 2:
        print('尝试次数过多,锁定')
        with open('db.txt','a') as f:
            f.write('%s|' %name)
        break

    password=input('p>>: ')

    if password == dic[name]:
        print('登录成功')
        break
    else:
        print('用户名或密码错误')
        dic[name]['count']+=1

 

posted @ 2023-03-11 11:40  coder雪山  阅读(41)  评论(0编辑  收藏  举报