• python入门第十九天 __name__=='__man__'


     1 #!/usr/bin/env python3
     2 # -*- coding: utf-8 -*-
     3 
     4 ' a test module '
     5 
     6 __author__ = 'Michael Liao'
     7 
     8 import sys
     9 
    10 def test():
    11     args = sys.argv
    12     if len(args)==1:
    13         print('Hello, world!')
    14     elif len(args)==2:
    15         print('Hello, %s!' % args[1])
    16     else:
    17         print('Too many arguments!')
    18 
    19 if __name__=='__main__':
    20     test()

    第1行和第2行是标准注释,第1行注释可以让这个hello.py文件直接在Unix/Linux/Mac上运行,第2行注释表示.py文件本身使用标准UTF-8编码;

    第4行是一个字符串,表示模块的文档注释,任何模块代码的第一个字符串都被视为模块的文档注释;

    第6行使用__author__变量把作者写进去,这样当你公开源代码后别人就可以瞻仰你的大名;

    以上就是Python模块的标准文件模板,当然也可以全部删掉不写,但是,按标准办事肯定没错。

    后面开始就是真正的代码部分。

    你可能注意到了,使用sys模块的第一步,就是导入该模块:

    import sys

    导入sys模块后,我们就有了变量sys指向该模块,利用sys这个变量,就可以访问sys模块的所有功能。

    sys模块有一个argv变量,用list存储了命令行的所有参数。argv至少有一个元素,因为第一个参数永远是该.py文件的名称,例如:

    运行python3 hello.py获得的sys.argv就是['hello.py']

    运行python3 hello.py Michael获得的sys.argv就是['hello.py', 'Michael]

    最后,注意到这两行代码:

    if __name__=='__main__':
        test()

    当我们在命令行运行hello模块文件时,Python解释器把一个特殊变量__name__置为__main__,而如果在其他地方导入该hello模块时,if判断将失败,因此,这种if测试可以让一个模块通过命令行运行时执行一些额外的代码,最常见的就是运行测试。

    我们可以用命令行运行hello.py看看效果:

    $ python3 hello.py
    Hello, world!
    $ python hello.py Michael
    Hello, Michael!

    如果启动Python交互环境,再导入hello模块:

    $ python3
    Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 23 2015, 02:52:03) 
    [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import hello
    >>>

    导入时,没有打印Hello, word!,因为没有执行test()函数。

    调用hello.test()时,才能打印出Hello, word!

    >>> hello.test()
    Hello, world!




     新建一个文件 bin_demo.py 内容如下:

    1 def hello():
    2     print('ok')
    3 
    4 
    5 
    6 print(__name__)
    7 # if __name__=='__main__':
    8 #     hello()

    如果本地运行的结果 __name__ 输入的结果是:

    "D:Program Files (x86)python36python.exe" F:/python从入门到放弃/7.12/bin_demo.py
    __main__
    
    Process finished with exit code 0

    新建一个调用文件 bin_demo.py 内容如下:

    import bin_demo

    当通过import调用输入 print(__name__) ,输出的结果是当前调用文件的文件名。

    "D:Program Files (x86)python36python.exe" F:/python从入门到放弃/7.12/foo_demo.py
    bin_demo
    
    Process finished with exit code 0

    利用以上这个特殊函数:

    当我们在命令行运行hello模块文件时,Python解释器把一个特殊变量__name__置为__main__,而如果在其他地方导入该模块时,if判断将失败,因此,这种if测试可以让一个模块通过命令行运行时执行一些额外的代码,最常见的就是运行测试。

    目录结构:





    关于 sys.argv  复习一下,sys 模块:

    sys.argv: 实现从程序外部向程序传递参数。

    sys.argv

    功能:在外部向程序内部传递参数
    示例:sys.py

    #!/usr/bin/env python
    
    import sys
    print( sys.argv[0])
    print(sys.argv[1])

    运行:

    给计算器代码,添加 if __name__=='__main__': 

      1 # -*- coding:utf-8 -*-
      2 import re
      3 
      4 ###############################################清洗,格式化字符串#########################################################################
      5 def qingxi(string):##对原始公式进行清洗、
      6     flag=True
      7     string=string.replace(' ','')#去掉所有空格
      8     string = string.replace('+-', '-')
      9     string = string.replace('--', '+')
     10     string = string.replace('++', '+')
     11     string = string.replace('-+', '-')
     12     string = string.replace('*+', '*')#假设,只有加减乘除运算。输入时可能出现,但是运算中不可能遇到这种情况
     13     string = string.replace('/+', '/') #假设,只有加减乘除运算。输入时可能出现,但是运算中不可能遇到这种情况
     14     # string=re.sub('(d+.?d*)(*-)','',string) #防止出现 类似 2*-3==(-1)*2*3
     15     s_str=re.search('(d+.?d**)(-)', string)
     16     if s_str :
     17         s_str=s_str.group(1)#拿到-前面的数字 2*
     18         string = re.sub('d+.?d**-', '-'+s_str, string)  # 防止出现 类似 2*-3==-2*3
     19     s_str_sub = re.search('(d+.?d*/)(-)', string)
     20     if s_str_sub:
     21         s_str = s_str_sub.group(1)  # 拿到-前面的数字 2*
     22         string = re.sub('d+.?d*/-', '-' + s_str, string)  # 防止出现 类似 2/-3==-2/3
     23 
     24     # 遇到+- 或是-+ 统统换成- 运算符
     25     str_qingxi=re.findall('[()]',string)
     26     if re.findall('[a-z]+',string.lower()):
     27         print('存在非法字符',re.findall('[a-z]+',string.lower()))
     28         flag=False
     29     elif str_qingxi.count('(')==str_qingxi.count(')'):#左括号和右括号相等
     30         for i in range(1,int(len(str_qingxi))):#判断左侧的左括号,要一直大于等于左侧的右括号
     31             if str_qingxi[0:i].count('(') >= str_qingxi[0:i].count(')'):
     32                 continue
     33             else:
     34                 print('公式中括号出现错误,请检查第 %d 处括号问题'%i)
     35                 flag=False
     36     else:
     37         print('公式中括号出现错误,存在括号没有闭合。')
     38     if flag:
     39         return string
     40 ###############################################乘除计算#########################################################################
     41 def chengchu(string):
     42 
     43 
     44     if '*' in string or '/' in string:#先计算乘除
     45         s_string = re.search('(d+.?d*)([*/])(d+.?d*)', string)
     46         s_s_string=s_string.group()#
     47     # s_string = re.search('(d+.?d*)([*/])(d+.?d*)', string)
     48     # s_s_string = s_string.group()
     49     # if s_string:
     50 
     51         if s_string.group(2)=='*':
     52             sss=str(float(s_string.group(1))*float(s_string.group(3)))
     53             # print(sss)
     54             new_string = string.replace(s_s_string, sss)
     55             return chengchu(new_string)
     56         elif s_string.group(2)=='/':
     57             sss = str(float(s_string.group(1)) / float(s_string.group(3)))
     58             # print(sss)
     59             new_string = string.replace(s_s_string, sss)
     60             return chengchu(new_string)
     61     else:
     62         # print('没有需要运算的乘除法。')
     63         return string
     64 
     65 ###############################################加减计算#########################################################################
     66 def jiajian(string):
     67     s_string = re.search('(d+.?d*)([+-])(d+.?d*)', string)
     68     if s_string:#条件成立,表示匹配到加法,或是加法公式。如果匹配'-5',则条件不成立,没有返回值
     69         s_s_string=s_string.group()
     70         if s_string.group(2) == '+':
     71             sss=str(float(s_string.group(1))+float(s_string.group(3)))
     72             new_string=string.replace(s_s_string,sss)
     73             return jiajian(new_string)
     74         elif s_string.group(2)=='-':
     75             sss =str(float(s_string.group(1)) - float(s_string.group(3)))
     76             new_string=string.replace(s_s_string,sss)
     77             return jiajian(new_string)
     78     else:
     79         # print('没有需要运算的加减法。')
     80         return string
     81 ###############################################组合计算#########################################################################
     82 def jisuanqi(string):#计算器函数
     83 
     84     while re.search('(',string):#有括号
     85         string = qingxi(string)#每对最里层的括号运算一次,清洗一下,防止出现'--5',‘+-8’ 等情况
     86         strs=re.search('([^()]+)',string).group()#检测最里层的括号
     87         # strs_s_s=strs.group()
     88         strs_s=chengchu(strs)#
     89         strs_s=qingxi(strs_s)
     90         strs_s=jiajian(strs_s).strip('()')#
     91         string=string.replace(strs,strs_s)
     92 
     93     else:#无括号
     94         string = qingxi(string)#每对最里层的括号运算一次,清洗一下,防止出现'--5',‘+-8’ 等情况
     95         strs = chengchu(string)
     96         strs=qingxi(strs)
     97         strs = jiajian(strs)
     98         return  strs#
     99 
    100 if __name__=='__main__':
    101 
    102     # sour='1 + 2 * ((60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 ))   +- (-4*3)/ (16-3*2))'
    103     sour=input('请完整输入需要计算的表达式')
    104     s1=jisuanqi(sour)
    105     print(s1)
    计算器
  • 相关阅读:
    十.总结drf视图
    一.9.多云管理同步服务器
    一.vue 初识
    一.8.django权限管理/drf权限管理
    一.7.服务器之分页和搜索应用
    一.6.序列化应用之服务器同步功能
    一.5.序列化应用之服务器制造厂与型号app功能
    【前端背景UI】鼠标磁性动态蜘蛛网背景源码
    【vue】导入式,使用vue与element UI, 单人开发项目,告别脚手架
    【python后台admin】所有属性显示设置
  • 原文地址:https://www.cnblogs.com/Mengchangxin/p/9298445.html
Copyright © 2020-2023  润新知