众所周知,函数(function)是代码中最最不可少的组成部分之一
什么是函数
这里首先和数学意义上的函数做一个区分:
数学意义上的函数 \(f:S\to T\) 是一个集合 \(S\) 到另一个集合 \(T\) 的映射,其中 \(S\) 中的任何一个元素都唯一对应 \(T\) 中的一个元素。如果用 Input-Output 的方式理解,就把 \(f\) 看做一个黑盒,如果把 \(a\in S\) 放入黑盒,\(f\) 总会给出一个固定的 \(f(a)\in T\)
但在计算机意义里函数是一个代码块,它接受任意量任意类型的输入(或没有),执行一些代码操作,最后给出任意类型的输出(或没有,此时为返回 None 对象)。这里的函数中,在不同情况即使给定相同的输入,执行的操作和输出都可以不一样。所以更好的理解是将这里的函数理解成一段操作过程
如何定义函数
这里以一个可以给一个数做平方的函数举例:
def sq(x):
re=x**2
return re
print(sq(11))
输出为:
121
所以定义函数的方法是:
-
以
def
开头,写任意函数名,并写括号,最后以冒号结尾 -
在括号里写上输入的变量
-
在函数内部都要缩进,写下过程
-
如果要结束返回值,则写
return
并后接返回值(没有返回值就只写return
)
注意:与 C++ 不同的是,Python 中的输入和返回都不需要显式指定类型。这只是为了方便,在写函数时,必须自己明确输入和返回的类型
Python 的参数传递
不可变(immutable)类型和可变(mutable)类型
Python 中变量存在两种类型:
不可变类型:strings
, tuples
, 和 numbers
属于此类型,当此种类型的变量被作为参数输入至函数时,函数会做一个副本,此时在函数内对其进行的任何更改都不会在函数外生效
可变类型:list
, dict
属于此类型,当此种类型的变量被作为参数输入至函数时,函数直接传入其在内存的所在位置,此时在函数内对其进行的任何更改都会在函数外生效
来做个对比:
def f(x):
x=10
def g(x):
x.append(10)
a=9
f(a)
print(a)
b=[9]
g(b)
print(b)
输出为:
9
[9, 10]
可以发现 int
类型的输入没有更改,而 list
类型的更改了
Python 的参数类型
Python 的函数中的参数有以下几种类型:
必备参数
在括号里仅写出变量名的参数就是必备参数,以平方函数为例:
def sq(x):
re=x**2
return re
print(sq())
这段代码会报错,因为 \(x\) 为必备参数,而在调用时没有输入
默认参数
在变量名后面加上赋值为默认值,那么如果没有该变量的输入,就以默认值为输入
比如把刚才的函数设为如果没有输入就看作输入 \(0\):
def sq(x=0):
re=x**2
return re
print(sq(11))
print(sq())
输出为:
121
0
不定长参数
在参数名前加 *
,那么在调用该函数时,可以输入任意量的参数,并将这些部分变成一个元组(如果没有参数了,就是空)
来看一个例子,该函数先输入一个字符,然后对输入的所有数求和或求积:
def cal(opt,*num):
if opt=='+':
ans=0
for x in num:
ans+=x
return ans
if opt=='*':
ans=1
for x in num:
ans*=x
return ans
print(cal('+',2,3,4))
print(cal('*',2,3,4,5))
print(cal('+'))
输出为:
9
120
0
P.s 其实呢,print()
就是一个有不定长参数的函数,因为它输入任意数量的参数之后按序输出
关键字参数
这是 Python 的特殊操作之一,在调用函数时,如果将参数写成该函数定义时某个参数名的赋值语句,那么它就不管顺序直接输入给对应的参数
举个例子:
def print2(x,y):
print(x,y)
print2(y=1,x=2)
输出为:
2 1
P.s 在让 print()
函数不要末尾换行时,我们会在参数中加上 end=""
,这就是关键字参数写法
递归
递归是计算机函数最强大的特点,即在函数中调用自己
比如下面有一个对于非负整数 \(n\) 为偶数的定义:
-
如果 \(n=0\),那么 \(n\) 是偶数
-
如果 \(n=1\),那么 \(n\) 不是偶数
-
对于 \(n\geqslant 2\),\(n\) 是偶数当且仅当 \(n-2\) 是偶数
对于这个定义,我们可以直接写出一个判定函数:
def iseven(x):
if x==0:
return True
if x==1:
return False
return iseven(x-2)
print(iseven(11),iseven(18))
输出为:
False True
所以递归函数有一个重要要求:任何合法输入都应该有一个递归边界使得递归可以终止否则你的电脑可能会着
以上就是 Python 函数的一些基础知识了,谢谢大家的支持!