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
的函数,函数有两个参数:greet
和objects
,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