从 Python到Tensorflow 学习之路(三)

从 Python到Tensorflow 学习之路(四)


最近毕业设计题目是研究对抗样本,要用tensorflow来搭建神经网络,因此python必不可少,这个不是一个传统的Python学习教程只是把学习Python过程中遇到的问题和经验记录下来(基于Python3.5),如果想要一步一步学习Python建议看下面的网站。
Python学习教程


模块

  • 在Python中,一个.py文件就称之为一个模块(module),其大大提高了代码的可维护性。
  • 使用模块可以避免函数名和变量名冲突,相同名字的函数和变量完全可以分别存在于不同的模块中。
  • 为了避免模块名冲突,Python引入了按照目录来组织模块的方法,称为包(package)。
    假设我们有两个模块abc和xyz,与其他模块冲突,我们可以使用包来组织模块,方法是选择一个顶层包名,比如mycompany按照如下目录存放
    snapshot2.png-2.8kB
    那么abc.py模块名就变成了mycompany.abc,类似的xyz.py模块名就变成了mycompany.xyz

注意每一个包目录下都会有一个__init__.py,这个文件是必须存在的。否则Python就把这个目录当成普通目录,而不是一个包。__init__.py可以是空文件,也可以有Python代码。因为__init__.py本身就是一个模块,它的模块名就是mycompany

使用模块
snapshot4.png-31.1kB

"""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中,实例变量名如果以__开头,就变成了一个私有
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值