# Python_函数专题(一)

函数基础

基础

  • 函数的基础理论
    • 函数,即一段具有特定功能的代码块
    • 调用函数,即通过一条简单的命令执行一系统复杂的操作,小括号本身是不能省略的
    • 函数名,即函数的标识符,在调用的时候函数的我们要通过函数名去调用整个函数
    • 函数的参数,即在调用函数时给函数提供的数据

函数调用

函数在调用的时候必须写上函数名后面加一个括号,这是固定的写法,小括号必须得写,不能省略。

带上括号就代码括号前面的东西是一个函数,就会调用这个函数所对应的功能,如下所示:

x = x = "input"
y = input()

通过input括号后面的括号就能很清楚的时候,第二个行的input一个函数,就会调用input函数所对应的代码片段;第一行的input因为没有括号,input就是普通的字符串而已,不会调用任何函数代码片段。

参数

并不是所有的函数都需要参数,有的函数必须携带参数,有的函数不需要携带参数函数是否要有参数,是函数本身的功能决定的:

# 我们以下面这段代码来解释一下
name = ["zhangsan","lisi","wanger"]
name.append("lucifer")
print(name)
name.clear()
print(name)

在上述代码当中,clear()和apped()都是函数,一个有参数,一个没参数,也就是说并不是所有的函数都必须携带参数。那为什么clear就不需要任何的参数?而是apped()后面必须要写参数呢?apped()函数后面如果不写函数python解释器就会报错,apped的作用是在原有的列表当中追加内容,如果apped不带参数,那追加什么呀?那apped就没有意义了!所以apped由于其功能的影响必须要加参数,而是clear函数的作用本身就是清空函数,既然都要清空了,那就没有必要再写参数了!举个小例子,两军对垒时,如果一方已经决定投降,那它就没有必要再去再向前面运送大量的物资,就像clear函数,既然都已经决定要清空了,那带携带个锤子参数!

有的函数可以携带多个参数,是否携带多个参数,也是由函数本身决定的

我们前面知道了有的函数必须携带参数,有的函数不需要携带参数,我们这里要说的是有的函数还可以携带多个参数,比如print函数

print("zhangsan","zs","lisi")

我们在使用函数的时候本身就是使用它可以将前面打印到前台的功能,自然是希望它不仅仅只能打印一个参数,print的函数在设计的时候就已经考虑到这一点。

返回值

并不是每个函数都有返回值

# print函数有返回值,而clear()函数就没有返回值
name = ["zhangsan","lisi"]
print(name)
name.clear()

clear本就是清空,就根据不需要返回值!而apped这个函数,直接追加内容到列表,就直接追加进去了,也没有返回值。

有返回值的函数,我们可以直接让其参与运算,如下所示:

# 我们可以直接让len()函数去参与运算
name = ["zhangsan","lisi"]
count = len(name) + 10
print(count)

如果没有返回值,强制通过变量承接,就是直接返回None,代表没有值,比如:

a = print("zhangsan")
print(a)

"C:\Program Files\Python311\python.exe" G:\python2\python编程从入门到实践\TEST2.py 
zhangsan
None

变量承接

有的函数需要变量去承接,而有的函数不需要,到底是否需要要看函数是否有返回值

比如print函数,我们使用print函数本身就是希望它打印到前台的功能,所以我们极少能看看到XX = print()这样的写法,我们就是要将其打印到前台,为什么用变量承接,实在没必要。

# 而有的函数,带有返回值,必须需要变量去承接,否则它就没有意义,比如
name = ["zhangsan","lisi"]
# len(name)
count = len(name)
print(count)

我们可以len函数去计算列表当中有多少个值,当我们计算出来之后,是有一个返回值的,我们接下来是要进行使用的,如果你仅仅写len(name)这并有任何的意义。

# 有的函数,没有返回值,那就不需要变量去承接,比如clear()
name = ["zhangsan","lisi"]
print(name)
name.clear()
print(name)

clear本来就是要去清空的,它没有返回值,我们也不需要它的返回值,所以就不需要通过变量去承接。

print

print("hello","world","!")
print("hello","world","!",sep="*")
# 默认情况下,print后面会加一个换行,所以一个不带参数的print,有空行的效果
print()
print("******************")
print("hello","world","!",sep="*",end="\n")
print("hello","world","!",sep="*",end="|")
print("hello","world","!",sep="*",end="|\n")

# 获取len函数的名字,注意len后面没有加括号,也就是我们我们没有调用它
# 仅仅想看一下它的函数名字
print(len.__name__)
print(input.__name__)

定义函数

image-20230707162204262

定义函数的格式

如下所示,这就是一个函数的格式,def必须得写,你在调用函数的时候必须得带一个括号,而在定义的时候这个括号同样不能省略,后面最后还要有一个冒号。

# 函数头的格式def 函数的名字():
# 函数如果不被调用是不会执行的!
def say_hi():
	# 函数体,必须缩进
	print("hello")

# 调用函数
say_hi()
"C:\Program Files\Python311\python.exe" G:\python2\python编程从入门到实践\TEST2.py 
hello

PS:函数必须得放在调用的前面才行!原因是整个代码是从上到下依次加载到内存当中,如上所示,在执行的时候需要从上到下先将函数主体加载到内存当中,但这时候没有执行,只能等到say_hi()函数开始调用时,才开始行内存当中的函数,但如果你不把函数主体放在前面,那内存当中就没有此函数主体,在调用时就会报错函数无法找到!如下所示:

NameError: name 'say_hi' is not defined

PS:系统给我们提供的函数在python启动的时候就已经加载到内存当中了,所以可以在python的任意地方进行调用!比如print函数。

函数嵌套

我们先阅读以下代码:

def say_hi():
	print("hello!")

def good_morning():
	print("hello!")
	print("good morning!")

good_morning()
"C:\Program Files\Python311\python.exe" G:\python2\python编程从入门到实践\TEST2.py 
hello!
good morning!

我们本来在say_hi函数当中打印了hello,然后我们又在good morning函数当中又打印了hello,也就是说hello已经重复了,既然第一个函数当中已经完成了hello的打印,我们在第二个函数当中完全就可以进行调用了,如下所示:

def say_hi():
	print("hello!")

def good_morning():
	# 在函数体当中直接调用另一个函数的功能
	say_hi()
	print("good morning!")

good_morning()
"C:\Program Files\Python311\python.exe" G:\python2\python编程从入门到实践\TEST2.py 
hello!
good morning!

在定义函数的时候,如果存在函数之间的嵌套,那相互之间并不会存在所谓的先后顺序,因为虽然内存是向下向下加载代码,但是加载完成之后如果不不被调用,那就不会执行,不会执行就不会报错,只有当函数被调用的时候才会去内存当中查找,如下所示,函数的嵌套的顺序没有严格的限制。

def good_morning():
	say_hi()
	print("good morning!")

def say_hi():
	print("hello!")

good_morning()
"C:\Program Files\Python311\python.exe" G:\python2\python编程从入门到实践\TEST2.py 
hello!
good morning!

函数调用死循环

即两个函数相互调用,如下所示,所以一定要避免

def good_morning():
	say_hi()
	print("good morning!")

def say_hi():
	good_morning()
	print("hello!")

good_morning()

函数参数

image-20230707162212619

单参数

参数的作用是为函数提供数据的!先看这段代码

def line():
	print("---")

print("hello")
line()
print("goog")

"C:\Program Files\Python311\python.exe" G:\python2\python编程从入门到实践\TEST2.py 
hello
---
goog

如上所示,我们写了一个函数line,里面有三个横杠,我们在调用经函数的时候自然也会出现三个横杠!

但是我们希望我们能通过在line函数的后面自己写一个参数,我们自定义横杠的数量,如下所示:

# width是我们随便写的字符,就是宽度的意思
def line(width):
	print("-" * width)

print("hello")
line(4)
print("goog")

"C:\Program Files\Python311\python.exe" G:\python2\python编程从入门到实践\TEST2.py 
hello
----
goog

双参数

如下所示,我们给函数提供两个参数,一个是长度,另一个使用什么字符,如下所示:

def line(width,char):
	print(char * width)

print("hello")
line(7,"@")
print("goog")

"C:\Program Files\Python311\python.exe" G:\python2\python编程从入门到实践\TEST2.py 
hello
@@@@@@@
goog

报错

仔细看以下代码,我们在定义函数时指定了两个参数,但是在调用函数的时候却没给它参数或只给一个参数,这样搞就会报错,如下所示:

def line(width,char):
	print(char * width)

print("hello")
line(7)
print("goog")

# 报错
TypeError: line() missing 1 required positional argument: 'width'

也就是说:我们在使用函数的时候提供的参数与要写函数定义时候提供的参数数量要一致!

而且参数时给定的顺序也必须与函数定义的顺序是一致的,如上图所示,我们希望用户使用函数时第一个参数是长度,第二个长度才是字符,如果用户写反了!那有就有可能会出错!

指定参数类型

正常情况下,我们在变量使用函数时,会自动提示一些函数,如下所示:

image-20230707162224029

image-20230707162230130

当变量里面是数据类型不一样时,提供的函数信息也不一样,也就是pycharm其实是可以判断出name当中到底是字符串还是数字的,在定义参数的时候也会类似的情况下,如下所示:

image-20230707162236870

如上所示,在函数体say_hi当中,pycharm并不知道width到底是字符中还是数字,所以给你函数提示就很奇怪!你可以函数体当中告诉pycharm参数的类型,那它就会给你提供该数据类型对应的函数,如下所示:

image-20230707162242788

我们也可以不在函数体当中指定数据类型,在调用函数时指定,函数体依然也能感知到,如下所示:

image-20230707162248864

函数文档注释

在函数内部加上注释,在使用的时候就可以通过help、或写函数的时候看到提示,如下所示:

def line(width,char):
	'''
	画一条线
	widtch是指定宽度
	char是指定字符
	正常情况下应该这样使用:line(“*”,7)
	'''
	print(char * width)

help(line)

"C:\Program Files\Python311\python.exe" G:\python2\python编程从入门到实践\TEST2.py 
Help on function line in module __main__:

line(width, char)
    画一条线
    widtch是指定宽度
    char是指定字符
    正常情况下应该这样使用:line(“*”,7)

Process finished with exit code 0

函数返回值

Return

谈到函数当中的返回值必谈Return,return有两个作用:

  • 返回值:return的原意就是返回值,它给返回一个值给外界
  • 退出:函数体一旦遇到return,执行完return之后就会退出,不再向下执行了!

定义带有返回值的参数

def get_max(a,b):
	# 如果a大于b,v等于a,否则v就等于b
	v = a if a > b else b
	# 返回v这个值,同时结束执行,下面的print根本不会执行
	return v
	print("hello")
z = get_max(8,19)
print(z)

"C:\Program Files\Python311\python.exe" G:\python2\python编程从入门到实践\TEST2.py 
19

返回多个值

return可以返回多个值,变量承接的时候也得使用多个变量,如下所示:

def get_max(a,b):
	# 如果a大于b,v等于a,否则v就等于b
	v = a if a > b else b
	# 返回v和v+10,v+20三个值
	return v,v+10,v+20
	print("hello")

# 接入的时候也得使用三个值
z,i,t = get_max(8,19)
print(z,i,t)

"C:\Program Files\Python311\python.exe" G:\python2\python编程从入门到实践\TEST2.py 
19 29 39
  • 如果函数返了三值,外界却只有两个变量承接,会有什么现象?会报错
  • 如果函数返了三值,外界却只有一个变量承接,会有什么现象?会形成一个无组,如下所示:
def get_max(a,b):
	# 如果a大于b,v等于a,否则v就等于b
	v = a if a > b else b
	# 返回v和v+10,v+20三值
	return v,v+10,v+20
	print("hello")

# 接入的时候也得使用三个值
z= get_max(8,19)
print(z)

"C:\Program Files\Python311\python.exe" G:\python2\python编程从入门到实践\TEST2.py 
(19, 29, 39)

Process finished with exit code 0
posted @ 2023-07-07 16:24  张贺贺呀  阅读(14)  评论(0编辑  收藏  举报