函数
函数的作用
有句话说数学是宇宙语言,其主要原因应该就是函数了,世界的千千万万都可以用一个函数来表示。在python里函数可以理解为给一系列操作打包当你调用该函数时程序就会执行函数里面的所有语句。
函数的分类
提到函数,大家应该会想到熟悉的f(x)。在编程语言里的函数与数学中的函数差不了多少。在编程语言里会分为有返回值函数、无返回值函数其中又有有参函数和无参函数。
我们在使用函数的时候会分为两部分,一是函数的定义,二是函数的调用。
无参函数
在python中我们用def语句告诉电脑下面所有缩进的内容都是我正在定义的函数。
1.无返回值
def hello():
print("hello this is python")
此为函数的定义,在程序运行时函数定义里的内容是不会执行的,只有当函数被调用的时候才会执行。
hello() # 函数调用输出hello this is python
2.有返回值
由于有无返回值相差不大,于是我仅在此处说明有返回值函数。
在函数中如果出现return某个值的情况,则说明该函数是有返回值的。
不了解return的话可以先看一下文章后面的“函数的关键字”。
def return10():
return 10
a = return10() # 调用
print(a) # 10
当代码量变长之后,想了解某个函数所返回的变量类型将会比较麻烦,所以可以将该类型“写”在函数名后面
# 返回值为空
def fun() -> None:
return
有参函数
学习有参函数时,先了解有效全局和局部变量。
1.全局变量和局部变量
全局变量指的是在全局中定义的变量,也就是在所有函数外定义的变量,其具有全局性,他在任何位置均有效。
局部变量为在某个函数或循环体等内部定义的变量,其只在内部有效,超出定义范围无效。(局部变量也可以是局部里的局部变量,也就是函数里的嵌套函数里也可以有局部变量)
因此在函数内部不能直接修改函数外部的变量
x = 100
def fun():
x = 200
print(x)
print(x) # 100
fun() # 200
print(x) # 100
但是有些时候我就是想要修改怎么办呢?
我们可以使用global关键字将局部变量上升为全局变量。
x = 100
def fun():
global x
x = 200
print(x)
print(x) # 100
fun() # 200
print(x) # 200
此时的变量就可以对其修改啦。同理也可以用nonlocal将外部的变量转为局部变量。nonlocal使用情况比较少,这边就不详细写,感兴趣的同学可以试试。
注:nonlocal写在内部的变量前,且只能向上升一层。
2.函数的参数
首先了解一下什么是参数,参数就是一种特殊的变量他在函数定义里的括号中,在函数里定义的变量会与函数共存亡,也就是该变量仅存在于当前定义的函数中。这句话很重要有助于了解后续的递归等其他知识。
def add(number1, number2):
return number1 + number2
def print_x(x):
print(x)
既然是有参函数那么在调用他们的时候就要传入参数给他们。
num1 = 10
num2 = 11
num3 = add(num1, num2)
print(num3) # 21
print_x(num3) # 21
3.必备参数和默认参数
必备参数:在函数调用的时候,必须传入的参数是必备参数。
默认参数:在函数调用的时候,可以不传入的参数是默认参数。默认参数在不传入的时候会是一个默认值。
def add(number1, number2=0):
return number1 + number2
该函数中number1为必备参数必须传入,number2为默认参数可以不传入。
并且参数在定义的时候也是有顺序的:
无参 =》 必备参数 (定义完)=》 默认参数(定义完)
否则运行会报错。
4.不定长参数
有时候我们想传入一些参数,而且还不知道他们的个数,用上面的方法就会不好定义函数,于是我们引入了不定长参数。注意同种不定长参数最多只能一个,不定长参数不是必备参数。
4.1元组不定长
元组不定长可以不传值,也可以传一系列值,用一个*表示。
def fun(*args):
print(args)
fun() # 不传值
fun('asv', 'a', 87, 2, 4, 3, 4, {"af": "asdf"}, ('bv', 'a'), {4, 62, 74, 1}) # 以元组形式存储传入的数据
4.2字典不定长
字典不定长对传入形式有限制:必须以键=值的形式传入。当然也可以不传值。函数会自动给键加上引号转为字符串。
def fun(**kwargs):
print(kwargs)
fun() # 不传值
fun(name='Ice', age=0) # {'name': 'Ice', 'age': 0}
4.3参数顺序
此时我们将对参数顺序进行更新:
无参 =》 必备参数 (定义完)=》 默认参数(定义完)=》 元组不定长(*args) =》字典不定长(**kwargs)
4.4以拆包的形式传入参数
def fun(*args, **kwargs):
print(args)
print(kwargs)
tu = (2, 5, 3, 4, 6)
dic = {"name": "Ice", "age": 0}
fun(*tu, **dic) # *表示元组拆包,**表示字典拆包
闭包
当外层函数返回内层函数的函数体时称为闭包。
def fun():
x = 5
def fun1():
nonlocal x
x -= 1
print(x)
def fun2():
nonlocal x
x += 1
print(x)
return fun1
# return fun1,fun2 也可以返回多个函数体,结果用元组存储,调用对应的函数体可以利用元组的拆包进行调用
print(fun()) # <function fun.<locals>.fun1 at 0x000001BA70979EE8>
fun()() # 执行该闭包下的函数
不了解元组的拆包可以看看这篇文章python学习–元组
函数的关键字
前面在将有返回值函数是提到return,这里介绍一下return。
return用来实现函数的终止和返回值。
如果一个函数执行到return则他之后的所有语句将不执行,并直接结束本次函数的调用。
def fun():
print(1)
return
print(3)
fun() # 1
此处就不会输出3。
如果return后面跟上一个变量或值,那么函数结束还会返回该值,该值可以用变量接收!
def fun():
print(1)
return 10
print(3)
a = fun() # 1
print(a) # 10
递归
当一个函数调用他本身时称为递归。
例如求阶乘函数可以递归实现:
def fun(n):
if n == 1:
return 1
else:
return n * fun(n - 1)
print(fun(3)) # 6
用递归实现的时候注意设定递归的出口,在上述求阶乘的递归函数中出口就是n等于1的时候。
匿名函数
顾名思义匿名函数就是没有名字的函数。其通过lambda来定义,默认自动返回,所以可以用变量来接收。
a = lambda x: x + 1
print(a(5)) # 6
当然匿名函数也可以实名的。
def a(x):
return x + 1
print(a(5)) # 6
作业
感兴趣的同学可以写一下这道题巩固一下函数知识。
- 定义一个函数isPrime(),实现输入一个整数判断该整数是否为质数,是则返回True,不是则返回False。(质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数。)
- 定义一个函数,输入字符串,如果字符串是升序排列的则返回UP,是降序排列的则返回DOWN,如果是乱序则返回False。(字符串用小写字母的形式传入)
下篇文章将给出答案,供大家参考。
结束语
这次引入了作业元素不知道各位觉得怎么样?
各位看官点个赞吧,这对我非常重要。
ps:现在关注我,以后就是老粉啦!!!
下篇预告
由于函数内容较多我将会分两篇文章发布,下篇将会列一些内置函数。