alex股票查询小程序练习

1.需求:

1.程序启动后,给用户提供接口,允许用户重复查询股票行情(利用循环)
2.允许用户通过模糊查新股票名。如输入“啤酒”就把带啤酒的信息打印出来。
3.允许按股票价格,换手率,涨跌幅这几列筛选信息,如输入“价格>50”,则把价格大于50的股票打印出来,不用判断等于。

2.股票数据stock_data.txt(部分):

股票代码,股票名称,当前价,涨跌额,涨跌幅,年初至今,成交量,成交额,换手率,市盈率(TTM),股息率,市值
SH601778,N晶科,6.29,+1.92,+43.94%,+43.94%,259.66万,1625.52万,0.44%,亏损,-,173.95亿
SH688566,吉贝尔,52.66,+6.96,+15.23%,+122.29%,1626.58万,8.09亿,42.29%,89.34,-,98.44亿
SH688268,华特气体,88.80,+11.72,+15.20%,+102.51%,622.60万,5.13亿,22.87%,150.47,-,106.56亿
SH600734,实达集团,2.60,+0.24,+10.17%,-61.71%,1340.27万,3391.14万,2.58%,亏损,0.00%,16.18亿
SH900957,凌云B股,0.36,+0.033,+10.09%,-35.25%,119.15万,42.10万,0.65%,44.65,0.00%,1.26亿

2020-09-15

结尾更新了课上老师讲的优化代码


3.用到一个正则化查找字符串中的数字

既然是提取数字,那么数字的形式一般是:整数,小数,整数加小数;
所以一般是形如:———.————;
根据上述正则表达式的含义,可写出如下的表达式:”\d+.?\d*”;
·\d+ 匹配1次或者多次数字,注意这里不要写成*,因为即便是小数,小数点之前也得有一个数字;
·\.? 这个是匹配小数点的,可能有,也可能没有;
·\d* 这个是匹配小数点之后的数字的,所以是0个或者多个。
re.findall(r"\d+.?\d*")最后得到的是一个list。

4.代码部分(还待修改)

# 第一次尝试
import re


def LoopSerchName(dict, cls, index):
    count = 0
    for k, v in dict.items():  # 循环股票字典
        if cls in v[index + 1]:
            print(stoct_dict[k])
            count += 1
    print(f"找到{count}条")


def LoopSerchUpper(dict, index, thread):
    count = 0
    for k, v in dict.items():  # 循环股票字典
        if len(re.findall(r"\d+\.?\d*", v[index])) == 0:  # 如果发现没有数字指标,就认为是负值
            value = float(-99)
        else:
            value = float(re.findall(r"\d+\.?\d*", v[index])[0])  # 知识点1
        if value > thread:
            print(stoct_dict[k])
            count += 1
    print(f"找到{count}条")


def LoopSerchLower(dict, index, thread):
    count = 0
    for k, v in dict.items():  # 循环股票字典
        if len(re.findall(r"\d+\.?\d*", v[index])) == 0:  # 如果发现没有数字指标,就认为是负值
            value = float(-99)
        else:
            value = float(re.findall(r"\d+\.?\d*", v[index])[0])  # 知识点1
        if value < thread:
            print(stoct_dict[k])
            count += 1
    print(f"找到{count}条")


if __name__ == '__main__':
    stoct_list = []
    stoct_dict = {}
    f = open("stock_data", 'r', encoding='utf-8')
    stoct_list = f.readline()
    stoct_list = stoct_list.strip().split(',')  #
    # print(stoct_list)
    num = 0
    for line in f:
        line = line.strip().split(',')
        stoct_dict[num] = line  # 把字典的键值设置为序号
        num += 1
    # print(stoct_dict)

    while True:
        serch_info = input("股票查询接口>>:")

        serch_name = serch_info.split('<')[0].split('>')[0]  # 获取输入信息最前面的名字
        serch_index = 0
        for i in range(len(stoct_list)):
            if serch_name  in stoct_list[i]:
                serch_index = i  # 获取查询的信息在哪一列
                break

        if ">" in serch_info:
            thread = serch_info.split('>')[-1]  # 两次过滤获取阈值,此时是str格式
            thread = float(re.findall(r"\d+\.?\d*", thread)[0])  # 正则化查找数字部分,转为float数字格式
            LoopSerchUpper(stoct_dict, serch_index, thread)
            print()
        elif "<" in serch_info:
            thread = serch_info.split('>')[-1]  # 两次过滤获取阈值,此时是str格式
            thread = float(re.findall(r"\d+\.?\d*", thread)[0])  # 正则化查找数字部分,转为float数字格式
            LoopSerchLower(stoct_dict, serch_index, thread)
            print()
        else:
            LoopSerchName(stoct_dict, serch_name, serch_index)


"""
遗留问题:
1.成交额单位有万,亿,在计算thread的时候还需要具体细分.
2.市盈率和股息率中有些是“亏损”“-”,没有数值,需要具体区分是否有数字,这里我判断如果亏损的时候就是负值.
3...

"""

5.推荐一首姐姐的《あの微笑みを忘れないで》,忘记发生在自己身上的挫折,微笑着迎接新的一天吧,我可以的!


优化后的代码

import re
'''
官方思路
1.把股票存到内存
2.实现模糊查询
3.处理复杂查询
    3.1进行语法的合法性验证
        验证名称合法性,验证符号合法性,验证数值合法性
'''
f = open("stock_data",encoding="UTF-8")
headers = f.readline().strip().split(',')
stock_dict = {}

for line in f:
    line = line.strip().split(',')
    stock_dict[line[0]] = line

while True:
    cmd = input("股票查询接口>>").strip()
    if not cmd:continue
    '''
    # 2.模糊查询
    '''
    print(headers)
    for sid,s_data in stock_dict.items():
        s_name = s_data[1]
        if cmd in s_name:
            print(s_data)
    '''
    # 3.复杂公式处理, a = 当前价>50
            #验证列名合法,符号合法性,数值合法性
            1.验证公式基本合法
            2.验证列名合法
            3.验证符号合法
            4.验证右边值合法
    '''
    valid_cols = ["当前价","涨跌幅","换手率"]
    syntax_parser = re.split("[<>]",cmd)
    if len(syntax_parser) == 2:  # 3.1公式基本合法
        filter_column, filter_val = syntax_parser
        if filter_column in valid_cols:  # 3.2
            try:
                filter_val = float(filter_val) # 3.4有可能报错
                filter_col_index = headers.index(filter_column)  # 4.取到列名下标
                for sid,s_data in stock_dict.items():
                    rel_filter_col_val = float(s_data[filter_col_index].strip('%'))  # 取梅列的实际值
                    if ">" in cmd:
                        if rel_filter_col_val > filter_val: # 匹配上了
                            print(s_data)
                    if "<" in cmd:
                        if rel_filter_col_val < filter_val: # 匹配上了
                            print(s_data)
            except ValueError as e:
                print("出错了:",e)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值