Python基本语法简单应用

项目源码链接

链接: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确定更换。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

H0aほしの

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值