#1.正则表达式计算 origin = "1 - 2 * ( ( 60 - 30 + ( -40.0 / 5 ) * ( 9 - 2 * 5 / 3 + 7 / 3 * 99 / 4 * 2998 + 10 * 568 / 14 )) - ( - 4 * 3 ) / ( 16 - 3 * 2))"

import re
import functools def checkInput(formula):
"""检测输入合法与否,是否包含字母等非法字符"""
return not re.search("[^0-9+\-*/.()\s]",formula) def formatInput(formula):
"""标准化输入表达式,去除多余空格等"""
formula = formula.replace(' ','')
formula = formula.replace('++', '+')
formula = formula.replace('+-', '-')
formula = formula.replace('-+', '-')
formula = formula.replace('--', '+')
return formula def mul_divOperation(s):
"""乘法除法运算"""
# 1-2*-14969036.7968254
s = formatInput(s)
sub_str = re.search('(\d+\.?\d*[*/]-?\d+\.?\d*)', s)
while sub_str:
sub_str = sub_str.group()
if sub_str.count('*'):
l_num, r_num = sub_str.split('*')
s = s.replace(sub_str, str(float(l_num)*float(r_num)))
else:
l_num, r_num = sub_str.split('/')
s = s.replace(sub_str, str(float(l_num) / float(r_num)))
#print(s)
s = formatInput(s)
sub_str = re.search('(\d+\.?\d*[*/]\d+\.?\d*)', s) return s def add_minusOperation(s):
"""加法减法运算
思路:在最前面加上+号,然后正则匹配累加
"""
s = formatInput(s)
s = '+' + s
#print(s)
tmp = re.findall('[+\-]\d+\.?\d*', s)
s = str(functools.reduce(lambda x, y:float(x)+float(y), tmp))
#print(tmp)
return s def compute(formula):
"""无括号表达式解析"""
#ret = formula[1:-1]
ret = formatInput(formula)
ret = mul_divOperation(ret)
ret = add_minusOperation(ret)
return ret def calc(formula):
"""计算程序入口"""
has_parenthesise = formula.count('(')
if checkInput(formula):
formula = formatInput(formula)
while has_parenthesise:
sub_parenthesise = re.search('\([^()]*\)', formula) #匹配最内层括号
if sub_parenthesise:
#print(formula+"...before")
formula = formula.replace(sub_parenthesise.group(), compute(sub_parenthesise.group()[1:-1]))
#print(formula+'...after')
else:
#print('没有括号了...')
has_parenthesise = False ret = compute(formula)
print('结果为:')
return ret else:
print("输入有误!")
-------------------------------------------------------------------------------------------
def add(args): #加减
args = args.replace(' ', '')
args = args.replace('++', '+')
args = args.replace('+-', '-')
args = args.replace('-+', '-')
args = args.replace('--', '+')
tmp = re.findall("([+\-]?\d+\.?\d*)", args)
ret = 0
for i in tmp:
ret = ret + float(i)
return ret def mul(args):
#乘除
while True:
ret = re.split("(\d+\.?\d*[\*/][\+-]?\d+\.?\d*)",args,1)
if len(ret) == 3:
a = ret[0]
b = ret[1]
c = ret[2]
if "*" in b:
num1,num2 = b.split("*")
new_b = float(num1) * float(num2)
args = a + str(new_b) + c
elif "/" in b:
num1, num2 = b.split("/")
new_b = float(num1) / float(num2)
args = a + str(new_b) + c
else:
return add(args)
def calc(args):
while True:
args = args.replace(" ", "")
ret = re.split("\(([^()]+)\)",args,1)
if len(ret) == 3:
a,b,c = ret
r = mul(b) #调用乘除得到计算结果
args = a + str(r) + c
else:
return mul(args) print(calc(origin))
print(eval(origin)) #2.将“我我我、、、我我、、我要、我要要、、、要要要、、要要、、学学学、、、、学学编、、、学编编编、、编编编程、、程程”还原成:我要学编程
f = "我我我、、、我我、、我要、我要要、、、要要要、、要要、、学学学、、、、学学编、、、学编编编、、编编编程、、程程" c = ''
import re
a = re.sub(r'、','',f)
for i in a:
if i not in c:
c += i
print(c) #3.查找IP地址
temp = "192.168.1.200 10.10.10.10 3.3.50.3 127.0.0.1 244.255.255.249 273.167.189.222" # sel = re.compile(r'((25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))')
# 参考:https://www.cnblogs.com/brogong/p/7929298.html
f = re.compile(r"\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b")
ip = f.findall(temp)
print(ip) #4.读写用户的输入,根据用户输入,创建一个相应的目录
improt os,sys
os.mkdir(sys.argv[1]) #5.进度条,显示百分比
import sys,time,datetime
#
for i in range(1,101):
if i == 100:
b = '完成'
else:
b = '进度中'
for a in ['\\','|','/','=']:
sys.stdout.write("\r")
sys.stdout.write(r'%s%s%s %s%% ' % (b,int(i/100*100)*'=',a,int(i/100*100)))
sys.stdout.flush()
time.sleep(0.3) #6.密码加密版,用户登录
import hashlib
def md5(pawd):
hash = hashlib.md5(bytes('fana,*=',encoding='utf-8'))
hash.update(bytes(pawd,encoding='utf-8'))
return hash.hexdigest() def zhuce(user,pawd):
with open('fana.db','a',encoding='UTF-8') as f:
tmp = user + '|' + md5(pawd) + '\n'
f.write(tmp) def denglu(user,pawd):
with open('fan.db','r',encoding='UTF-8') as f:
for line in f:
u,p = line.strip().split('|')
if u == user and p == md5(pawd):
return True
return False i = input('登陆按1,注册按2:')
if i == '2':
user = input('用户名:')
pawd = input('密码:')
zhuce(user,pawd)
print('注册成功')
if i == '1':
user = input('用户名:')
pawd = input('密码:')
re = denglu(user,pawd)
if re:
print('登陆成功')
else:
print('登陆失败')

python--第六天练习题的更多相关文章

  1. python入门练习题1

    常见python入门练习题 1.执行python脚本的两种方法 第一种:给python脚本一个可执行的权限,进入到当前存放python程序的目录,给一个x可执行权限,如:有一个homework.py文 ...

  2. Python/ MySQL练习题(一)

    Python/ MySQL练习题(一) 查询“生物”课程比“物理”课程成绩高的所有学生的学号 SELECT * FROM ( SELECT * FROM course LEFT JOIN score ...

  3. python/MySQL练习题(二)

    python/MySQL练习题(二) 查询各科成绩前三名的记录:(不考虑成绩并列情况) select score.sid,score.course_id,score.num,T.first_num,T ...

  4. Python第六天 类型转换

    Python第六天   类型转换 目录 Pycharm使用技巧(转载) Python第一天  安装  shell  文件 Python第二天  变量  运算符与表达式  input()与raw_inp ...

  5. python字典练习题

    python字典练习题 写代码:有如下字典按照要求实现每一个功能dict = {"k1":"v1","k2":"v2", ...

  6. 孤荷凌寒自学python第六天 列表的嵌套与列表的主要方法

    孤荷凌寒自学python第六天 列表的嵌套与列表的主要方法 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) (同步的语音笔记朗读:https://www.ximalaya.com/keji/1 ...

  7. Python经典练习题1:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?

    Python经典练习题 网上能够搜得到的答案为: for i in range(1,85): if 168 % i == 0: j = 168 / i; if i > j and (i + j) ...

  8. Python模块练习题

    练习题: 1.logging模块有几个日志级别? #INFO,WARNING,DEBUG,CRITICAL,ERROR 2.请配置logging模块,使其在屏幕和文件里同时打印以下格式的日志 2017 ...

  9. Python程序练习题(一)

    Python:程序练习题(一) 1.2 整数序列求和.用户输入一个正整数N,计算从1到N(包含1和N)相加之后的结果. 代码如下: n=input("请输入整数N:") sum=0 ...

  10. 系统学习python第六天学习笔记

    1.补充 1.列表方法补充 reverse,反转. v1 = [1,2,3111,32,13] print(v1) v1.reverse() print(v1) sort,排序 v1 = [11,22 ...

随机推荐

  1. opencv实现人脸识别(一)opencv的相关知识了解

    这回进行了人脸识别的项目,对学习过程进行记录. 首先进行的就是一系列环境的配置,如 python3.7的安装, python的IDE  pycharm的安装,然后进行opencv库的安装,可以通过py ...

  2. windows通过gcc编译代码

    1.将gcc添加到环境变量 2.检查gcc是否安装成功 cmd下输入gcc –v 3.cd进入需要编译源文件的目录 4.dir查看当前目录下是否有需要编译的文件(linux下用ls) 5.编译文件(H ...

  3. prometheus+grafana+Alertmanager邮箱告警

    环境 系统:CentOS 7 软件:alertmanager-0.18.0.linux-amd64.tar.gz 安装 下载二进制包 地址:https://prometheus.io/download ...

  4. 方法引用(method reference)

    目录 方法引用(method reference) 1. 含义 2. 分类 3. 总结 方法引用(method reference) 1. 含义 方法引用实际上是 Lambda 表达式的一种语法糖. ...

  5. [yarn]yarn和npm的对比

    一.简介 NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种: 允许用户从NPM服务器下载别人编写的第三方包到本地使用. 允许用户从NPM服 ...

  6. js中WebSocket

    一.概念 WebSocket的定义 WebSocket是html5提供的一种在单个TCP连接上进行双向通信的协议,解决了客户端和服务端之间的实时通信问题.浏览器和服务器只需完成一次握手,两者之间就可以 ...

  7. Django rest-framework框架-组件之视图

    视图: a. django class Test(View): ... b. rest_framework class Test(APIView): ... c. GenericAPIView 一般不 ...

  8. js的数据类型、函数、流程控制及变量的四种声明方式

    运算符 基本运算符 加 + 减 - 乘 * 除 / 取余 % 自增 ++ eg: 1++ 或 ++1 自减 -- eg: 1-- 或 --1 注:++或--写在前面表示优先级最高,先进行自增或者自减 ...

  9. 【转载】salesforce 零基础开发入门学习(六)简单的数据增删改查页面的构建

    salesforce 零基础开发入门学习(六)简单的数据增删改查页面的构建   VisualForce封装了很多的标签用来进行页面设计,本篇主要讲述简单的页面增删改查.使用的内容和设计到前台页面使用的 ...

  10. c#开启线程池超出索引

    这样写会超出索引,foreach好像不会超出,原因可能是开启线程池需要时间,成功开启之后,一次循环已经结束,这个没有验证. 以下这个做法是不对的,我也是看网上的贴这样写,结果是少执行了一个.推荐大家还 ...