项目源码链接
链接:https://pan.baidu.com/s/1cs_SW7weGM4xIaD53C2sRw?pwd=6gnv
此链接已包含Python等项目。
Python 剪刀石头布游戏
伪代码
死循环
提示进入游戏,显示时间
输入密码
1.密码正确进入猜拳
死循环
1.按Q退出
2.出错招
3.判断输赢
用户赢
用户输
平局
2.密码错误重新输入
示例代码
import time
import re
import random
import sys
# 定义出招列表czb_list
czb_list = ['石头', '剪刀', '布']
# 定义密码判断函数
def judge_password():
# 输入密码
password = input('密码:')
# 密码正确
if re.match(r'^1[3458]\d{9}$', password):
return True, '密码正确'
# 密码错误
else:
return False, '密码错误'
# 定义玩游戏函数
def play_game():
# 用户与电脑出招
user = input('请出招(Q退出):')
computer = random.choice(czb_list)
if user == 'Q':
# 退出
sys.exit('已退出')
elif user in czb_list:
# 用户赢
if user == '石头' and computer == '剪刀' or user == '剪刀' and computer == '布' or user == '布' and computer == '石头':
print(f'你赢了,电脑出的是{computer}')
# 平局
elif user == computer:
print(f'平局,电脑出的是{computer}')
# 用户输
else:
print(f'你输了,电脑出的是{computer}')
else:
# 出错招
print('出错招了')
if __name__ == '__main__':
while True:
# 提示进入游戏 显示时间
local_time = time.strftime('%Y-%m-%d %H:%M:%S')
print(f'欢迎来到猜拳游戏,当前时间:{local_time}')
# 获取返回值
flag, msg = judge_password()
# 判断返回值,正确进入游戏 错误重新输入
if flag:
print(msg)
while True:
play_game()
else:
print(msg)
if len(password)==11 and password.isdigit() and password[0]=='1' and password[1] in '3458':
if re.match(r'^1[3458]\d{9}$', password):
普通方式与正则匹配,这两种判断方式等价。
return True, '密码正确'
flag, msg = judgepassword()
返回与获取返回值时,用逗号分隔就行。
使用模块与功能
time模块方法
time.time()
功能:获取时间戳
参数:无
返回值:时间戳(1970年1月1日午夜以来的秒数)
time.sleep(seconds)
功能:暂停程序指定秒数
参数:秒数
返回值:无
time.strftime(format, p_tuple=None)
功能:时间戳转格式
参数:1:格式'%Y-%m-%d %H:%M:%S' 2:时间戳(可以没有)
返回值:格式化后的时间
f-format方法
name = 'H0a2204'
age = 20
print(f'My name is {name}, age is {age}.')
引号前加f或F,变量用{}括起来
print('My name is {}, age is {}.'.format(name, age))
加{},引号后加.format并传入变量
print('my name is %s,'%name, 'age is %d.'%age)
加占位符,引号后加%变量名
占位符:%s:字符串、整数、浮点数;%d:整数、浮点数(除去小数部分);%f:浮点数、整数(默认六位小数);%.nf:n位小数。
re模块方法
re.match(pattern, string, flags=0)
功能:根据正则表达式在字符串起始位置获取一个匹配对象,获取匹配值
参数:1:pattern正则表达式 2:匹配对象 3:匹配方式(如是否区分大小写)
返回值:匹配值或者None
re.search(pattern, string, flags=0)
功能:根据正则表达式在字符串中获取一个匹配对象,获取匹配值
参数:1:pattern正则表达式 2:匹配对象 3:匹配方式(如是否区分大小写)
返回值:匹配值或者None
re.findall(pattern, string, flags=0)
功能:根据正则表达式在字符串中获取多个个匹配对象,获取匹配值
参数:1:pattern正则表达式 2:匹配对象 3:匹配方式(如是否区分大小写)
返回值:列表
random模块方法
random.random()
功能:生成0到1之间随机浮点数
参数:无
返回值:0到1之间随机浮点数
random.randint(a, b)
功能:生成a到b之间随机整数(包含a和b)
参数:1:起始值 2:结束值
返回值:a到b之间随机整数(包含a和b)
random.randrange(start, stop=None)
功能:生成start到stop之间随机整数(包含start,不包含stop)
参数:1:起始值 2:结束值
返回值:start到stop之间随机整数(包含a和b)
random.choice(seq)
功能:在序列中随机选择一个元素返回
参数:一个序列,字符串、元组、列表均可
返回值:序列中的一个值
sys模块方法
sys.exit(*args, **kwargs)
功能:退出Python解释器
参数:1:任意数量位置参数,作为元组处理 2:任意数量关键字参数,作为字典处理
返回值:参数状态码
sys.path
功能:获取模块路径
参数:无
返回值:模块路径列表
Python ATM自动取款机
目录结构设计
1.建立api文件夹 -> 处理业务逻辑
user_interface.py 用户业务逻辑
bank_interface.py 银行业务逻辑
2.建立config文件夹 -> 文件存储位置
setting.py
3.建立core文件夹 -> 核心文件
src.py 功能文件
4.建立db文件夹 -> 操作数据
user_data 用户数据文件夹
db_handle.py 数据处理
5.建立lib文件夹 -> 自定义模块
common.py 常用模块
readme 项目文档
run.py 项目启动文件
示例代码
config/settings.py
# 为数据保存查询提供user_data文件夹路径
data_path = r'D:\CodeKit\Project\aa.PythonProject\ATM\db\user_data'
Pycharm侧边栏获取文件路径快捷键:Ctrl + Shift + C。
db/db_handle.py
from config.settings import data_path
import json
import os
# 保存用户数据
def save_data(user_info):
# 获取username的值与user_data文件夹路径拼接为用户json文件路径
username = user_info['username']
# 将用户数据写入到用户json文件中
with open(f'{data_path}/{username}.json', 'w', encoding='utf-8') as f:
json.dump(user_info, f)
# 查找用户数据
def select_data(username):
# 拼接用户json文件路径
user_data_path = f'{data_path}/{username}.json'
# 判断是否存在用户json文件
if os.path.exists(user_data_path):
# 打开读取用户json文件并返回
with open(user_data_path, 'r', encoding='utf-8') as f:
user_data = json.load(f)
return user_data
settings文件中为我们保存与查询用户数据提供了user_data文件夹路径,在db_handle中与username的值拼接起来后即为用户json文件路径,因为此项目中未使用MySql数据库,所以通过with open与os的方法,为我们定义了save_data与select_data即保存查询用户数据的函数;
api/user_interface.py
from db import db_handle
# 注册业务逻辑
def register_info(username, password):
# 将用户数据封装为字典
user_info = {
'username': username,
'password': password,
'money': 1000,
'account': [],
}
# 查询用户数据
user_data = db_handle.select_data(username)
# 该用户已存在,返回注册失败
if user_data:
return False, '注册失败,该用户已存在'
# 该用户不存在,保存用户数据并返回注册成功
else:
db_handle.save_data(user_info)
return True, f'{username}注册成功'
# 登录业务逻辑
def login_info(username, password):
# 查询用户数据
user_data = db_handle.select_data(username)
# 查到数据进行密码判断
if user_data:
# 判断输入的密码是否与用户json文件的密码相同,相同登录成功
if password==user_data['password']:
return True, f'{username}登陆成功'
# 不同登录失败
else:
return False, '登陆失败,密码输入错误'
# 未查到数据返回用户不存在
else:
return False, '登陆失败,该用户不存在'
# 查看余额业务逻辑
def check_money_info(login_user):
# 查询用户数据,将用户金额返回出去
user_data = db_handle.select_data(login_user)
return user_data['money']
api/bank_interface.py
from db import db_handle
import time
# 存钱业务逻辑
def save_money_info(login_user, money):
# 查询用户数据,存入金额
user_data = db_handle.select_data(login_user)
user_data['money']+=money
# 定义流水账单信息,添加到账单中
now_time = time.strftime('%Y-%m-%d %H:%M:%S')
account_info = f'{now_time} 用户{login_user}存款{money}元成功'
user_data['account'].append(account_info)
# 保存用户数据,返回流水账单信息
db_handle.save_data(user_data)
return True, account_info
def get_money_info(login_user, money):
# 查询用户数据,取出金额
user_data = db_handle.select_data(login_user)
# 判断账户余额与取款金额大小,账户余额充足时即可取出
if user_data['money']>=money:
user_data['money']-=money
# 定义流水账单信息,添加到账单中
now_time = time.strftime('%Y-%m-%d %H:%M:%S')
account_info = f'{now_time} 用户{login_user}取款{money}元成功'
user_data['account'].append(account_info)
# 保存用户数据,返回流水账单信息
db_handle.save_data(user_data)
return True, account_info
# 账户余额不足时取出失败
else:
return False, '账户余额不足,请重新输入'
def get_account(login_user):
# 查询用户数据,将流水账单返回出去
user_data = db_handle.select_data(login_user)
return user_data['account']
user_interface与bank_interface的代码通过对数据的保存与查询,分别进行了用户与银行的业务逻辑操作;用户业务逻辑中包含判断该用户是否存在能否注册,密码是否正确能否登录,查询余额等;银行业务逻辑包含对账户余额的修改,添加流水账单信息,查询流水账单等。
lib/common.py
from core import src
# check = is_login(check)
def is_login(func):
def check():
if src.login_user:
# res = check()
res = func()
return res
else:
print('请先登录')
src.login()
return check
core/src.py
import re
from api import user_interface, bank_interface
from lib import common
from pprint import pprint
import sys
# 定义全局变量login_user
login_user = None
# 注册
def register():
while True:
# 输入用户名,密码,确认密码
username = input('姓名:')
password = input('密码:')
re_password = input('确认密码:')
# 判断密码输入是否合法,合法判断密码是否一致
if re.match(r'^\d{6}$', password):
# 判断两次密码输入是否一致,一致获取注册结果
if password==re_password:
# 获取注册结果
flag, msg = user_interface.register_info(username, password)
if flag:
print(msg)
break
else:
print(msg)
break
# 不一致返回注册失败
else:
print('注册失败,密码输入不一致')
# 不合法返回注册失败
else:
print('注册失败,密码输入不合法')
# 登陆
def login():
while True:
# 输入姓名,密码
username = input('姓名:')
password = input('密码:')
# 获取登录结果
flag, msg = user_interface.login_info(username, password)
if flag:
print(msg)
# 将login_user声明为全局变量
global login_user
# 将username的值赋给login_user
login_user = username
break
else:
print(msg)
break
# 查看余额
# 装饰器效果check = is_login(check)
@common.is_login
def check():
# 获取用户账户余额并打印出来
money = user_interface.check_money_info(login_user)
print(f'用户{login_user}账户余额为{money}元')
# 存钱
@common.is_login
def save_money():
while True:
# 输入存款金额
money = input('存款金额:')
# 判断输入的字符串是否由数字组成
if not money.isdigit():
print('输入错误,请重新输入')
# 跳出当前次循环
continue
else:
# 获取存款结果信息
flag, msg = bank_interface.save_money_info(login_user, int(money))
if flag:
print(msg)
break
else:
print(msg)
break
# 取钱
@common.is_login
def get_money():
while True:
# 输入取款金额
money = input('取款金额:')
# 判断输入的字符串是否由数字组成
if not money.isdigit():
print('输入错误,请重新输入')
# 跳出当前次循环
continue
else:
# 获取存款结果信息
flag, msg = bank_interface.get_money_info(login_user, int(money))
if flag:
print(msg)
break
else:
print(msg)
break
# 查看账单
@common.is_login
def account():
# 获取流水账单信息
account_list = bank_interface.account_info(login_user)
# 判断是否有流水账单,有则返回账单信息
if account_list:
pprint(account_list)
# 无则返回提示信息
else:
print('该用户目前无流水账单')
# 定义功能字典 键为整型 值为元组
# 元组第一个值放描述信息 第二个值放函数对象
func_selects = {
0: ('退出', sys.exit),
1: ('注册', register),
2: ('登录', login),
3: ('查看余额', check),
4: ('存钱', save_money),
5: ('取钱', get_money),
6: ('查看账单', account),
}
# atm项目启动
def atm():
print('欢迎来到ATM自助取款机')
while True:
# 获取功能字典 打印描述信息
for k in func_selects:
print(k, func_selects[k][0])
try:
# 判断操作是否有效,有效则调用
select = int(input('请输入你要进行的操作:'))
# fun_selects字典
# fun_selects[select]字典键名
# func_selects[select][1]函数对象
# func_selects[select][1]()调用函数
if select in func_selects:
func_selects[select][1]()
else:
print('输入错误,请重新输入')
except Exception:
# 无效则返回提示信息 无效说明非数字或者无效数字等
print('输入错误,请重新输入')
当在外部定义了变量login_user,global login_user将login_user声明为全局变量,login_user=username可以将其login_user的值修改,外部访问的是username的值,而不是login_user初始值None。
core/src.py的代码主要是用于与用户进行交互,相当于MVC中的视图层,用户输入数据后传入到后端页面,后端对其进行数据处理后返回到视图层,供用户进行下一步操作。
使用模块与功能
with open方法
with open(file, mode, encoding) as f:
功能:打开、读取、写入文件,并在操作完成后关闭文件
参数:1:文件路径 2:操作模式:'r'读取 'w'写入 'a'追加 'b'二进制打开 3:编码方式:utf-8 ASCLL utf-16 utf-32
返回值:无
json模块方法
json.dumps(obj)
功能:将Python对象等转为json字符串
参数:Python对象,即字符串,列表,字典等
返回值:json字符串
json.loads(json_string)
功能:将json字符串解析为Python对象
参数:json字符串
返回值:Python对象,即字符串,列表,字典等
json.dump(obj, file)
功能:将Python对象转为json字符串,并写入到文件对象中
参数:1:Python对象 2:已打开的文件对象
返回值:无
json.load(file)
功能:从文件对象中读取json字符串,解析为Python对象
参数:已打开的文件对象
返回值:解析后的Python对象
os模块方法
os.mkdir(path)
功能:创建一个目录
参数:目录路径
返回值:无
os.remove(path)
功能:删除指定文件
参数:文件路径
返回值:无
os.path.exists(path)
功能:判断目录路径是否存在
参数:目录路径
返回值:无
装饰器与语法糖
def outer_function(msg):
def inner_function():
print(msg)
return inner_function
my_function = outer_function('hello')
my_function() # 输出 hello
# 内部函数inner_function作用
def inner_function():
print('hello')
# 语法糖 函数对象=外部函数(函数对象)
check = is_login(check)
save_money = is_login(save_money)
get_money = is_login(get_money)
account = is_login(account)
# 函数对象带参数时,内部函数带上参数*args, **kwargs
@is_login
def check(username):
print(username)
def is_login(func):
def check(*args, **kwargs):
if src.login_user:
res = func(*args, **kwargs)
return res
else:
print('请先登录')
src.login()
return check
关注点:参数,返回值。
当调用闭包函数outer_function('hello')时,先将值hello带入到内部函数中,观察内部函数inner_function的作用,再为outer_function('hello')添加上小括号即outer_function('hello')(),返回值是inner_function,此时即可将outer_function('hello')换成inner_function,最后即inner_function(),打印hello。
外部函数参数带入内部函数,观察其作用;将外部函数调用换成内部函数()即可。
语法糖:函数对象=外部函数(函数对象)
try-except方法
try:
# 判断操作是否有效,有效则调用
select = int(input('请输入你要进行的操作:'))
# fun_selects字典
# fun_selects[select]字典键名
# func_selects[select][1]函数对象
# func_selects[select][1]()调用函数
if select in func_selects:
func_selects[select][1]()
else:
print('输入错误,请重新输入')
except Exception:
# 无效则返回提示信息 无效说明非数字或者无效数字等
print('输入错误,请重新输入')
try-except语句可以捕获处理异常,常见报错类型:SyntaxError,TypeError,ValueError,IndexError,AttributeError;这些报错类型可以更改为Exception,即处理所有的报错类型。
ATM项目中用户可能会输入无效数字与非数字,因此用tre-except进行处理。
Pycharm设置源文件夹
当在此工程下创建了一个子工程,有时会出现导入出错的问题。此时就要将子工程设置为一个源文件夹。
第一步:右击子工程;
第二步:点击Mark Directory as里的Sources Root即可。
只有文件夹能设置为源文件夹,不可对文件进行相同操作,操作后文件夹会变蓝。
Pycharm更换背景图片
第一步:点击File找到settings;
第二步:找到Appearance,点击Background Image;
第三步:找到图片路径,点击OK确定更换。