Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2618186
  • 博文数量: 315
  • 博客积分: 3901
  • 博客等级: 少校
  • 技术积分: 3640
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-08 15:32
个人简介

知乎:https://www.zhihu.com/people/monkey.d.luffy Android高级开发交流群2: 752871516

文章分类

全部博文(315)

文章存档

2019年(2)

2018年(1)

2016年(7)

2015年(32)

2014年(39)

2013年(109)

2012年(81)

2011年(44)

分类: Python/Ruby

2012-02-22 21:40:15

 14/1 if __name__ == ‘__main__’ 语句

       以前只是跟着写,说是只有这个模块作为文件运行的时候才会执行这个if 包裹的内容,不然只是作为模块使用。(下面解释貌似也是差不多,所以我们在作为模块导入到其他文件的时候,如果某些函数根本不会用到,那么我们可以将其缩进然后放到该if语句的下面,隐藏起来“,避免多次被run

跟着应该是一个 if 语句,它通过检测__name__来确定是否要调用脚本,比如,if__name__ == '__main__'”。如果相等的话,你的脚本会执行 main 内代码;否则只是打算导入这个脚本,那么可以在这个模块内对代码进行测试。

 

14/2 执行东东

Command:

>>> eval_code = compile('1+2', '', 'eval')

>>> eval(eval_code)

3

>>> single_code = compile('print "hello world!"', '', 'single')

>>> exec single_code

hello world!

 

>>> import os

>>> f = os.popen('uname -a')

>>> data = f.readline()

>>> f.close()

>>> print data

Linux ubuntu 2.6.32-30-generic #59-Ubuntu SMP Tue Mar 1 21:30:21 UTC 2011 i686 GNU/Linux

 

>>> f = Popen('who', stdout=PIPE).stdout

>>> data = [ eachLine.strip() for eachLine in f ]

>>> f.close()

>>> for eachLine in data:

...  print eachLine

...

huanglei   tty7         2012-01-25 01:48 (:0)

huanglei   pts/0        2012-01-25 02:16 (:0.0)

 

File:

>>> f = open('xcount.py')

>>> exec f

x is currently: 0

increamenting x to: 1

increamenting x to: 2

increamenting x to: 3

increamenting x to: 4

increamenting x to: 5

上面课本的实例都练习了,还是能看懂的;下面对稍微复杂的进行下分析,看能不能学习点东西。

 

14.3.6 使用 Python 在运行时生成和执行 Python 代码

-------在运行时生成和执行 Python 代码

第一个例子是 loopmake.py 脚本,一个简单的、迅速生成和执行循环的计算机辅助软件工程(CASE)。它提示用户给出各种参数(比如,循环类型(while for), 迭代的数据类型[数字或序列]),生成代码字串,并执行它。

Example 14.1 动态生成和执行 Python 代码

(loopmake.py)

代码算是调完了,在凑那个可执行代码字典的时候,需要注意缩进问题,代码第一行千万要顶格写,不然编译通过不,作为结尾的”””这个三个引号需要顶格,不然报错,我都试了很多缩进,要注意了。(对于这种生成代码的方式,确实很少见,学习自动生成Makefile的时候,知道有专门的工具可以生成,你只需要修改配置文件啊,创建配置文件啊,但是python这种没见过:就是通过占位符的操作,替换自己需要的变量符号,只需要把你的所有用到的变量都写入一个元组里面就好了,还是可以理解的!!)

分析下这个代码吧:

#!/usr/bin/env python

# -*- coding: UTF-8 -*-

 

dashes = '\n' + '-' * 50 #50'-'(开头换行)

 

#构造一个存储代码的字典(不同的键对应不同的代码),里面变量均用占位符,注意缩进

exec_dict = {

    'f': """ #for loop

for %s in %s:

    print %s

""",

 

    's': """ #sequence while loop

%s = 0

%s = %s

while %s < len(%s):

    print %s[%s]

    %s = %s + 1

""",

 

    'n': """ #count while loop

%s = %d

while %s < %d

    print %s

    %s = %s + %d

"""

}

 

def main():

    #以下是输入用户选择的循环方式(for or while),以及操作的数据类型(数字或者序列)

    ltype = raw_input('Loop type? (For/While) ')

    dtype = raw_input('Data type? (Number/Seq) ')

    if dtype == 'n':    #表示选择数字方式

        start = input('Starting value? ')

        stop = input('Ending value (non-inclusive)? ')

        step = input('Stepping value? ')

        seq = str(range(start, stop, step)) #产生数字序列

    else:

        seq = raw_input('Enter sequence: ') #表示选择序列方式(需要输入序列)

   

    var = raw_input('Iterative varible name? ') #输入用于循环的变量名称

   

    if ltype == 'f': #如果是for循环,则按照如下方式产生代码

        #这种方式没见过,给字典赋值,该复习字典了

        exec_str = exec_dict['f'] % (var, seq, var) #变量依次替换占位符,直到用完

    elif ltype == 'w': #如果是while循环,则需要区分是哪种数据类型:如果是序列,我们需要提供一个序列的名称(因为while循环用到了len()来求序列长度,所以名字就必须了),否则就不用了

        if dtype == 's':

            svar = raw_input('Enter sequence name? ')

            exec_str = exec_dict['s'] % (var, svar, seq,\

                        var, svar, svar, var, var, var)

        elif dtype == 'n':

            exec_str = exec_dict['n'] % (var, start, var,\

                        stop, var, var, var, step)

   

    #下面就是相应的执行和测试

    print dashes

    print 'Your custom-generated code: ' + dashes

    print exec_str + dashes

    print 'Test execution of the code:' + dashes

    exec exec_str

    print dashes

 

if __name__ == "__main__":

    main()

 

执行效果测试了,准确!

huanglei@ubuntu:~/python/exec$ python loopmake.py

Loop type? (For/While) f

Data type? (Number/Seq) n

Starting value? 0

Ending value (non-inclusive)? 3

Stepping value? 1

Iterative varible name? countger

 

--------------------------------------------------

Your custom-generated code:

--------------------------------------------------

 #for loop

for countger in [0, 1, 2]:

    print countger

 

--------------------------------------------------

Test execution of the code:

--------------------------------------------------

0

1

2

 

--------------------------------------------------

 

-------有条件地执行代码

第二个例子着重描写了在第 11 "函数"引入的函数属性,它是从 Python 增强提议 232 PEP 232)(中的例子得到的灵感。假设你是一位负责质量控制的软件开发者,你鼓励你的工程师将回归测试或回归指令代码放到主代码中,但又不想让测试代码混合到产品代码中。你可以让工程师创建字符串形式的测试代码。当你的测试框架执行的时候,它会检测函数是否定义了测试体,如果是的话,(求值并)执行它。如果不是,便跳过,像通常一样执行。

Example 14.2

Function Attributes (funcAttrs.py)

调用 sys.exit()使 python 解释器退出。exit()的任何整数参数作为退出状态会返回给调用者,该值默认为 0

#!/usr/bin/env python

# -*- coding: UTF-8 -*-

 

def foo():

    return True

 

def bar():

    'bar() does not do much' #文档字符串的一种形式

    return True

 

foo.__doc__ = 'foo() does not do much' #文档字符串的另一种设置方式

foo.tester = '''

if foo():

    print 'PASSED'

else:

    print 'FAILED'

'''

for eachAttr in dir():

    obj = eval(eachAttr)

    if isinstance(obj, type(foo)): #过滤所有的非函数对象, 这里我们借用type来获取foo的属性(其实就是函数),然后拿从dir()中读取的属性来对比看是否一致,到达过滤要求,当然foo可以替换为bar或者任意函数

            if hasattr(obj, '__doc__'):

                print '\nFunction "%s"  has a doc string:\n\t \

                %s' % (eachAttr, obj.__doc__)

                if hasattr(obj, 'tester'): #如果存在tester(单元测试..)

                    print 'Function "%s" has a tester...excuting' % \

                    eachAttr

                    exec obj.tester

                else:

                    print 'Function "%s" has no tester... skipping'% \

                    eachAttr

    else:

        print '"%s" is not a function' % eachAttr

 

huanglei@ubuntu:~/python/exec$ python funcAttrs.py

"__builtins__" is not a function

"__doc__" is not a function

"__file__" is not a function

"__name__" is not a function

"__package__" is not a function

 

Function "bar"  has a doc string:

                           bar() does not do much

Function "bar" has no tester... skipping

 

Function "foo"  has a doc string:

                           foo() does not do much

Function "foo" has a tester...excuting

PASSED

 

感言:其实发现自己学习python也学的不怎地,学的好的话,就该知道如何运用,深刻理解工作机制,这才能利用它来替你干活啊…….自己的耐心太差

          我在创建python文件的时候用到了自己以前琢磨的一个document_hens项目的doc –py test.py的命令,这是以前无聊用c写的文档管理的,觉得挺实用;主要就是以前在查看自己硬盘的电影的时候,发现好多电影都整一块,突然想每个电影给整个文件夹,这样看起来舒服多了,就想到去搞个这个小项目,后来可以生成项目文档的诸多文件(像项目规划,详细设计啊),可以生成python文件模块,管理cc++文件,后来还想着去添加一个自动生成Makefile的功能(滞后了),可以增加其他文档管理,视频管理啊功能,其实这个就是字符串拆分啊,然后调用exec,system等来实现的,只需要自己创建一类文件的标准模版,然后每次生成需要的文件就调用相应文件模版来生成文件,可以省去你编写很多文件注释符,环境字符串,文件信息啊等等信息以后再完善那个项目,应该加入python去管理,估计更高效和节省代码….又扯蛋了哈哈哈哈

阅读(2189) | 评论(0) | 转发(0) |
0

上一篇:python类

下一篇:python 网络

给主人留下些什么吧!~~