14.执行环境
2015-11-20 17:49
232 查看
1、python可以运行操作系统的命令,这个嘛,确实厉害啊。
2、python的4种可调用分类:函数、方法、类、以及类的实例对象
a、函数:python主要分为3种类型的函数 (python中一样 everything is object,一切都是实例对象,所以函数的类型通过type()函数看到
第一种:内建函数或者叫内置函数(BIFs)builtin_function(你也可以理解成python自己写好的函数),内建函数在_bulitin_模块里哦
下面是内建函数(BIFs)的一些常见属性
__doc__ :代表的是内置函数的api文档吧,算,哈哈
__name__ : 内置函数名字,字符串类型哈
__self__ : 设置为None(保留给built-in 方法)
__module__ :存放内建函数的模块的名字, 必然是__builtin__
你还可以使用dir()函数,传入函数名字,会返回一个函数所拥有的所有属性的List
让我们再用type函数看看dir的类型
第二种:是咱们自己写的函数(称为用户定义的函数 UDF,全称为:User-Defined Function)
定义在模块的最高级里面(就是没有空格字符,没有缩进)
也有默认的属性哦亲(自己查去吧dir(函数名字)):
udf.__doc__
udf.__name__
udf.func_code
udf.func_defaults
udf.func_globals
udf.func_dict
udf.func_doc
udf.func_name
udf.func_closure
让我们看看自己创建的函数,函数类型是个啥(注意别混淆成返回值类型)
第三种:匿名函数,嘿嘿,自己看吧
匿名函数也是自己自定义的函数哦,只是没有名字而已,所以内建的属性都有哦 __name__啦 等等
b、方法:python中的方法有几种?内建方法(英文简称BIMs,也叫内置方法,名称呵呵)、用户自定义的方法,目前就这两种
第一种:内建方法,比如List、元组、字典中定义的方法
这句户有价值:此外,BIM 和BIF 两者也都享有相同属性。不同之处在于BIM 的__self__属性指向一个Python
对象,而BIF 指向None
第二种:咱们自己写在类里的方法,UDM(User-defined method,用户定义的方法)
内建方法与自己写的方法也一样拥有内建属性:__doc__、__name__等等
c、类:用类创建实例对象
书上说:利用类的可调用性创建实例。还强调了类有一个默认的构造函数(里面啥也没做,就写了pass),当然你也可以自定义构造函数 __init__(xx, xx)
关于类的调用,就先说到这里吧……哈哈
d、类的实例对象,重写__call__这个特别方法,具体看下面吧(这里要注意加深理解,一定要明白这个__call__()方法是干嘛用的
牛逼,大写的牛逼,谁曾想,作者还能想到把实例对象,当作一个函数来用,我cao,牛逼
<span style="font-family:SimSun;">class Person(object):
def __init__(self, personName):
self.name = personName
def __call__(self):
return self.name
if __name__ == '__main__':
p = Person("wang yuan wai")
print p()</span>输出结果:
wang yuan wai
当你使用p()时,会调用对应的__call__方法
插曲:callable()、
3、执行
比如我f5运行这个脚本
4、导入模块,即会执行最高级别的代码(即没有缩进的代码)
例子:
首先:新建一个import2.py 文件 就只有这么一行代码
然后:新建一个import1.py文件,代码如下
接着:执行import1.py文件
结果:
总结:导入模块的副作用是会执行所有最高级别的代码
5、将模块作为脚本执行(2.4版本后加入的东东)
例如:在cmd下执行import1模块
D:\temp>python import1.py
6、转载:__name__ == '__main__'的作用
很多新手刚开始学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码,可能很多新手一开始学习的时候都比较疑惑,python 中__name__ = '__main__' 的作用,到底干嘛的?
有句话经典的概括了这段代码的意义:
“Make a script both importable and executable”
意思就是说让你写的脚本模块既可以导入到别的模块中用,另外该模块自己也可执行。
这句话,可能一开始听的还不是很懂。下面举例说明:
先写一个模块:
?
这个函数定义了一个main函数,我们执行一下该py文件发现结果是打印出”we are in __main__“,说明我们的if语句中的内容被执行了,调用了main():
但是如果我们从另我一个模块导入该模块,并调用一次main()函数会是怎样的结果呢?
?
其执行的结果是:we are in module
但是没有显示”we are in __main__“,也就是说模块__name__ = '__main__' 下面的函数没有执行。
这样既可以让“模块”文件运行,也可以被其他模块引入,而且不会执行函数2次。这才是关键。
总结一下:
如果我们是直接执行某个.py文件的时候,该文件中那么”__name__ == '__main__'“是True,但是我们如果从另外一个.py文件通过import导入该文件的时候,这时__name__的值就是我们这个py文件的名字而不是__main__。
这个功能还有一个用处:调试代码的时候,在”if __name__ == '__main__'“中加入一些我们的调试代码,我们可以让外部模块调用的时候不执行我们的调试代码,但是如果我们想排查问题的时候,直接执行该模块文件,调试代码能够正常运行!
7、将模块作为脚本执行
windows下当然是以当前目录寻找这个【脚本文件名】
python 脚本文件名
8、结束执行
所有模块最高级的语句执行完毕后,python就结束执行了
9、这章我表现的不怎么样,继续加油吧…………
2、python的4种可调用分类:函数、方法、类、以及类的实例对象
a、函数:python主要分为3种类型的函数 (python中一样 everything is object,一切都是实例对象,所以函数的类型通过type()函数看到
第一种:内建函数或者叫内置函数(BIFs)builtin_function(你也可以理解成python自己写好的函数),内建函数在_bulitin_模块里哦
下面是内建函数(BIFs)的一些常见属性
__doc__ :代表的是内置函数的api文档吧,算,哈哈
__name__ : 内置函数名字,字符串类型哈
__self__ : 设置为None(保留给built-in 方法)
__module__ :存放内建函数的模块的名字, 必然是__builtin__
你还可以使用dir()函数,传入函数名字,会返回一个函数所拥有的所有属性的List
>>> dir(dir) ['__call__', '__class__', '__cmp__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']dir函数,再查看dir函数有哪些属性……,呵呵,别晕了
让我们再用type函数看看dir的类型
>>> type(dir) <type 'builtin_function_or_method'>……………………………………………………………………………………华丽丽的分割线…………………………………………………………………………………………………
第二种:是咱们自己写的函数(称为用户定义的函数 UDF,全称为:User-Defined Function)
定义在模块的最高级里面(就是没有空格字符,没有缩进)
也有默认的属性哦亲(自己查去吧dir(函数名字)):
udf.__doc__
udf.__name__
udf.func_code
udf.func_defaults
udf.func_globals
udf.func_dict
udf.func_doc
udf.func_name
udf.func_closure
让我们看看自己创建的函数,函数类型是个啥(注意别混淆成返回值类型)
>>> def fkMe(): pass >>> type(fkMe) <type 'function'>哈哈,是 function
第三种:匿名函数,嘿嘿,自己看吧
<span style="font-size:12px;"> >>> lambdaFunc = lambda x: x * 2 >>> lambdaFunc(100) 200 >>> type(lambdaFunc) <type 'function'></span>
匿名函数也是自己自定义的函数哦,只是没有名字而已,所以内建的属性都有哦 __name__啦 等等
>>> type(lambda:1) <type 'function'>我就fk了,lambda,我用的太少了,这是我的缺点……………………
>>> lambadaFu = lambda x: x * 100 >>> lambadaFu.__name__ '<lambda>'
b、方法:python中的方法有几种?内建方法(英文简称BIMs,也叫内置方法,名称呵呵)、用户自定义的方法,目前就这两种
第一种:内建方法,比如List、元组、字典中定义的方法
>>> type([].append) <type 'builtin_function_or_method'> >>> type([]) <type 'list'>
这句户有价值:此外,BIM 和BIF 两者也都享有相同属性。不同之处在于BIM 的__self__属性指向一个Python
对象,而BIF 指向None
第二种:咱们自己写在类里的方法,UDM(User-defined method,用户定义的方法)
内建方法与自己写的方法也一样拥有内建属性:__doc__、__name__等等
c、类:用类创建实例对象
书上说:利用类的可调用性创建实例。还强调了类有一个默认的构造函数(里面啥也没做,就写了pass),当然你也可以自定义构造函数 __init__(xx, xx)
关于类的调用,就先说到这里吧……哈哈
d、类的实例对象,重写__call__这个特别方法,具体看下面吧(这里要注意加深理解,一定要明白这个__call__()方法是干嘛用的
牛逼,大写的牛逼,谁曾想,作者还能想到把实例对象,当作一个函数来用,我cao,牛逼
<span style="font-family:SimSun;">class Person(object):
def __init__(self, personName):
self.name = personName
def __call__(self):
return self.name
if __name__ == '__main__':
p = Person("wang yuan wai")
print p()</span>输出结果:
wang yuan wai
当你使用p()时,会调用对应的__call__方法
插曲:callable()、
3、执行
比如我f5运行这个脚本
<span style="font-size:12px;">def temp(): print("temp()") temp() #这个会被执行,因为它处于最高级别(即没有缩进的代码) </span>
4、导入模块,即会执行最高级别的代码(即没有缩进的代码)
例子:
首先:新建一个import2.py 文件 就只有这么一行代码
<span style="font-size:12px;">print('loaded import2') </span>
然后:新建一个import1.py文件,代码如下
<span style="font-size:12px;">import import2 print("import 1") </span>
接着:执行import1.py文件
结果:
<span style="font-size:12px;">>>> loaded import2 #这里就是 import import2带来的作用,我们看到它执行了import2模块的语句 import 1 >>> </span>
总结:导入模块的副作用是会执行所有最高级别的代码
5、将模块作为脚本执行(2.4版本后加入的东东)
例如:在cmd下执行import1模块
D:\temp>python import1.py
6、转载:__name__ == '__main__'的作用
很多新手刚开始学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码,可能很多新手一开始学习的时候都比较疑惑,python 中__name__ = '__main__' 的作用,到底干嘛的?
有句话经典的概括了这段代码的意义:
“Make a script both importable and executable”
意思就是说让你写的脚本模块既可以导入到别的模块中用,另外该模块自己也可执行。
这句话,可能一开始听的还不是很懂。下面举例说明:
先写一个模块:
?
但是如果我们从另我一个模块导入该模块,并调用一次main()函数会是怎样的结果呢?
?
但是没有显示”we are in __main__“,也就是说模块__name__ = '__main__' 下面的函数没有执行。
这样既可以让“模块”文件运行,也可以被其他模块引入,而且不会执行函数2次。这才是关键。
总结一下:
如果我们是直接执行某个.py文件的时候,该文件中那么”__name__ == '__main__'“是True,但是我们如果从另外一个.py文件通过import导入该文件的时候,这时__name__的值就是我们这个py文件的名字而不是__main__。
这个功能还有一个用处:调试代码的时候,在”if __name__ == '__main__'“中加入一些我们的调试代码,我们可以让外部模块调用的时候不执行我们的调试代码,但是如果我们想排查问题的时候,直接执行该模块文件,调试代码能够正常运行!
7、将模块作为脚本执行
windows下当然是以当前目录寻找这个【脚本文件名】
python 脚本文件名
8、结束执行
所有模块最高级的语句执行完毕后,python就结束执行了
9、这章我表现的不怎么样,继续加油吧…………
相关文章推荐
- Git详解之二:Git基础
- OC中实例方法和类方法的区别
- Thread 暂停 继续(to be continued)
- gdb调试core文件
- Countless Candies
- bean生命周期
- canvas-2arcTo.html
- canvas-star7.html
- inflate方法
- Android性能优化之使用线程池处理异步任务
- 学习Android NestedScroll
- 虚拟机联网问题(原理及解决方案)
- 查找算法(4个简单的算法)
- Swift中类的操作
- 说说ABP项目中的AutoMapper,Castle Windsor(痛并快乐着)
- Best practice: escape, or encodeURI / encodeURIComponent
- 【BZOJ4311】向量
- HDU 1150 Machine Schedule 二分图最小覆盖点
- Spring - lookup-method方式实现依赖注入
- http直接访问含有中文的ulr失败