一、基础知识
1.1 什么是函数
实现了某一功能或者某些功能指令的集合,函数就是一个功能、一个过程。
1.2 函数的定义
def 关键字 # define function
def 函数名称([参数列表]):
"""
函数的注释,其本质是文档
"""
# 函数体
# 可以通过return返回返回值
# [return 函数的返回值]
输出函数的文档注释:魔法属性__doc__
def show(): """ 函数的注释,其本质是文档 """ print("information") show() print(show.__doc__)
结果:
1.3 函数的调用
函数定义完成后,并不会自己调用,加载到内存中,等待调用者来调用。
def fun1():
print("这是fun1")
def fun2(a):
a() #调用函数a
print("这是fun2")
fun1() #调用函数fun1
print("\n")
fun2(fun1) #调用函数fun2,其参数为fun1(引用传递)
结果:
二、函数的分类
2.1 函数是否存在参数
- 有参数 (函数的参数可以是类型任意(基本数据类型+对象))
def add(a,b):
return a+b
def ls_append(fun,ls): #此处的参数为函数和列表,均为引用传递。
c = fun(1,2) #就算不返回ls,ls的值已经发生改变
ls.append(c)
ls = [1,2]
ls_append(add,ls)
print(ls)
结果:
- 无参数
2.2 函数是否存在返回值
-
有返回值
def add(a,b): return a+b num1,num2 = eval(input("请输入两个数:")) result = add(num1,num2) #变量result接收函数add的返回值 print("这两个数的和是:{}".format(result))
def rear(a): index = a.rfind(".") rear_name = a[index:] return rear_name str = input("请输入一个文件路径:") print("该文件的后缀名是:%s" %(rear(str))) #直接调用函数,输出其返回值
-
没有返回值
#判断是否为闰年 def judege_leap(year): if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0: print("%s是闰年" %year) else: print("%s不是闰年" %year) year = int(input("请输入一个年份:")) judege_leap(year)
2.3 函数的定义者
- 系统自带
- 第三方:公司、组织、个人
- 自定义
三、变量的分类(以函数为标准)
3.1 全局变量
在python中,定义在py文件中的变量,叫做全局变量。特点:在代码运行时,变量始终有效(不是手动回收)
a = 1 #a,b均为全局变量
b = 2
def fun1():
c = a+b
print(a,b)
fun1()
结果:
#在某个函数中,默认无法修改全局变量的值
a = 1
b = 2
def fun1():
print(a,b)
a = a+b
b = b+1
print(a,b)
fun1()
结果:
3.2 局部变量
定义在函数中的变量叫做局部变量,当函数被垃圾机制回收,该变量也会被回收掉,局部变量的作用域也只有在函数内有效。
a = 1
b = 2
def fun1():
c = a+b #c为局部变量
print(a,b,c)
fun1()
print(a,b,c) #c为局部变量
结果:
3.3 变量的使用
- 在函数外面不能访问到函数内部定义变量(局部变量)
- 在函数内部可以访问本地变量(全局变量)
- 函数使用全局变量的注意点:如果一定要在函数中操作全局变量,使用global关键字来申明。(不推荐使用)
a = 1
b = 2
def fun1():
global a,b
print(a,b)
a = a+b
b = b+1
print(a,b)
fun1()
结果:
四、函数参数
注意在定义函数时,以下各类参数的顺序!
4.1 默认值参数
定义函数时,给某个参数设定一个默认值。当函数执行时,若该参数指定了明确的值,则函数的执行使用该值参与运算;若没有指定,函数执行不报错,该参数使用默认值参与运算。
- 使用:在定义参数时,直接对某个参数赋值
def circle_length(r,PI=3.14): #PI为默认值参数
return 2 * PI * r
length1 = circle_length(1)
length2 = circle_length(1,3)
print(length1,length2)
结果:
4.2 可变参数
如果一个函数的执行需要大量的参数或者参数个数不确定时。可以在定义函数时,可以使用可变参数。
- 使用:在定义函数时,在普通参数和默认值参数后。*args(可变参数名,自定义)
def show(a,b=1,*args): #args以元组的形式将剩余参数封装起来
print(a,b,args)
print(type(agrs))
show(1,2,3,4,5)
结果:
4.3 命名参数(关键字参数)
调用函数时,以键值对的形式传递参数。
- 使用:定义函数时,是普通参数、默认值参数、可变参数后。**kwargs
def show(num,**kwargs):
print(num,kwargs)
print(type(kwargs))
print(kwargs["name"],kwargs["age"],kwargs["gender"])
show(1,name = "wang",age = 18,gender = "男")
结果:
4.4 万能参数(可变参数+关键字参数)
def test(a, b, *args, **kwargs):
五、递归函数
在函数内部调用函数本身。
注:
-
如果递归中没有结束条件,会形成死循环(python会报错)
-
python3默认限制递归次数为1000
#递归1~100的积
def mul(n):
if n == 1: #控制条件
return 1
return n * mul(n-1) #调用函数自身
result = mul(100)
print(result)
六、匿名函数
没有名称的函数,称为匿名函数。匿名函数一般表示简单的函数语句(一行或者两行)
- 优点:简化了代码
- 缺点:降低了代码的可读性,增加了代码的维护成本
在python中,lambda代指一个没有名称的函数(匿名函数)
lambda [参数列表]: 代码 # 如果需要返回,则不需要写返回值
def fn1(fn):
fn()
print("函数执行结束")
fn1(lambda:print("匿名函数!"))
结果:
#有参数和返回值
def show(fn):
res = fn(10,20)
print(res)
def sum(x,y):
return x*y
show(sum)
#等效于:
def show(fn):
res = fn(10,20)
print(res)
show(lambda a,b:a * b)
#结果都是200
七、偏函数
在python中,我们有时候需要调用某个函数,如果想将该函数中的某个参数设置成一个固定值。那么就可以使用偏函数:
偏函数功能需要functools包中的partial()方法:
>>> import functools
>>> functools.partial()
#也可以
>>> from functools import partial
>>> partial()
以int()函数为例:
-
首先我们查看int()函数的说明:int()函数有一个名为base默认值为10的参数。base表示进制,有效数值为2~36。
help(int)
Help on class int in module builtins:
class int(object)
| int([x]) -> integer
| int(x, base=10) -> integer
|
| Convert a number or string to an integer, or return 0 if no arguments
| are given. If x is a number, return x.int(). For floating point
| numbers, this truncates towards zero.
|
| If x is not a number or if base is given, then x must be a string,
| bytes, or bytearray instance representing an integer literal in the
| given base. The literal can be preceded by ‘+’ or ‘-’ and be surrounded
| by whitespace. The base defaults to 10. Valid bases are 0 and 2-36.
| Base 0 means to interpret the base from the string as an integer literal.
| >>> int(‘0b100’, base=0)
| 4
…… -
调用int()函数
>>> int("12345") #默认base为10 12345 >>> int("12345",base = 8) 5349 >>> int("FFFF",base = 16) 65535 #将字符串"FFFF",以16进制进行读取,以10进制进行输出。
-
新建一个函数,将Int()函数中的base参数改为16,其他功能不变。
>>> from functools import partial >>> new_int = partial(int,base=16) >>> new_int("ffff") 65535
-
新建一个函数new_int(),将Int()函数中的base参数改为16,其他功能不变。
>>> from functools import partial >>> new_int = partial(int,base=16) >>> new_int("ffff") 65535