来自 计算机编程 2019-12-15 09:09 的文章
当前位置: 澳门威尼斯人平台 > 计算机编程 > 正文

Python基础(二)自定义函数

1、判断字符串,内容是否为数字

本文为《爬着学Python》系列第十篇文章。

自定义函数

使用def定义函数,例如:

def my_abs(x) :
    if x >= 0 :
        return x
    else :
        return -x

函数可以返回多个值,但是这是假象,实际上函数返回的是tuple类型的值,只不过返回的tuple值可以省略括号:

def swap(x, y) :
    temp = x
    x = y
    y = temp
    return x, y

x, y = swap(x, y)
print(x, y)

函数的理解

面向过程:根据业务逻辑从上到下垒代码

函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可

函数作用是你的程序有良好的扩展性、复用性。

同样的功能要是用3次以上的话就建议使用函数。

特殊理解:

函数可以理解为一个一个的功能块,你把一个大的功能拆分成一块一块的,用某项功能的时候就去调用某个功能块即可!

函数可以理解为:乐高积木,给你一块一块的,你可以用这些积木块组成你想要的任何功能!

函数可以调用函数!主函数的作用就是把函数进行串联、调用!函数本身是不能自己执行的如果不调用就永不执行!

#---------------------------------------------------
def func1():
    pass
def func2():
    pass
def func3():
    pass
def func4():
    pass
    func1()
    func2()
    func3()
    func4()

if __name__ == '__main__':
    #调用上面的函数,判断了、循环了调用等!
    #函数里也可以调用函数例子:def func4():

#__name__  这个是用来判断,如果你是把这个程序当模块导入的话它的__name__就等于这个程序的文件名,如果是手动执行这个脚本比如:python test.py  那么__name__就等于__main__ 所以,我们可以用他来做判断,如果你是手动执行我就调用函数执行if下面的语句,如果你是调用模块下面的if判断后面的语句就不执行!仅当模块使用!

#如果函数当模块导入的时候,他导入的是函数的名称,内容没有被导入,当你去调用的时候他才会导入函数里的信息。

我们用python;xlrd读Excel内容时,本来只是输入的整数字,经常读出来的是float类型


函数定义--定义默认参数

def power(x, n=2) : # 默认参数必须在参数的最后
    ....

自定义函数

我们需要自动转成整型,意思就是说,读出来的和我们输入的一样,但是,我们不能直接用int转换,原因呢,我们无法确定读的每个单元格的值都是数字

在实际操作中,可能函数是我们几乎唯一的实现操作的方式,这是因为函数能够构造一个高度集中的变量环境,在合理的设计下,它能使程序思路更加清晰的同时更利于调整与修改。几乎没有哪个程序设计语言会不涉及自定义函数的。

函数定义--定义可变参数

def fn(*args) : # 通过添加星号'*',args可以传入任意个参数,实际上args被当做tuple处理
    ....

一、背景

在学习函数之前,一直遵循:面向过程编程,即:根据业务逻辑从上到下实现功能,其往往用一长段代码来实现指定功能,开发工程中比较常见的操作就是粘贴复制,也就是将之前实现的代码块复制到现需功能处,如下:

while True:
    if cpu利用率 > 90 %:
        # 发送邮件提醒
        连接邮箱服务器
        发送邮件
        关闭连接

    if 硬盘使用空间 > 90%:
        # 发送邮件提醒
        连接邮箱服务器
        发送邮件
        关闭连接

    if 内存占用 >80%:
        # 发送邮件提醒
        连接邮箱服务器
        发送邮件
        关闭连接

 上面的代码就是面向过程的编程,但是如果报警多了的话成百的代码需要如何操作呢?复制粘贴就会显得自己low,该如何编写呢,请看下面的代码:

def 发送邮件(内容)
    #发送邮件提醒
    连接邮箱服务器
    发送邮件
    关闭连接
while True:
    if cpu利用率 > 90%:
        发送邮件('CPU报警')
    if 硬盘使用空间 > 90%:
        发送邮件('硬盘报警')
    if 内存占用 > 80%:
        发送邮件('内存报警')

 

第二个必然比第一个的重用性和可读性要好,其实就是函数式编程和面向过程编程的区别:

● 面向过程:更具需求一行一行垒加代码!逻辑乱、并切代码重复、不易修改重用性差!

● 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可

● 面向对象:对函数进行分类和封装,让开发"更快更好更强"

那么我们自己,定认一个函数如下:

图片 1

装饰器函数

装饰器函数可以为输入函数统一添加新的功能,例如装饰器log可以为制定的函数添加输出log的功能:

def log(f) :
    def fn(*args, **kw) :
        print( 'call' + f.__name__ + '()...')
        return f(*args, **kw)
    return fn
# 通过装饰器修正f函数
def f(x, y)
     return x + y
f = log(f) # log修正f后,再调用f
print f(x, y)
# 也可以通过@简化装饰器的调用
@log
def f(x, y)
    return x + y
print f(x, y) # 不需要再显式地使用log修正f

装饰器函数也可以输入除函数以外的参数,此时装饰器函数的返回值是另一个装饰器函数:

def log(string)
    def log_new(f)
        def fn(*arg, **kw)
            print( '[' + string + ']' +  'call ' + f.__name__ + '()...' )
            return f(*arg, **kw)
        return fn
    return log_new
@log('DEBUG')
def f(x, y)
    return x + y

装饰器修正的函数在被调用时,实际上并不是原始函数被调用,而是装饰器中定义的函数被调用,为了使得装饰器中定义的函数的属性和原始函数保持一致,使用python内置函数functools完成函数属性的复制:

def log(f) :
    @functools.wraps(f) # 将函数f的属性复制给函数fn
    def fn(*args, **kw) :
        print( 'call' + f.__name__ + '()...')
        return f(*args, **kw)
    return fn

二、函数式编程

def isNumeric(value):
    try:
        tv = float(value)
        return int(tv)
    except ValueError:
        return value

在上一篇文章中我们留了许多内容说要在本文中介绍,它们是一些和函数参数相关的问题。函数是我们的对操作方式的一种整合,因此我们会通过函数来进行运算或者完成某些功能,这些功能涉及到变量时,我们必须清楚到底发生了哪些事情。废话少说吧。

函数式编程最重要的是增强代码的重用性和可读性:

# 语法

def 函数(参数1,参数2,参数3,....):
        ' ' '注释' ' '
             函数体
             return  返回的值

#函数名的定义要能反映其意义 

函数的定义主要有如下要点:

● def 表示函数的关键字

● 函数名:函数的名称,日后根据函数名调用函数

● 参数:为函数体提供数据

● 函数体:函数中进行一系列的逻辑计算,如,发送邮件、计算出[11,22,45,56,45,]中的最大数等....

● 返回值:当函数执行完毕后,可以给调用者返回数据。

本文由澳门威尼斯人平台发布于计算机编程,转载请注明出处:Python基础(二)自定义函数

关键词: