yang1333

一. 基础题

1. 集合内元素的三个特征什么是?

"""
1. 集合内元素无序
2. 集合内元素必须为不可变类型
3. 集合内元素唯一
"""

2. 集合的用途是什么?

"""
去重, 关系运算
"""

3. 如何解决python3乱码问题

"""
你使用的编辑器使用什么字符编码存入硬盘的,你就指定文件头 (encoding: 存入硬时的字符编码) 就使用什么编码类型.

# 标准: 指定文件头 # encoding: 与文件存的编码格式一致
"""

4. 控制文件读写内容的模式

"""
t: 文本模式, 只能读取文本文件.
b: bytes模式, 可以读取任意类型的文件.  # 补充: b模式也叫二进制模式
"""

5. 控制文件读写操作的模式

"""
r: 只读模式.文件不存在报错,文件存在文件指针在起始位置.
w: 只写模式. 文件不存在创建, 文件存在则清空原文件中的数据.文件指针在起始位置.
a: 只追加模式. 文件不存在创建, 文件存在则在文件末尾追加写内容.文件指针在结束位置.
x: 只写模式. 文件不存在创建, 文件存则报错.文件指针在起始位置.

以下三种模式都是以加号左边的模式为基准来控制文件读写操作: 
r+: 可读可写模式. 
w+: 可写可读模式.
a+: 可追加写刻度模式.
x+: 可写可读模式.
"""

6. 文件操作的基本操作流程是什么(注意)?

"""
1. 调用open功能让操作系统按照指定的路径去打开文件, 并赋值给一个f句柄对象
2. 当执行到f.read()操作,操作系统按照控制文件读写操作的模式去操作文件
3. 操作系统把文件从硬盘读入内存,按照指定的字符编码解码,加载到内存解码为unicode(等同于字符串)
4. 当执行完毕f.read()操作,文件指针移动到文件的末尾.操作完文件以后执行f.close()操作,回收操作系统资源.

# 标准:
1. 打开文件
2. 读取内容
3. 关闭文件
"""

7. 文件处理with的好处是什么(注意)?

"""
with简称上下文管理: 上, 帮我们操作指定文件的一系列操作  下, 帮我们自动回收操作系统资源(自动调用f.close())  

# 标准: with称之为上下文管理, 上文帮你打开文件, 下文帮你关闭文件
"""

8. 为何要用文件?

"""
永久保存数据不丢失  # 详细: 用户或者应用程序可以通过文件, 将数据永久保存到硬盘中
"""

9. 什么是函数?

"""
函数就是执行某一特定功能的工具.   # 订正: 函数就是具备某一功能的工具
"""

10. 函数的使用,必须先遵循什么?

"""
先定义 后调用
"""

11. 为何要用函数?

"""
1. 增加程序的可维护性, 可扩展性
2. 减少代码冗余问题  # 订正: 解决代码冗余问题
3. 让程序体结构清晰,功能区分增强了可读性.
"""

12. 定义函数会发生什么事情?

"""
1. 申请内存空间保存函数体代码
2. 将上述内存地址与函数名进行绑定, # 补充: 且函数名最好使用动词
3. 定义函数阶段不执行函数体代码, 只检测语法.
"""

13. 调用函数发生的事情

"""
1. 通过函数名找到对应的函数体代码的内存地址 # 订正: 通过函数名找到函数的内存地址
2. 通过加括号, 触发函数体代码的执行
3. 这个时候开始检测函数体代码内的语法.
"""

14. 定义函数的三种形式分别是什么?

"""
无参:
def func():
    print("from func")
    
有参:
def func(x):
    print(x)

空函数:
def func():
    pass
"""

15. 函数调用的三种形式分别是什么?

"""
语句形式:
func()

表达式:
赋值表达式
res = func()
print(res)    
    
数学表达式
add(1, 2) * 10

调用结果的返回值作为参数:
add(add(1, 2), 3)
"""

16.函数的返回值是否可以返回多个?是否可以返回所有数据类型?

"""
1. 可以返回多个,每个值以逗号隔开,且返回的是一个元组的格式.
2. 可以返回所有数据类型.
"""

17. 什么是形参?什么是实参?

"""
形参: 定义函数时,函数内定义的形式参数, 简称形参  # 订正: 在函数定义阶段, 定义的形式参数,称之为形参. 形参相当于变量名
实参: 调用函数时,为函数进行传值的实际参数, 简称实参
"""

18. 形参与实参的关系(注意)

"""
形参相当于变量名, 实参相当于变量值. 实参是对形参的一种赋值(引用).

# 订正:  
绑定关系: 在调用阶段,实参的值会绑定给形参名
使用范围: 函数这种绑定关系的参数只能在函数体内使用
生效时间: 实参于形参的绑定关系会在函数调用时生效,函数调用结束后绑定关系解除 
"""

19. 名称空间的加载顺序是什么?

"""
内置名称空间 > 全局名称空间 > 局部名称空间
"""

20. 名称空间的销毁顺序

"""
局部名称空间 > 全局名称空间 > 内置名称空间 
"""

21. 什么是闭包函数(注意)

"""
\'闭\': 指的是该函数是内嵌函数
\'包\': 指的是外层函数为该函数提供所需的数据.  # 订正: 指的是该函数对外层函数作用域名字的引用(不是全局名称空间)
"""

22. tail -f access.log程序实现(监听名为 access.log 的文件的末尾 是否增加了数据)

import os
import time


def monitor_log(log_path=\'access.log\'):
    if os.path.isfile(log_path):
        with open(log_path, \'rb\') as f:
            f.seek(0, 2)
            while True:
                res = f.readline()
                if res:
                    print(res.decode(\'utf-8\'), end=\'\')
                else:
                    time.sleep(0.3)
# monitor_log()

23. 以下代码的执行结果是什么?为什么?

"""
结果: 报错
为什么: 定义阶段func局部中说我有x,你不要去别的地方找了.调用的时候x却没有定义,这个属于逻辑混乱,语法错误
"""

24. 下述结果为?

# 结果: 1

25. read、readline 和 readlines 的区别?

"""
# 以下读取文件返回值全是字符串类型:
read: 一次性读取 
    在b模式下read(n),n指的是从文件指针当前位置读取的字节个数. 
    在t模式下read(n),n指的是从文件指针当前位置读取的字符个数.
    read(),从文件指针当前位置读取文件到文件末尾
readline:
    以行为单位, 一次读取文件每一行内容.     
readlines: 一次性读取
    读取文件中的所有内容, 返回一个列表, 列表中的每项元素中的内容都是文件的每一行内容.
"""

26. 以下程序的输出结果是?

"""
5
4
3
2
1
"""

二. 综合题

1. 写函数,计算传入字符串中【数字】、【字母】、【空格] 以及 【其他】的个数(3分)

def classified_counting(str1: str):
    """分类计算"""
    dic = {
        \'numbers\': 0,
        \'letters\': 0,
        \'spaces\': 0,
        \'other\': 0,
    }
    for symbol in str1:
        if symbol.isdigit():
            dic[\'numbers\'] += 1
        elif symbol.isalpha():
            dic[\'letters\'] += 1
        elif symbol.isspace():
            dic[\'spaces\'] += 1
        else:
            dic[\'other\'] += 1
    return dic
# print(classified_counting(\'hfawhuij njf 1uih8if1 y89u1893iofjknjk3 ui13fu89-\'))  # {\'numbers\': 14, \'letters\': 30, \'spaces\': 4, \'other\': 1}

2. 写函数,检查获取传入列表或元组对象的所有偶数位索引对应的元素,并将其作为新列表返回给调用者。

def check_list(list_tuple):
    return list_tuple[::2]
# print(check_list([1, 2, 3, 4, 5]))  # [1, 3, 5]

3. 写函数有大小写字母的字符串,要求是如果字符串中大写字母的数量小于等于小写字母的数量,则把字符串全部变小写,反之则将字符串全部变为大写

# 示例
# solve(\'coDe\')——>>\'code\'
# solve(\'CODe\')——>>\'CODE\'

def solve(str1: str):
    upper_count = 0
    lower_count = 0
    for symbol in str1:
        if not symbol.isalpha():
            continue
        if symbol.islower():
            lower_count += 1
        else:
            upper_count += 1
    if upper_count <= lower_count:
        return str1.lower()
    return str1.upper()

4.将字符串"k:1|k1:2|k2:3|k3:4",处理成 Python 字典:{‘k’:1, ‘k1’:2, ... }

s = "k:1|k1:2|k2:3|k3:4"
li = []
for item in s.split(\'|\'):
    li.append(item.split(\':\'))
print(dict(li))

三. ATM

1.方式一

# 思路分析:
"""
1. 分成2个界面: 第一个界面,用户注册 登录的界面. 第二个界面,用户操作执行功能的界面
	第一个界面: 用户不注册后,登录,看不到执行操作功能的界面,就算看到了也没有什么意义.只有登录了用户看到对应属于他的功能的操作.
	第二个界面: 用户需要执行他特定的功能,关键点就是用户登录以后,拿到用户名,作为之后用户操作的基本查找条件.
	总结: 2个功能. 1个功能负责用户登录 注册的认证功能. 另一个功能负责用户登录成功以后执行相应功能操作的功能.
	
2. 用户登录及时找到这个用户, 用户操作更具用户名及时拿到用户对应的数据: 
	把所有用户账户信息加载到内存, 用户登录直接内存中判断. 用户登录以后通过用户名在内存中读取或者修改数据, 不需要每次循环读取打开文件的频繁操作. 
	不过注意的是, 你在内存中修改了数据, 硬盘中的数据没有变化, 如果用户退出不能及时的保存数据. 所以但凡有用户修改数据的地方, 都需要一个特定把内存中的数据, 及时覆盖写回硬盘的操作, 保证了硬盘与内存数据都是最新的数据
	总结: 2个功能. 1个功能负责在程序启动的时候就把所有用户信息读到内存. 另1个功能负责当内存中用户数据修改以后覆盖写回原文件.
	
# 注意: 文件内容str. 内存用户余额 用户错误次数都需要进行数学运算格式int.
3. 文件保存用户的账户信息的格式: 
	用户名:密码:用户错误次数:用户余额
	
4. 内存中用户的账户信息的格式:
	字典 = {用户名: [密码, 用户错误次数, 用户余额]}
	
缺点: 没有使用上装饰器
"""
# -*- encoding: utf-8 -*-
"""
需求: 编写ATM程序实现下述功能,数据来源于文件db.txt
    0、注册功能:用户输入账号名、密码、金额,按照固定的格式存入文件db.txt
    1、登录功能:用户名不存在,要求必须先注册,用户名存在&输错三次锁定,登录成功后记录下登录状态(提示:可以使用全局变量来记录)
下述操作,要求登录后才能操作:
    1、充值功能:用户输入充值钱数,db.txt中该账号钱数完成修改
    2、转账功能:用户A向用户B转账1000元,db.txt中完成用户A账号减钱,用户B账号加钱
    3、提现功能:用户输入提现金额,db.txt中该账号钱数减少
    4、查询余额功能:输入账号查询余额
"""
import os

DB_path = r\'db.txt\'
login_state = set()
accounts_dic = {}

if os.path.isfile(DB_path):
    with open(DB_path, \'r\', encoding=\'utf-8\') as f:
        for line in f:
            res = line.strip()
            if not res:
                continue
            username, password, wrong_number, balance = res.split(":")
            accounts_dic[username] = [password, int(wrong_number), int(balance)]


def update_accounts():
    with open(DB_path, \'w\', encoding=\'utf-8\') as f:
        for username in accounts_dic:
            password, wrong_number, balance = accounts_dic.get(username)
            f.write(f\'{username}:{password}:{str(wrong_number)}:{str(balance)}\n\')


def login():
    print("登录".center(50, \'-\'))
    if not os.path.isfile(DB_path):
        print(\'哦吼!你是第一个用户,你先注册去吧!\')
        return

    name = input("用户名>>:").strip()
    if name in login_state:
        print(f"欢迎[{name}]再次登录!")
        return name

    if name in accounts_dic:
        user_info = accounts_dic.get(name)
        if user_info[1] == 3:
            print("这个用户之前输入了三次密码.已经被锁定")
            return

        pwd = input("用户密码>>:").strip()
        if pwd == user_info[0]:
            print("恭喜登录成功!")
            login_state.add(name)
            accounts_dic.get(name)[1] = 0
            update_accounts()
            return name
        else:
            print("密码输入错误")
            accounts_dic.get(name)[1] += 1
            update_accounts()
    else:
        print(\'用户名不存在\')


def register():
    print("注册".center(50, \'-\'))
    name = input("用户名>>:").strip()
    if not name:
        print("用户名不输入不能为空.")
        return
    if name in accounts_dic:
        print(\'该用户名已经被注册,请重新输入\')
        return

    pwd = input("用户密码>>:").strip()
    confirm_pwd = input("确认用户密码>>:").strip()
    if pwd == confirm_pwd:
        if not pwd:
            print("用户密码不能为空")
            return

        accounts_dic[name] = [pwd, 0, 0]
        with open(DB_path, \'a\', encoding=\'utf-8\') as f:
            f.write(f\'{name}:{pwd}:0:0\n\')
        print("恭喜你注册成功".center(50, \'-\'))
    else:
        print("用户密码2次输入不一致")


def check_balance(username):
    print("查询余额".center(50, \'-\'))
    print(f"您当前余额[{accounts_dic[username][2]}]元")


def withdraw_deposit(username):
    print("提现".center(50, \'-\'))
    get_money = input("请拿钱>>:").strip()
    if not get_money.isdigit():
        print("请输入数字")
        return
    get_money = int(get_money)
    balance = accounts_dic[username][2]
    if get_money <= balance:
        accounts_dic[username][2] -= get_money
        update_accounts()
        print(f"恭喜你提现[{get_money}]元成功".center(50, \'-\'))
    else:
        print("钱不够!快去查询以下余额吧!")


def transfer_accounts(username):
    print("转账".center(50, \'-\'))
    get_user = input(\'你想给谁赚钱啊!小伙计>>:\').strip()
    if get_user not in accounts_dic:
        print("人都没有这人,转格各毛线啊!")
        return

    get_money = input("你要转多少啊!小伙计>>:").strip()
    if not get_money.isdigit():
        print("请输入数字")
        return
    get_money = int(get_money)
    balance = accounts_dic[username][2]
    if get_money <= balance:
        print(f\'恭喜你给[{get_user}]用户转账成功!\'.center(50, \'-\'))
        accounts_dic[username][2] -= get_money
        accounts_dic[get_user][2] += get_money
        update_accounts()
    else:
        print("自己的钱都不够,还转给别人,

分类:

技术点:

相关文章:

  • 2021-12-23
  • 2022-01-07
  • 2021-10-13
  • 2021-04-06
  • 2021-07-16
  • 2022-01-06
  • 2021-12-13
  • 2018-07-28
猜你喜欢
  • 2021-12-19
  • 2018-05-16
  • 2018-06-06
  • 2018-05-17
  • 2021-12-24
相关资源
相似解决方案