一、基本知识
1.函数的定义:
函数是指将一组语句的集合通过一个名字(函数名称)封装起来,要想执行这个函数,只需要调用其函数名称即可。
2.函数的特性
1)减少重复代码
2)使程序易扩展
3)使程序变得易于维护
3.语法定义
def hello():
print("hello, world ")
hello()
带参数
a,b = 5,9
c = a*b
print(c)
def calc(x,y):
result = x**y
return result
c = calc(a,b)
print(c)
二、函数参数与局部变量
形参:形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只有在函数内部有效,函数调用结束返回主调用函数后 则不能再使用该形参变量
实参:可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,他们都都必须有确定的值,以便把这些值传给形参。因此应预先用赋值、输入等办法使参数获得确定值。
默认参数
#author=ykyk
def student_info(name,age,country,course):
print("------info------")
print("name:",name)
print("age:",age)
print("hometown:",country)
print("course:",course)
student_info("ykyk",23,"CN","Oracle")
student_info("tina",25,"CN","medicine")
student_info("tony",26,"USA","Chinese")
从上面的信息可以看出,hometown的信息基本都是CN,我们可以将其设置为默认参数
def student_info(name,age,course,country='CN'):
关键参数
正常情况时,给函数传参数要按顺序,不想按顺序就可以用关键参数,只需指定参数名称即可,但关键参数必须放在位置参数后面
student_info(age=32,name='Lucas',course='MySQL',)
非固定参数
若函数在定义时不确定用户想传入多少个参数,就可以使用非固定参数
def student_info(name,age,*args):会将参入的参数变成一个元组的形式
print(name,age,args)
student_info("ykyk",27)
student_info("ykyk",27,'CN,Oracle')
××kwargs
def student_info(name,age,*args,**kwargs):
print(name,age,args,kwargs)
student_info("ykyk",22)
student_info("Lio",23,'CN','Oracle',gender='female',size='dick')ykyk 22 () {}
Lio 23 ('CN', 'Oracle') {'gender': 'female', 'size': 'dick'}
局部变量
#author=ykyk
name = 'ykyk'
def change_name(name):
print("before:",name)
name = 'ykyk is learning Python'
print('after:',name)
change_name(name)
print("in outside: ",name)
输出
before: ykyk
after: ykyk is learning Python
in outside: ykyk
全局变量和局部变量
在子程序中定的变量称为局部变量,在程序的一开始定义的变量称为全局变量,全局变量
的作用域是整个程序,局部变量作用域是定义该变量的子程序。
当全局变量与局部变量同名时,在定义局部变量的子程序内,局部变量起作用,在其他地方全局变量起作用
返回值
要想获得函数的返回值,可以用return语句把结果返回
注意:
1.函数在执行过程中只要遇到return语句,就会停止并返回结果,也就是函数的结束。
2.如果未在函数中指定return,那这个函数的返回值为None
递归
在函数内部,可以调用其他函数,如果一个函数在内部调用自身本身,这个函数就是递归函数
def calc(n):
print(n)
if int(n/2) == 0 :
return n
return calc(int(n/2))
calc(10)
输出
10
5
2
1
递归特性
1.必须有明确的结束条件
2.每次进入更深一层递归时,问题规模相比上一次递归都应有所减少
3.递归效率不高,递归层次过多会导致栈溢出
应用案例(引自Alex博客)
data
=
[
1
,
3
,
6
,
7
,
9
,
12
,
14
,
16
,
17
,
18
,
20
,
21
,
22
,
23
,
30
,
32
,
33
,
35
]
def
binary_search(dataset,find_num):
(dataset)
if
len
(dataset) >
1
:
mid
=
int
(
len
(dataset)
/
2
)
if
dataset[mid]
=
=
find_num:
#find it
(
"找到数字"
,dataset[mid])
elif
dataset[mid] > find_num :
# 找的数在mid左面
(
"\033[31;1m找的数在mid[%s]左面\033[0m"
%
dataset[mid])
return
binary_search(dataset[
0
:mid], find_num)
else
:
# 找的数在mid右面
(
"\033[32;1m找的数在mid[%s]右面\033[0m"
%
dataset[mid])
return
binary_search(dataset[mid
+
1
:],find_num)
else
:
if
dataset[
0
]
=
=
find_num:
#find it
(
"找到数字啦"
,dataset[
0
])
else
:
(
"没的分了,要找的数字[%s]不在列表里"
%
find_num)
binary_search(data,
66
)
匿名函数
匿名函数就是不需要显式的指定函数
def calc(n):
return n**n
print(calc(32))
#等价于
calc = lambda n:n**n
print(calc(32))
函数式编程
函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的的程序设计,
函数是面向过程的程序设计的基本单元
函数式编程中的函数这个术语不是指计算机中的函数,而是指数学上的函数,即自变量映射,也就是说,一个函数的值仅仅决定于函数参数的值,不依赖其他状态
高阶函数
变量可以指向参数,函数的参数能接受变量,那么一个函数就可以接收另一个函数作为参数,这个函数就称之为高阶函数
def add(x,y,f):
return f(x) + f(y)
result = add(2,-45,abs) ads 绝对值
print(result)输出47
内置函数
https://docs.python.org/3/library/functions.html?highlight=built#ascii