专栏首页深度学习思考者Python学习(一)函数定义、使用与嵌套

Python学习(一)函数定义、使用与嵌套

一.函数的定义

Python编程中对于某些需要重复调用的程序,可以使用函数进行定义,基本形式为:

def 函数名(参数1, 参数2, ……, 参数N): 其代码形式如下面所示:

def function (parameters):
    block
    return vlue

在这里说明几点:

  (1)在Python中采用def关键字进行函数的定义,不用指定返回值的类型。

  (2)函数参数parameters可以是零个、一个或者多个,同样的,函数参数也不用指定参数类型,因为在Python中变量都是弱类型的,Python会自动根据值来维护其类型。

  (3)return语句是可选的,它可以在函数体内任何地方出现,表示函数调用执行到此结束;如果没有return语句,会自动返回NONE,如果有return语句,但是return后面没有接表达式或者值的话也是返回NONE。下面看两个例子:

def printname():
    print 'way'

def printNum():
    for i in range(0,10):
        print i
    return

def add(a,b):
    return a+b

print printname()
print printNum()
print add(0,1)

二.函数的使用

在定义了函数之后,就可以使用该函数了,但是在Python中要注意一个问题,就是在Python中不允许前向引用,即在函数定义之前,不允许调用该函数。看个例子就明白了:

print printname()
def printname():
    return way

结果自然是错误了,还未定义就先打印结果。这个就好比如去商场买衣服,先拿回去穿一阵,再付钱。结果自然而知吧。

三.函数的嵌套

1 python支持嵌套函数; 2 内层函数可以访问外层函数中定义的变量,但不能重新赋值(rebind); 3 内层函数的local namespace不包含外层函数定义的变量

def foo():         #定义函数foo(),
    m=3            #定义变量m=3;
    def bar():     #在foo内定义函数bar()
        n=4        #定义局部变量n=4
        print m+n  #m相当于函数bar()的全局变量
     bar()         #foo()函数内调用函数bar()

四.python中self和init的含义

Python中的self

在Python中的类Class的代码中,常看到函数中的第一个参数,都是self。以及Class中的函数里面,访问对应的变量(读取或者写入),以及调用对应的函数时,都是

①self.valueName valueName:表示self对象,即实例的变量。与其他的,Class的变量,全局的变量,局部的变量,是相对应的。

②self.function()的形式。 function:表示是调用的是self对象,即实例的函数。与其他的全局的函数,是相对应的。

Python中为何要有self

在类的代码(函数)中,需要访问当前的实例中的变量和函数的,即,访问Instance中的:

对应的变量(property):Instance.ProperyNam,去读取之前的值和写入新的值

调用对应函数(function):Instance.function(),即执行对应的动作

-> 而需要访问实例的变量和调用实例的函数,当然需要对应的实例Instance对象本身

-> 而Python中就规定好了,函数的第一个参数,就必须是实例对象本身,并且建议,约定俗成,把其名字写为self

-> 所以,我们需要self(需要用到self)

如下代码,完整的演示了,如果没有在类Class的最初的init函数中,正确的初始化实例变量,则会导致后续没有变量可用,因而出现AttributeError的错误:

name = "whole global name";

class Person:
    def __init__(self, newPersionName):
        #self.name = newPersionName;

        #1.如果此处不写成self.name
        #那么此处的name,只是__init__函数中的局部临时变量name而已
        #和全局中的name,没有半毛钱关系
        name = newPersionName;

        #此处只是为了代码演示,而使用了局部变量name,
        #不过需要注意的是,此处很明显,由于接下来的代码也没有利用到此处的局部变量name
        #则就导致了,此处的name变量,实际上被浪费了,根本没有利用到

    def sayYourName(self):
        #此处由于找不到实例中的name变量,所以会报错:
        #AttributeError: Person instance has no attribute 'name'
        print 'My name is %s'%(self.name);

def selfAndInitDemo():
    persionInstance = Person("crifan");
    persionInstance.sayYourName();

###############################################################################
if __name__=="__main__":
    selfAndInitDemo();

从上述代码可见,由于在类的初始化(实例化)的init函数中,没有给self.name设置值,使得实例中,根本没有name这个变量,导致后续再去访问self.name,就会出现AttributeError的错误了。

对应的,如果写成self.name,则意思就正确了,就是初始化的时候,给实例中新增加,并且正常设置了正确的值newPersionName了,所以后续再去通过self.name,就可以访问到,当前实例中正确的变量name了。

相应的正确写法的代码如下:

name = "whole global name";

class Person:
    def __init__(self, newPersionName):
        #此处正确的,通过访问self.name的形式,实现了:
        #1.给实例中,增加了name变量
        #2.并且给name赋了初值,为newPersionName
        self.name = newPersionName;

    def sayYourName(self):
        #此处由于开始正确的初始化了self对象,使得其中有了name变量,所以此处可以正确访问了name值了,可以正确的输出了:
        #My name is crifan
        print 'My name is %s'%(self.name);

def selfAndInitDemo():
    persionInstance = Person("crifan");
    persionInstance.sayYourName();

###############################################################################
if __name__=="__main__":
    selfAndInitDemo();

Python中的_init_ Python中,常会看到,很多类中,都有一个init函数。其作用笔者认为: 1.支持带参数的类的初始化 2.实现类本身相关内容的初始化 具体的如下面所示:

class Person:
    def __init__(self, newPersionName):
        #在开始初始化新的类Class的示例Instance的时候,给对应的,不同的Instance,设置不同的人名(Person name)
        self.name = newPersionName;

    def sayYourName(self):
        #不同的Person的示例,调用同样的方法的时候,说出自己的名字,结果都是对应着自己的,各自不同的名字
        print 'My name is %s'%(self.name); #My name is crifan

def initDemo():
    persionInstance = Person("crifan");
    persionInstance.sayYourName();

###############################################################################
if __name__=="__main__":
    initDemo();

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python 远程控制模块 paramiko 问题解决记录

    生产环境中使用paramiko作SSH远程控制时,发现会有部分机器报Error reading SSH protocol banner错误,尝试使用ssh命令连...

    张戈
  • 【腾讯云的1001种玩法】云服务器搭建Python环境

    之前一直在用阿里云服务器跑爬虫、小脚本。这两天在朋友的安利下转到了腾讯云上面来,刚好趁这个机会写一写有关于云服务器上Python爬虫环境的搭建。

    钟志远
  • 反爬虫和抗DDOS攻击技术实践

    企鹅媒体平台媒体名片页反爬虫技术实践,分布式网页爬虫技术、利用人工智能进行人机识别、图像识别码、频率访问控制、利用无头浏览器PhantomJS、Selenium...

    张宁
  • 深度学习入门实战(二):用TensorFlow训练线性回归

    上一篇文章我们介绍了 MxNet 的安装,但 MxNet 有个缺点,那就是文档不太全,用起来可能是要看源代码才能理解某个方法的含义,所以今天我们就介绍一下 Te...

    serena
  • 如何轻松爬取网页数据?

    在实际工作中,难免会遇到从网页爬取数据信息的需求,如:从微软官网上爬取最新发布的系统版本。很明显这是个网页爬虫的工作。本文将根据网站特性进行分类介绍几种使用py...

    腾讯移动品质中心TMQ
  • 【腾讯云的1001种玩法】云服务器搭建Python爬虫环境

    在上一篇文章中,我们已经学会了在云服务器上搭建Python环境了,假设你已经在云服务器上搭建好了Python环境,我们将进入下一步:搭建Python爬虫环境。

    钟志远
  • Django数据处理的一些实践

    提到 Django 肯定避不开 MVC 模式,即模型(Model)-视图(View)-控制器(Controller),通过将业务逻辑、数据、界面显示分离的方法组...

    唐郑望
  • 实战干货:从零快速搭建自己的爬虫系统

    本文简要归纳了网页爬虫的基础知识,着重于利用现有组件,快速建立一套实际可用的网页爬取、分析系统。系统主要使用Python 作为开发语言,在 Linux 或 Ma...

    胖兔子兔胖
  • 深度学习入门实战(一):像Prisma一样算法生成梵高风格画像

    现在人工智能是个大热点,而人工智能离不开机器学习,机器学习中深度学习又是比较热门的方向,本系列文章就从实战出发,介绍下如何使用MXnet进行深度学习~

    serena
  • 腾讯云主机Python3环境安装Scrapy爬虫框架过程及常见错误

    Scrapy安装介绍Scrapy的安装有多种方式,它支持Python2.7版本及以上或Python3.3版本及以上。下面说明Python3环境下的安装过程。Sc...

    崔庆才

扫码关注云+社区

领取腾讯云代金券