python练习——小程序

1、打印0-10(while/for)

count = 0
while count < 11:
    print(count)
    count += 1

for i in range(11):
    print(i)

2、求1-100所有数的和

a = 1
sum = 0
while a < 101:
    sum += a
    # print(sum)
    a += 1
print(sum)
s = 0
for i in range(1, 101):
    s += i
print(s)
print(sum(range(1, 101)))

 3、打印1-100之间的偶数

for n in range(1,101):
     if n % 2 == 0:
         print(n)

4、打印1-100之间的奇数

 for n in range(1,101):
     if n % 2 == 1:
         print(n)

5、求1-2+3-4+5......+99的和

count = 1
s1 = 0
s2 = 0
while count < 100:
    if count % 2 == 0:
        s1 += -count
    else:
        s2 += count
    count += 1
s = s1 + s2
print(s)

6、用户登录(三次机会重试)

# 任意用户输入错误三次即退出程序
Name = 'shj'
Pwd = '123'
count = 0
while count < 3:
    name = input("please input your name:")
    pwd = input("please input your password:")
    if name == Name and pwd == Pwd:
        print("\033[32mlogin successful..\033[0m")
        break
    else:
        print("Invalid username and password..")
    count += 1



# 同一用户输入错误三次即退出程序

info = {
    'shj':'123',
    'xxn':'456',
    'xka':'aaa'
}
l = []
while True:
    name = input("please input your name:")
    pwd = input("please input your password:")
    if name not in info:
        print("\033[31m您输入的用户不存在。\033[0m")
        l.append(name)
        if l.count(name)>2:
            print("\033[31m您已尝试太多次,程序退出\033[0m")
            break
    else:
        if pwd == info[name]:
            print("\033[32mlogin successful..\033[0m")
            break
        else:
            l.append(name)
            if l.count(name) > 2:
                print("\033[31m密码输入次数过多,程序退出。。\033[0m")
                break

7、猜年龄游戏

要求:
    允许用户最多尝试3次,3次都没猜对的话,就直接退出,如果猜对了,打印恭喜信息并退出

age_of_shj = 23
count = 0
while count < 3:
    guess_age = int(input("输入你猜的数:"))
    if guess_age == age_of_shj:
        print("\033[32m恭喜你猜对了!\033[0m")
        break
    elif guess_age < age_of_shj:
        print("太小了,往大了猜。")
    else:
        print("太大了,往小了猜。")
    count += 1
else:
    print("\033[31m你尝试太多次了,程序退出!\033[0m")

8、猜年龄游戏升级版

要求:
    允许用户最多尝试3次
    每尝试3次后,如果还没猜对,就问用户是否还想继续玩,如果回答Y或y, 就继续让其猜3次,以此往复,如果回答N或n,就退出程序
    如何猜对了,就直接退出

age_of_shj = 23
count = 0
while count < 3:
    guess_age = int(input("输入你猜的数:"))
    if guess_age == age_of_shj:
        print("\033[32m恭喜你猜对了!\033[0m")
        break
    elif guess_age < age_of_shj:
        print("太小了,往大了猜。")
    else:
        print("太大了,往小了猜。")
    count += 1
    if count == 3:
        ask = input("Do you want to continue?(y/n)")
        if ask in ['Y','y']:
            count = 0
        elif ask in ['N','n']:
            break
        else:
            print("您的输入有误,请重新输入")

9、打印九九乘法表

for i in range(1,10):
    for j in range(i):
        j += 1
        print("%s * %s = %s"%(i,j,i*j),end="\t")
    print()

10、打印金字塔

'''
    *     空格=4,*=1
   ***    空格=3,*=3
  *****   空格=2,*=5
 *******  空格=1,*=7
********* 空格=0,*=9
'''
level = int(input('请输入金字塔高度:'))
for num in range(level):
    print(" "*(level-num-1),end="")
    print("*"*(num*2-1))
第二种方法:
    用字符串的center方法


level = int(input('请输入金字塔高度:'))
for i in range(1,level+1):
    print(('*'*(2*i-1)).center((2*level-1),' '))

11、统计元组中所有数据属于字符串的个数

# 数据:t1 = (1, 2, '3', '4', 5, '6')
# 结果:3
t1 = (1, 2, '3', '4', 5, '6')
count = []
for t in t1:
    if isinstance(t,str):
        count.append(t)
print(len(count))

12、将以下数据存储为字典类型

数据:info = "name:Owen|age:18|gender:男"
结果:{'name': 'Owen', 'age': 18, 'gender': '男'}
注:年龄存储为数字类型

info = "name:Owen|age:18|gender:男"
l = info.split("|")
l1 = []
for l2 in l:
    s = l2.split(":")
    l1.append(s)
dic = dict(l1)
dic['age']=18
print(dic)

13、完成数据的去重

数据:t3 = (1, 2, 1, 2, 3, 5, 9)
结果:t3 = (1, 2, 3, 5, 9)
注:从不考虑顺序、考虑顺序两方面完成
t3 = (1, 2, 1, 2, 3, 5, 9)

# 不考虑顺序
t3 = set(t3)
t3 = tuple(t3)
print(t3)

# 考虑顺序
l = []
for t in t3:
    if t not in l:
        l.append(t)
l.sort()
print(tuple(l))

14、计算元组中所有可以转换为数字的数据的总和

数据:t4 = (10, 'abc', '100', '3')
运算结果:113

t4 = (10, 'abc', '100', '3')
s = 0
for t in t4:
    if isinstance(t,int):
        s += t
    elif t.isdigit():
        s += int(t)
print(s)

15、计算元组中所有可以转换为数字的数据的总和

数据:t4 = (10, 'abc', '100', '3', '壹', '肆', [1000], (10000,))
运算结果:11118
提示:
  -- 利用字符串isnumeric()判断汉字
  -- 利用字典{'壹': 1 ...}将汉字转换为数字
  -- 利用isinstance()将list和tuple中数据取出来
  -- 先将所有转化为数字的数据存放在一个单列集合中,在做运算

t4 = (10, 'abc', '100', '3', '壹', '肆', [1000], (10000,))
change = str.maketrans('壹肆','14')
s = 0
for t in t4:
    if isinstance(t,int):
        s += t
    elif isinstance(t,list):
        s += t[0]
    elif isinstance(t,tuple):
        s += t[0]
    elif t.isdigit():
        s += int(t)
    elif t in ['壹','肆']:
        s += int(t.translate(change))
print(s)

16、完成录入电话本

需求:

-- 从键盘中录入姓名(不区分大小写):
   -- 姓名必须是全英文组成,不是则重新录入姓名,如果是q,代表退出    #str.isalpha():True if 只包含字母
-- 从键盘中再录入电话:
   -- 电话必须为数字且长度必须是11位(不能转换为数字)   #str.isdigit(): True if 只包含数字
-- 如果出现姓名相同,则保留最后一次电话号码
-- 形成的数据是有电话分组的,如:第一次录入Owen,13355667788,则会形成
   -- {
       'O': {
          'Owen': '13355667788'
       }
   }

最终数据,分组名一定大写:
{
    'E': {
      'egon': '17788990000',
      'engo': '16633445566'
    },
    'O': {
       'Owen': '13355667788'
    }
}
# 电话本
phone_map = {}
# 是否退出系统
is_over = False
while not is_over:
    # 姓名初始制空,完成只有姓名输入正确才录入电话
    name = ''
    while True:
        # 姓名必须录入正确
        if not name:
            name = input("name:")
            if name == 'q':
                # 退出系统
                is_over = True
                break
            elif not name.isalpha():
                # 录入错误,置空名字
                print('name error')
                name = ''
                continue
        # 录入电话,保证是11位的数字字符串
        phone = input("phone:")
        if not (phone.isdigit() and len(phone) == 11):
            continue

        # 取组名
        group = name[0:1].upper()
        # 对于组名的操作:无组名,添加分组 | 有组名,不操作
        phone_map.setdefault(group, {})
        phone_map[group][name] = phone
        # 一条信息添加完毕,重置信息
        name = ''
        phone = ''
        print('录入成功')
print(phone_map)

17、完成登录注册系统(从空文件开始做)

需求:

1.可以循环登录注册,输入1代表选择登录功能,输入2代表注册功能,输入0代表退出其他,其他输入代表输入有误,重输
2.用户的账号密码信息存放在usr.txt文件中,保证用户注册成功后,重启系统,用户信息仍然保存
3.登录在账号验证通过才输入密码验证登录,账号验证三次失败自动进入注册功能,登录三次验证失败自动退出系统
4.第一次注册,文件写入 账号:密码 信息,再次注册追加写入 |账号:密码 信息
c = 0
f = open('usr.txt','r+',encoding='utf-8')
data = f.read()
dic = {}
if data != '':
    data1 = data.split('|')
    for msg in data1:
        k,v = msg.split(':')
        dic[k] = v
tag = True
while tag:
    print('''
        0 退出
        1 登录
        2 注册
    ''')
    choice = input("请输入您要进行的操作:").strip()
    if choice == '0':
        tag = False
    elif choice == '1':
        while tag:
            name = input("username:").strip()
            if name not in dic :
                if c==2:
                    print("此用户不存在,请注册")
                    while tag:
                        name = input("请设置账户名:").strip()
                        pwd = input("请设置密码:").strip()
                        if data == '':
                            f.write(name + ':' + pwd)
                        else:
                            f.write('|'+name+':'+pwd)
                        print("注册成功")
                        tag = False
                else:
                    print('未注册!')
                    c += 1
            else:
                count = 0
                while count < 3:
                    pwd = input("password:").strip()
                    if pwd == dic[k]:
                        print("登录成功")
                        break
                    else:
                        print("密码错误")
                        count += 1
                        if count == 2:
                            tag = False
                tag =False
    elif choice == '2':
        while tag:
            name = input("请设置账户名:").strip()
            pwd = input("请设置密码:").strip()
            if name in dic:
                print("用户名已存在,注册失败")
                continue
            else:
                if data == '':
                    f.write(name+':'+pwd)
                else:
                    f.write('|'+name+':'+pwd)
                print("注册成功")
                tag = False
    else:
        print("输入有误,请重新输入")
f.close()

18、用函数改造上题的代码

# 获取文件中用户信息
def get_usr_map():
    global dic,data,f,k
    with open('user.txt','r+',encoding='utf-8') as f:
        data = f.read()
        dic = {}
        if data != '':
            data1 = data.split('|')
            for msg in data1:
                k,v = msg.split(':')
                dic[k] = v


# 注册
def register():
    print('注册页面')
    get_usr_map()
    while True:
        name = input("请设置账户名:").strip()
        pwd = input("请设置密码:").strip()
        if name in dic:
            print("用户名已存在,注册失败")
            continue
        else:
            f = open('user.txt','a+',encoding='utf-8')
            if data == '':
                f.write(name + ':' + pwd)
            else:
                f.write('|' + name + ':' + pwd)
            print("注册成功")
            f.close()
            break


# 登录
def login():
    print('登录页面')
    get_usr_map()
    c = 0
    while True:
        name = input("username:").strip()
        if name not in dic:
            if c == 2:
                print("此用户不存在,请注册!")
                register()
                break
            else:
                print("当前用户未注册!")
                c += 1
        else:
            count = 0
            while count < 3:
                pwd = input("password:").strip()
                if pwd == dic[k]:
                    print("登录成功")
                    break
                else:
                    print("密码错误")
                    if count == 2:
                        break
                    count += 1
            break


# 启动系统
def start():
    print("系统启动!")
    while True:
        tag = input("""请输入操作指令:
0:退出
1:登录
2:注册    
>>>: """)
        if tag.isdigit():
            tag = int(tag)
        if tag == 0:
            break
        elif tag == 1:
            login()
            break
        elif tag == 2:
            register()
            break
        else:
            print("输入有误,请重新输入")


# 启动系统(入口)
start()

19、装饰器的题目

'''
拓展题:

1.原功能:entry_grade
* ) 可以完成『成绩录入功能』
-- 可以重复录入成绩,默认所有输入都是合法的(1~100之间的数)
-- 当录入成绩为0时,结束成绩的录入
-- 将录入的成绩保存在列表中并返回给外界,eg:[90, 80, 50, 70]

2.选择课程装饰器:choose_course
*) 为『成绩录入功能』新增选择课程的拓展功能,达到可以录入不同学科的成绩
-- 可以重复输入要录制的学科名,然后就可以进入该门学科的『成绩录入功能』,
录入结束后,可以进入下一门学科成绩录入
- - 当输入学科名为q时,结束所有录入工作
- - 将学科成绩保存在字典中并返回给外界,
eg:{'math': [90, 80, 50, 70], 'english': [70, 50, 55, 90]}

3.处理成绩装饰器: deal_fail
*) 可以将所有录入的成绩按60分为分水岭,转换为"通过" | "不通过"进行存储
- - 如果只对原功能装饰,结果还为list返回给外界,eg:["通过", "通过", "不通过", "通过"]
- - 如果对已被选择课程装饰器装饰了的原功能再装饰,结果就为dict返回给外界,
eg:{'math': ["通过", "通过", "不通过", "通过"], 'english': ["通过", "不通过", "不通过", "通过"]}
'''
def deal_fail(fn):
    def inner(*args,**kwargs):
        res = fn()  #{'math': [80, 70, 60], 'chinese': [90, 99, 98]}
        for k in res:
            l = []
            for v in res[k]:
                if int(v) >= 60:
                    l.append('通过')
                else:
                    l.append('不通过')
            res[k] = l
        print(res)
        return res
    return inner


def choose_course(fn):
    def inner(*args,**kwargs):
        stu_dic = {}
        while True:
            choice = input("请输入要录入的学科(按q退出):")
            if choice == 'q':
                break
            else:
                score_lis = fn()
                stu_dic[choice]=score_lis
        print(stu_dic)   # {'math': [80, 70, 60], 'chinese': [90, 99, 98]}
        return stu_dic
    return inner

@deal_fail
@choose_course
def entry_grade():
    scorelist = []
    while True:
        score = int(input("请输入录入的成绩(按0退出):"))
        if score == 0:
            print(scorelist)
            break
        elif score in range(1,101):
            scorelist.append(score)
        else:
            print("\033[31m非法输入!!!\033[0m")
    return scorelist

entry_grade()

20、认证问题

写一个认证,只有登录才能查看图书,利用token完成,token存缓存,先到缓存找,如果过期了再去数据库拿,如果过期了就重新登陆。

models.py:建表

from django.db import models


class User(models.Model):
    name = models.CharField(max_length=32)
    pwd = models.CharField(max_length=12)

class Token(models.Model):
    user = models.OneToOneField(to='User')
    token = models.CharField(max_length=64)
    create_time = models.CharField(max_length=128)

 MyAuths.py:认证

from rest_framework.authentication import BaseAuthentication
from app01 import models
import time
from rest_framework.exceptions import AuthenticationFailed
from django.core.cache import cache
class MyAuth(BaseAuthentication):
    def authenticate(self, request):
        token = request.META.get('HTTP_TOKEN')
        server_token = cache.get('token')
        data_tokenobj = models.Token.objects.filter(token=token).first()
        if not data_tokenobj:
            raise AuthenticationFailed('请先登录')
        if server_token:
            if server_token.get('token') == token:
                return data_tokenobj.user, data_tokenobj
            else:
                raise AuthenticationFailed('token不一致,认证失败')
        else:
            create_time = data_tokenobj.create_time
            if time.time() - float(create_time) >= 60:
                models.Token.objects.filter(token=token).delete()
                raise AuthenticationFailed('当前token已过期,请重新登录')
            else:
                return data_tokenobj.user, data_tokenobj

views.py:登录及图书视图

from rest_framework.views import APIView
from app01 import models
import uuid
from app01.MyAuths import MyAuth
from rest_framework.response import Response
from django.core.exceptions import ObjectDoesNotExist
import time
from django.core.cache import cache


class Login(APIView):
    def post(self, request, *args, **kwargs):
        response = {'code': 100, 'msg': '登陆成功'}
        name = request.data.get('name')
        pwd = request.data.get('pwd')
        try:
            user_obj = models.User.objects.filter(name=name, pwd=pwd).get()
            token = uuid.uuid4()
            create = time.time()
            models.Token.objects.update_or_create(user=user_obj, token=token, create_time=create)
            cache.set('token', {'name': name, 'token': token}, 20)
            response['token'] = token
        except ObjectDoesNotExist as e:
            response['code'] = 101
            response['msg'] = '用户名或密码错误'
        except Exception as e:
            response['code'] = 102
            response['msg'] = str(e)
        return Response(response)


class Book(APIView):
    authentication_classes = [MyAuth, ]
    def get(self, request, *args, **kwargs):
        print(request.user.name)
        return Response('返回了数据库中的所有图书')

路由:

urlpatterns = [   
    url(r'^book/', views.Book.as_view()),
    url(r'^login/', views.Login.as_view()),
]

 

你可能感兴趣的:(python程序练习)