python 函数的使用

导读:本篇文章讲解 python 函数的使用,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

python函数是一个很有用的工具,可以解决很多重复性的工作。它就好比是我们经常干的一件事,把一些经常要用的东西做成模板,之后每一次使用时,创建一个副本即可。
而在python中,我们管他叫封装,相关的操作会更加方便一些,因为不需要再创建一个副本,而是直接调用,具体怎么调用呢,在文中用代码给大家揭晓。

先上一张图看看本文的知识架构:
本文思维导图

学一个东西,一般我们应该问几个问题:学什么、为什么学、怎么学。

一、学什么

学函数,函数是什么,函数是组织好的、可以重复使用的、用来实现单一功能的代码。
简单的函数像:

def func():
    print('Hello world!')

该函数就是把Hello world!封装起来,每次我们调用func()的时候就可以直接打印Hello world!了,是不是很简单。
当然,如果仅仅是打印Hello world!大可不必这么大费周章,但是可以想想要是其他很复杂的一些逻辑呢,是不是就很有必要了呢?

二、为什么学

除了开头说到的高效处理任务之外,还有一点很重要的,降低耦合度,就是把解决某一个任务的代码封装起来,如果需要执行该代码,直接调用函数就可以了。有点像python模块的概念。

三、怎么学,学完怎么用

怎么学,学完怎么用,来跟着我过一遍吧。
下面就不分什么函数定义和调用了,其实定义就是使用def关键字,根据格式写一遍即可。而调用更简单<函数名>(<参数>)即可。

3.1 首先,函数有什么?

函数有函数名、参数、函数体,通过以下代码可以快速过一遍这些概念。

def 函数名(参数1,参数2...参数n): 
     函数体

这三大部分便是构成函数的主要成分。每一个部分都有一些“学问”。

3.1.1 函数名

先来看看函数名,函数名和变量名的命名逻辑差不多,不能数字开头,多个词关联只能用下划线,函数名也可以用中文哦!如果想试试中文编程,可以用中文的名称试试。
另外,注意一点,名字尽量和所实现的功能相近,特别在函数比较多的情况下,方便理解。

3.1.2 参数

参数的类别比较多,有位置参数,默认参数,不定长参数,关键参数。

  • 位置参数:就是跟参数所在的位置相关,涉及到参数的顺序,其实有点像列表或元组,每一个参数有一个位置标签,传入参数时按照位置标签一一匹配。如下代码,我创建了一个叫Say_Hello的函数,函数有两个参数:greetobjects,greet是问候语变量,objects是问候对象变量。我后面调用的时候,按顺序传入('Hello','world')就可以打印出Hello world!。如果我改用Say_Hello('world','Hello')是否可以呢?大家可以试试。代码不会报错,但是结果便反过来了,变成了world Hello!
def Say_Hello(greet, objects):  # 定义函数
    print('%s %s!'%(greet, objects))
Say_Hello('Hello','world')     # 该句为调用函数,打印结果为:Hello world!
  • 默认参数:给参数赋一个值,作为默认值,如果不传参数则采用默认值。注意,默认参数要放在位置参数后面。如下代码,给greet加上一个默认值,则参数要放在objects后面,传参时可以不用传,也可以重新传一个覆盖已有的值。
def Say_Hello(objects,greet='Hello'):
    print('%s %s!'%(greet, objects))
Say_Hello('world')       # 打印结果为:Hello world!
Say_Hello('world','Hi')  # 打印结果为:Hi world!
  • 关键参数:这个看字面意思看不怎么出来,文字也不好描述,其实就是调用的时候,指定参数赋值,直接看看代码,便可理解。如下代码,最后一行调用参数时,指定关键字赋值,这时可以不用按顺序传参。
def Say_Hello(objects,greet='Hello'):
    print('%s %s!'%(greet, objects))
Say_Hello(greet='Hi',objects='world')  # 打印结果为:Hi world!
  • 不定长参数:不限制参数个数,可以传一个或多个,以元组形式返回。返回的时候也是以元组的格式返回。如果要将元组元素分别取出来,可以使用join()
def Say_Hello(greet, *objects):
    print('%s %s!'%(greet, objects))
    # print('%s %s!'%(greet,'、'.join(objects)))
Say_Hello('Hello','world')             # 打印结果为:Hello ('world',)!
Say_Hello('Hello','world','明而决之')  # 打印结果为:Hello ('world', '明而决之')!

3.1.3 函数体

函数体是所有实现功能的代码。函数体涉及到函数的返回值,关键字为return。返回值可用于赋值,再次利用,而直接print()则不行。
函数体遇到return之后就停止执行并将结果返回。当一个函数没有return时,返回None

def Say_Hello(greet, objects):
    return ('%s %s!'%(greet, objects))
    print('该句不打印!')
sayhello_val = Say_Hello('Hello','world')
print(sayhello_val) 	# 打印结果为:Hello world!

3.2 其次,函数需要注意什么

了解了函数有什么之后,基本上可以自由地使用函数了。但是使用过程中,可能会出现一些bug。最典型的一个就是变量的作用于。
在函数内部定义的变量,称为局部变量,只能作用于函数内部(相当于是私人物品),函数外调用便会出错。在函数外部定义的变量,称为全局变量(相当于是公共物品),函数内外都可以调用。

### 代码一
# 全局变量greet
greet = 'Hello'
def Say_Hello(objects):
    # 调用全局变量
    print('%s %s!'%(greet,objects))
Say_Hello('world')
print(greet)  # 调用全局变量
### 代码二
def Say_Hello(objects):
    # 局部变量
    greet = 'Hello'
    print('%s %s!'%(greet,objects))
Say_Hello('world')
print(greet)   # 调用局部变量报错

函数内定义的变量虽然属于“私人物品”,但是“私人物品”也可以被分享出来,成为“公共物品”,这个过程的转变,可以通过一个关键字搞定——global

### 代码三
def Say_Hello(objects):
    # 声明为全局变量
    global greet
    greet = 'Hello'
    print('%s %s!'%(greet,objects))
Say_Hello('world')
print(greet)   # 不会报错

3.3 最后,函数还可以做什么

函数除了上面讲的功能,其实还有很多有趣的玩法,比如函数闭包、函数装饰器、匿名函数、

3.3.1 闭包

其实就是函数里再嵌入一个函数,里层函数将结果返回给外层函数,调用外层返回内层函数(是返回,而不是调用,所以不需要加括号),然后在函数外调用函数的时候就返回一个函数,如果要获得最终的结果,需要再调用一次。适合一些暂时不需要返回结果,而是传递函数的场景。需要结果时再进行调用打印。

def Say_Hello(greet,*objects):
    def Hello():
        names = '、'.join(objects)
        return '%s %s!'%(greet,names)
    return Hello     # 注意,没有括号
aa = Say_Hello('Hello','world','明而决之')
aa()

3.3.2 函数装饰器

给函数增加新的功能,但又不修改原来的函数,而是使得调用原函数的时候附加一些功能。如下,调用Say_Hello()函数的时候,加上一句:Call Say_Hello():

# 定义一个装饰器,传入要装饰的目标函数
def Self_Introduction(func):  # 传入目标函数
    def wrapper(*args,**kw):
        print('Call %s():'% func.__name__) # 获取函数名
        return func(*args,**kw)            # 返回要装饰的目标函数的结果,注意这里是调用,所以直接给结果,而不是返回函数,调用时便会打印结果
    return wrapper

# 将装饰器加到Say_Hello()函数上
@Self_Introduction
def Say_Hello(greet, objects):
    print('%s %s!'%(greet, objects))
## 调用函数
Say_Hello('Hello','world')
## 打印结果:
## Call Say_Hello():
## Hello world!

3.3.3 匿名函数

一般用于过程的处理,关键字是lambda,一般简单的函数可以通过lambda函数来实现。下同通过代码来理解,像代码一中的函数就是一个简单的print()语句,其中对objects参数进行处理。这种就可以通过lambda函数进行改写。
lambda函数的格式是在lambda后面跟参数,同普通函数的参数,然后冒号,加上处理逻辑即可。lambda函数用于处理数据会比较多一些,像用pandas或numpy处理数据的时候,经常要传入一个简单的函数处理数据,通过lambda处理会比较简洁、方便。

### 代码一
def Say_Hello(greet, *objects):
    print('%s %s!'%(greet,'、'.join(objects)))
Say_Hello('Hello','world','明而决之')  # 打印结果为:Hello world、明而决之!
### 代码二
Say_Hello = lambda greet,*objects:print('%s %s!'%(greet,'、'.join(objects)))
Say_Hello('Hello','world','明而决之')  # 打印结果为:Hello world、明而决之!

四、小结

本文讲了函数的使用。
1、函数是什么?就是一个封装好的代码。
2、为什么要学习函数?降低耦合、减少重复代码、提高效率。
3、怎么学函数?从函数的构成入手,学习函数的函数名命名方式、参数的种类、函数体中的返回关键字,以及函数中的变量的作用域。

  • 函数名:不能数字开头,多个词关联只能用下划线,函数名也可以用中文命名。
  • 参数的种类:位置参数、默认参数、关键参数、不定长参数。
  • 函数体中返回关键字:return,函数体遇到return之后就停止执行并将结果返回。
  • 函数中变量的作用域:仅用于函数内,可以通过global关键字声明为全局变量。

最后再讲到函数的一些拓展知识点,包括函数的闭包、装饰器、匿名函数。

  • 闭包:返回里层函数,需要时再使用结果。
  • 装饰器:给函数增加新的功能,但又不修改原来的函数。
  • 匿名函数:处理逻辑简单的函数,简洁、方便。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/66966.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!