python核心编程--第其章 7.12 练习

7.12 练习

#!/usr/bin/python
# -*- coding: utf-8 -*-

# 7–5. userpw2.py. 下面的问题和例题7.1 中管理名字-密码的键值对数据的程序有关。
#    (a) 修改那个脚本,使它能记录用户上次的登录日期和时间(用time 模块),
#        并与用户密码一起保存起来。程序的界面有要求用户输入用户名和密码的提示。
#        无论户名是否成功登录,都应有提示,在户名成功登录后,应更新相应用户的上次
#        登录时间戳。如果本次登录与上次登录在时间上相差不超过4 个小时,则通知该用户:
#        “You already logged in at: <last_ login_timestamp>.”
#    (b) 添加一个“管理”菜单,其中有以下两项:(1)删除一个用户 (2)显示系统中所有用户
#        的名字和他们的密码的清单。
#    (c) 口令目前没有加密。请添加一段对口令加密的代码(请参考crypt, rotor, 或其它加密模块)
#    (d) 为程序添加图形界面,例如,用Tkinter 写。
#    (e) 要求用户名不区分大小写。
#    (f) 加强对用户名的限制,不允许符号和空白符。
#    (g) 合并“新用户”和“老用户”两个选项。如果一个新用户试图用一个不存在的用户名登录,
#        询问该用户是否是新用户,如果回答是肯定的,就创建该帐户。否则,按照老用户的方式登录。

# (a)
import time
import crypto
dbuserinfo = {}

def newuser():
    prompt = 'login desired: '
    while True:
        name = raw_input(prompt)
        if dbuserinfo.has_key(name):
            prompt = 'name taken, try another: '
            continue
        else:
            break
    pwd = raw_input('passwd: ')
    crypt_pwd = crypto.crypt(pwd)
    dbuserinfo[name] = []
    dbuserinfo[name].append(pwd)
    dbuserinfo[name].append(time.time())
    dbuserinfo[name].append(time.ctime())

def olduser():
    name = raw_input('login: ')
    pwd = raw_input('passwd: ')

    if dbuserinfo.has_key(name):
        passwd = dbuserinfo.get(name)[0]
        if passwd == pwd:
            print '*' * 10
            print 'welcome back', name
            print '*' * 10
            current_time = time.time()
            current_ctime = time.ctime()
            if (current_time - dbuserinfo[name][1]) < 60*60*4:
                print "You already logged in at: <%s>." % dbuserinfo[name][2]
            dbuserinfo[name][1] = current_time
            dbuserinfo[name][2] = current_ctime
        else:
            print '*' * 10
            print 'login incorrect'
            print '*' * 10
    else:
        print '*' * 10
        print 'login incorrect'
        print '*' * 10

# (b)

def deluser():
    prompt = 'delete user name: '
    delname = raw_input(prompt)
    if dbuserinfo.has_key(delname):
        del dbuserinfo[delname]
        print '*' * 10
        print "Delete success"
        print '*' * 10
    else:
        print '*' * 10
        print "User %s not exit." % delname
        print '*' * 10

def showusers():
    print '*' * 4, ' User list ', '*' * 4
    for user in dbuserinfo.keys():
        print user

def showmenu():
    prompt = """
Please choice:
 (N)ew User Login
 (E)xisting User Login
 (D)elete User
 (S)how All User
 (Q)uit

  Enter choice: """

    done = False
    while not done:
        chosen = False
        while not chosen:
            try:
                choice = raw_input(prompt).strip()[0].lower()
            except (EOFError, IndexError) as e:
                choice = 'q'
            print '\nYou picked: [%s]' % choice
            if choice not in 'nedsq':
                print 'invalid option, try again'
            else:
                chosen = True

                if choice == 'q':
                    done = True
                elif choice == 'n':
                    newuser()
                elif choice == 'e':
                    olduser()
                elif choice == 'd':
                    deluser()
                elif choice == 's':
                    showusers()

showmenu()

python核心编程--第其章 7.12 练习

时间: 2024-10-18 01:38:05

python核心编程--第其章 7.12 练习的相关文章

Python核心编程第五章习题

Python核心编程-第五章-习题 5.1  整形,讲讲Python普通整形与长整形的区别? Python的标准整形类型是最通用的数字类型.在大多数32位机器上,标准整形类型的取值范围是-2**32-2**32 - 1. Python的长整型类型能表达的数值仅仅与你的机器支持的(虚拟)内存大小有关,换句话说,Python能轻松表达很大的整数. 长整型类型是标准整形类型的超集,当程序需要使用比标准整形更大的整型时,可以使用长整型类型,在整型值后面添加L,表示这个为长整型,3.0版本已经统一称为为整

python核心编程--第六章 6.22 练习

6.22 练习 初学python,如果代码有问题,欢迎指正. #!/usr/bin/python # -*- coding: utf-8 -*- #6–1. 字符串.string 模块中是否有一种字符串方法或者函数 #可以帮我鉴定一下一个字符串是否是另一个大字符串的一部分? import string ss = "I'm chinese." substr = 'chinese' index = ss.find(substr) if index == -1: print("No

[python核心编程] 第五章练习题

第五章 数字 5-2. 操作符,写一个函数,计算并返回两个数的乘积“整理的时候才看到我把题目看成两个数的和了” 5-3. 标准类型操作符.写一段脚本,输入一个测验成绩,根据下面的标准,输出他的评分成绩(A-F) A:90~100 B:80~89 C:70~79 D:60~69 F:<60 5-4. 取余.判断给定年份是否是闰年.使用下面的公式. 一个闰年后就是指他可以被4整除,但不能被100整除,或者它可以被400整除. [python核心编程] 第五章练习题,布布扣,bubuko.com

Python核心编程_第二章课后习题

以下是自己在学习Python核心编程时,做的课后练习题.现在把它们贴出来,以记录自己的学习过程.小弟是机械出身,很多练习题目写的很是机械.虽然写出来的脚本都能满足题目要求,但效率可能不是最好的,所以,小弟还是厚着脸皮把它们给贴出来,一来可以让高手指点,二来可以与我一样在学习Python的兄弟共同学习. 以下的程序均以题目标号命名,如2-3这个题目,程序名就为2_3.py. 习题2_3.py #!/usr/bin/env python A = 10 B = 4 print "A plus B is

【7】python核心编程 第十一章-函数和函数式编程

1.*函数(与方法)装饰器 装饰器背后的主要动机源自python 面向对象编程.装饰器是在函数调用之上的修饰.这些修饰 仅是当声明一个函数或者方法的时候,才会应用的额外调用. 装饰器的语法以@开头,接着是装饰器函数的名字和可选的参数.紧跟着装饰器声明的是被修饰 的函数,和装饰函数的可选参数.装饰器看起来会是这样: @decorator(dec_opt_args) def func2Bdecorated(func_opt_args): : 那么什么是装饰器? 现在我们知道装饰器实际就是函数.我们也

【1】python核心编程 第三章

1.继续( \ ) 有两种例外情况一个语句不使用反斜线也可以跨行.在使用闭合操作符时,单一语句可以跨多行,例如:在含有小括号.中括号.花括号时可以多行书写.另外就是三引号包括下的字符串也可以跨行书写 2.变量赋值 赋值并不是直接将一个值赋给一个变量, 尽管你可能根据其它语言编程经验认为应该如此.在Python 语言中,对象是通过引用传递的.在赋值时,不管这个对象是新创建的,还是一个已经存在的,都是将该对象的引用(并不是值)赋值给变量. 3.关键字 # 判断是否为关键字 import keywor

python核心编程-第三章-习题

1.这是python的语言特性,python先创建对象,在给变量赋值时,不需要定义变量的名称和类型,它实际是用变量引用对象.变量类型在给变量赋值时自动声明 2.原因类似变量无须声明类型 3.python用下划线作为变量前缀和后缀指定特殊变量,对解释器有特殊意义,也是内建标识符所使用的特殊符号,故一般避免用下划线作为变量的开头和结尾 4.python一行可以书写多个语句,多个语句间用";"分隔.但是为了良好的编程风格,不推荐这么做 5.python可以将一个语句分成多行书写,行的末尾用反

python核心编程-第三章-个人笔记

1.语句和语法 (1)反斜杠"\"表示语句继续.python良好的编程习惯是一行最后不超过80个字符,一行字符过多时便须用到反斜杠换行继续该语句. PS:在使用小括号.中括号.大括号时可以跨行书写,无须反斜杠:三引号的字符串也可以跨行书写 (2)分号";"可以在同一行写多个语句.虽然python支持这么做,但为了代码可读性,一般不建议这么做 2.变量赋值 (1) python中,对象是引用传递的,而不是直接将值赋给对象  如: >>> a = 12

python核心编程-习题-第二章

PS:PDF在线地址:http://bcmi.sjtu.edu.cn/~zhaohai/ptm2012/data/Python-kernel.programming.v2.pdf 2-1  变量,print 和字符串格式化运算符.启动交互式解释器,给一些变量赋值(字符串,数值等等)并通过输入变量名显示它们的值.再用 print 语句做同样的事.这二者有何区别? 也尝试着使用字符串格式运算符%,多做几次,慢慢熟悉. # -*- coding:utf-8 -*- >>>a = 123 >