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