Python学习之路(十七):基础知识之模块练习

1.写一个函数,接受一个参数,如果是文件,就执行这个文件,如果是文件夹,执行里面的py文件

 1 import os
 2 def func(path):
 3     if os.path.isfile(path) and path.endswith('.py'):
 4         os.system('python %s' % path)
 5     elif os.path.isdir(path):
 6         for name in os.listdir(path):
 7             abs_path = os.path.join(path, name)
 8             if abs_path.endswith('.py'):
 9                 os.system('python %s' % abs_path)
10 
11 
12 func(r"D:\untitled2\day15\01序列化模块.py")

2.写一个copy函数,接受两个参数,第一个参数是源文件的位置,第二个参数是目标位置,将源文件copy到目标位置

 import os
1
def copy(path1, path2): 2 file_name = os.path.basename(path1) 3 if os.path.isfile(path1) and os.path.isdir(path2): 4 path2 = os.path.join(path2, file_name) 5 if os.path.exists(path2): 6 print('已有同名文件!') 7 with open(path1, 'rb') as f1, open(os.path.join(path2, file_name), 'wb') as f2: 8 content = f.read() 9 f2.write(content) 10 copy(path1, path2)

3.获取某个文件所在目录的上一级目录

import os
1
path = os.path.dirname(r'D:\untitled2\day15\01序列化模块.pyr') 2 print(path) 3 base_name = os.path.dirname(path) 4 print(base_name)

4.创建python目录

 import os
1
os.makedirs('glance/api') 2 os.makedirs('glance/cmd') 3 os.makedirs('glance/db') 4 open('glance/api/__init__.py', 'w').close() 5 open('glance/api/policy.py', 'w').close() 6 open('glance/api/version.py', 'w').close() 7 open('glance/cmd/manage.py', 'w').close() 8 open('glance/cmd/__init__.py', 'w').close() 9 open('glance/db/_init__.py', 'w').close() 10 open('glance/db/models.py', 'w').close()

5.创建一个登陆程序,用户的注册信息以字典形式保存到文件中,登陆的时候从文件中检查信息是否匹配

 1 import pickle
 2 def register():
 3     username = input('请输入用户名:')
 4     password = input('请输入密码:')
 5     dic = {'user': username, 'pwd': password}
 6     with open('user_info', 'ab') as f:
 7         pickle.dump(dic, f)
 8     print('注册成功!')
 9 
10 def login():
11     flag = True
12     user_login = input('请输入用户名:')
13     password_login = input('请输入密码:')
14     with open('user_info', 'rb') as f:
15         while flag:
16             try:
17                 dic = pickle.load(f)
18                 if dic['user'] == user_login and dic['pwd'] == password_login:
19                     print('登陆成功!')
20                     flag = False
21                     break
22             except EOFError:
23                 print('登陆失败')
24                 break
25 
26 register()
27 login()

 6.计算数学算式1 - 2 * ( (60 - 30 +(-40/5) *(9-2*5/3 + 7 / 3*99/4*2998 +10 *568/14)) - (-4 * 3) / (16 - 3*2))

 1 import re
 2 # 计算乘除法
 3 def atom_cal(exp):
 4     if '*' in exp:
 5         a, b = exp.split('*')
 6         return str(float(a) * float(b))
 7     elif '/' in exp:
 8         a, b = exp.split('/')
 9         return str(float(a) / float(b))
10 # 写函数,将括号内的符号进行规范化的处理
11 def format_exp(exp):
12     exp = exp.replace('--', '+')
13     exp = exp.replace('-+', '-')
14     exp = exp.replace('++', '+')
15     exp = exp.replace('+-', '-')
16     return exp
17 # 将数学算式中的乘除法先匹配出来
18 def mul_div(exp):
19     while True:
20         ret = re.search(r'\d+(\.\d+)?[*/]-?\d+(\.\d+)?', exp)
21         if ret:
22             #print(ret.group())
23             atom_exp = ret.group()
24             res = atom_cal(atom_exp)  # 调用atom_cal函数将乘除法的结果计算出来
25             #print(atom_exp, res)
26             exp = exp.replace(atom_exp, res)  # 将原来的表达式中1*-22用-22替换,替换时由于res是float类型,要转换为字符串类型
27         else:
28             return exp
29 # 将乘除法计算后的算式中的元素匹配出来
30 def add_sub(exp):
31     ret = re.findall(r'[+-]?\d+(?:\.\d+)?', exp)
32     print(ret)  # 结果:['2', '+22.0', '-3', '+0.8']
33     exp_sum = 0
34     for i in ret:
35         exp_sum += float(i)
36     return exp_sum
37 
38 #乘法或者除法先匹配
39 def cal(exp):  # 2-1*-22-3-4/-5
40     # while True:
41     #     ret = re.search(r'\d+(\.\d+)?[*/]-?\d+(\.\d+)?', exp)
42     #     if ret:
43     #         #print(ret.group())
44     #         atom_exp = ret.group()
45     #         res = atom_cal(atom_exp)  # 调用atom_cal函数将乘除法的结果计算出来
46     #         #print(atom_exp, res)
47     #         exp = exp.replace(atom_exp, res)  # 将原来的表达式中1*-22用-22替换,替换时由于res是float类型,要转换为字符串类型
48     #     else:
49     #         break                          # 在atom_cal函数返回的结果中直接进行转换
50     # print(exp)  # 结果:2--22.0-3--0.8,其中有符号需要处理,再建立format函数进行处理
51     exp = mul_div(exp)
52     exp = format_exp(exp)
53     # 结果:2+22.0-3+0.8
54     # ret = re.findall(r'[+-]?\d+(?:\.\d+)?', exp)
55     # print(ret)  # 结果:['2', '+22.0', '-3', '+0.8']
56     # exp_sum = 0
57     # for i in ret:
58     #     exp_sum += float(i)
59     # return exp_sum
60     exp_sum = add_sub(exp)
61     return exp_sum
62 
63 # ret = cal('2-1*-22-3-4/-5')
64 # print(ret)  # 21.8
65 
66 # 去括号1 - 2 * ( (60 - 30 +((-40/5) *(9-2*5/3 + 7 / 3*99/4*2998 +10 *568/14)) - (-4 * 3) / (16 - 3*2))
67 
68 
69 def main(exp):
70     exp = exp.replace(' ', '')
71     while True:
72         ret = re.search(r'\([^()]+\)', exp)
73         if ret:
74             inner_bracket = ret.group()  # (-40/5)
75             res = str(cal(inner_bracket))  # ['-8.0']
76             exp = exp.replace(inner_bracket, res)
77             print(exp)
78             exp = format_exp(exp)
79             print(exp)
80         else:break
81     return cal(exp)
82 s = '1 - 2 * ( (60 - 30 +(-40/5) *(9-2*5/3 + 7 / 3*99/4*2998 +10 *568/14)) - (-4 * 3) / (16 - 3*2))'
83 ret = main(s)
84 print(ret)
85 print(eval(s))

 

posted on 2020-03-02 14:54  Py_studying  阅读(268)  评论(0编辑  收藏  举报

导航