从 Python到Tensorflow 学习之路(四)
最近毕业设计题目是研究对抗样本,要用tensorflow来搭建神经网络,因此python必不可少,这个不是一个传统的Python学习教程只是把学习Python过程中遇到的问题和经验记录下来(基于Python3.5),如果想要一步一步学习Python建议看下面的网站。
Python学习教程
模块
- 在Python中,一个.py文件就称之为一个模块(module),其大大提高了代码的可维护性。
- 使用模块可以避免函数名和变量名冲突,相同名字的函数和变量完全可以分别存在于不同的模块中。
- 为了避免模块名冲突,Python引入了按照目录来组织模块的方法,称为包(package)。
假设我们有两个模块abc和xyz,与其他模块冲突,我们可以使用包来组织模块,方法是选择一个顶层包名,比如mycompany
按照如下目录存放
![]()
那么abc.py模块名就变成了mycompany.abc,类似的xyz.py模块名就变成了mycompany.xyz
注意每一个包目录下都会有一个__init__.py
,这个文件是必须存在的。否则Python就把这个目录当成普通目录,而不是一个包。__init__.py
可以是空文件,也可以有Python代码。因为__init__.py
本身就是一个模块,它的模块名就是mycompany
使用模块
"""a test module"""
__author__ = 'LWP'
import sys
def test():
args = sys.argv
if len(args)==1:
print('%s!' %args[0])
elif len(args)==2:
print('Hello, %s!' %args[1])
else:
print('Too many arguments!')
if __name__=='__main__':
test()
- 使用
sys
模块第一步就是导入该模块:import sys
导入后,就有了变量sys
指向该模块,利用sys
这个变量,就可以访问sys
模块的所有功能。sys
模块有一个argv
变量,用list存储了命令行的所有参数。argv
至少有一个参数,因为第一个参数永远是该.py
文件的名称,当我们运行Python3 blog_test.py
获得的sys.argv
就是[/home/lwp/PycharmProjects/blog_test/blog_test.py!]
- 注意这个代码:
if __name__ = '__main__':
test()
- 当我们在命令行运行
blog_test
模块时,Python解释器会把一个特殊变量__name__
置为__main__
,而如果在其他地方导入该blog_test
模块时,if
判断将失败,因此这种if
测试可以让一个模块通过命令行运行时执行一些额外的代码,最常见的就是运行测试。- Python解释器在读取一个源文件时,会执行从中找到的所有代码。在执行所有代码前,它会定义一些特殊的变量。例如,当Python解释器在运行源文件模块并把它当做主程序,它会将
__name__
设置为'__main__'
。如果这个源文件被其他模块导入那么__name__
设置为模块本身的名字。因此你可以将一些不希望被导入的人运行的程序放进检查中,其他人便不会运行
作用域
在一个模块中,我们可能会定义很多的函数和变量,但有的函数和变量我们希望给别人使用,有的函数我们希望仅仅在模块内部使用。在Python中,是通过前缀_
实现的
- 正常的函数和变量名是公开的(public),可以被直接引用,比如
abc, x123
- 类似与
__xx__
这样的前后双下划线变量是特殊变量,可以直接被引用,但是有特殊用途,比如上面的__author__, __name__
- 类似于
_xx, __xx
这样的前单下划线或单双下划线函数和变量”不应该“被直接引用,而不是”不能“被直接引用,因为Python并没有一种方法可以完全限制访问private函数或者变量。
def _private_1(name):
return 'Hello, %s' % name
def _private_2(name):
return 'Hi, %s' % name
def greeting(name):
if len(name) > 3:
return _private_1(name)
else:
return _private_2(name)
import blog_test
print(blog_test.greeting('world'))
# output: Hello, world
面向对象编程
一个简单的处理学生成绩的类
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
def print_score(self):
print('%s: %s' % (self.name, self.score))
alice = Student('Alice', 99)
bob = Student('Bob', 85)
alice.print_score()
bob.print_score()
# output:Alice: 99
# Bob:85
类和实例
- class后面紧接着是类名,即Student,类名通常是大写开头的单词,紧接着是
(Object)
,表示该类是从哪个类继承下来的。- 由于类可以起到模板的作用,因此可以在创建实例的时候,把一些我们认为必须绑定的属性强制填写进去。通过定义一个特殊的
__init__
方法,在创建实例的时候,就把name, score
等属性绑定上去。注意__init__
前后都是双下划线。__init__
方法的第一个参数永远是self
,表示创建的实例本身,因此,在__init__
方法内部,就可以把各种属性绑定到self
,因为self
就指向创建的实例本身。- 有了
__init__
方法,在创建实例时,不能够传入空的参数,必须传入与__init__
方法相匹配的参数,但是self
不用传,Python解释器自己会把实例变量传进去。
访问限制
- 从前面Student定义来看,外部的代码仍然可以自由地修改一个实例的
name、score
属性
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
def print_score(self):
print('%s: %s' % (self.name, self.score))
alice = Student('Alice', 99)
bob = Student('Bob', 85)
print(alice.score)
# output:99
- 如果要让内部属性不被外部访问,可以把属性前面的名称加上两个下划线
__
,在Python中,实例变量名如果以__
开头,就变成了一个私有