Python学习系列(四)——函数的使用
——————————————————————————
稍微写过超过100行代码的人大概又会有一个印象,写代码的时候别上来直接写全部内容,分成子函数慢慢写,逐个攻破,python怎么能没有函数呢?来,见证一下。
基本操作
lambda函数
lambda是一种匿名函数,适合于写简单函数,能一行搞定的那种函数。
>>> f = lambda x, y : x ** 2 - 2 * x * y + y **2 #冒号左侧为参数,右侧为运算
>>> f(10, 12)
4
函数调用
def print_str(): #定义子函数
a, b = 3, 4
a, b = b, a
print(a, ", " ,b)
if __name__ == '__main__': #主函数入口
print_str() #调用子函数
函数传参
可选参数。
def print_str(str, times = 2): #第二个参数为默认值
str = str * times
print(str)
if __name__ == '__main__':
print_str("test ") #只传递了第一个参数
可变参数
def print_str(str, *str1): #第二个参数面前加*号,传递进来的参数为元组
for i in str1: #用变量i去遍历元组
str = str + i
print(str)
if __name__ == '__main__':
print_str("this ", "is ", "a ", "test.") #传递四个参数
运行结果:
this is a test.
参数位置和名称传递
def func(x1, y1, x2, y2): #指定形参名称的时候,参数间的顺序可以任意调整
print("x1 =",x1)
print("x2 =",x2)
print("y1 =",y1)
print("y2 =",y2)
if __name__ == '__main__':
func(y2 = 1, x2 = 2, y1 = 3, x1 = 4) #对形参赋值传递
运行结果:
x1 = 4
x2 = 2
y1 = 3
y2 = 1
函数的返回值
import math
def func(x1, y1, x2, y2):
return math.sqrt((x1 - y1) ** 2 + (x2 - y2) ** 2) #计算两点之间的距离并返回
if __name__ == '__main__':
dis = func(y2 = 1, x2 = 2, y1 = 3, x1 = 4) #dis接收return的返回值
print(dis)
函数对变量的作用
count = 1
def func(a): #表明子函数中的局部变量不影响全局变量
count = a
count *= a
if __name__ == '__main__':
func(10)
print(count) #输出的结果是1
count = 1
def func(a):
global count #加入global全局变量声明后,局变成了全变
count = a
count *= a
if __name__ == '__main__':
func(10)
print(count) #这次的值是100
ls = [] #列表,组合数据类型
def test(a, b):
ls.append(b) #引用全局变量
if __name__ == '__main__':
test(1, 2)
print(ls) #全局变量的值在子函数中被改变,输出[2]
ls = []
def test(a, b):
ls = [] #创建一个局部变量屏蔽全局变量
ls.append(b)
if __name__ == '__main__':
test(1, 2)
print(ls) #输出[],全局变量的值没被改变
函数递归
函数递归是一种最头疼的东西,比如在数据结构里面,什么归并排序、调堆、先中后遍历二叉树,用递归实现对我来说还是比较头疼的,简直有毒,这里就举几个简单的能看懂的例子吧。。。数据结构这种东西,珍爱生命,远离data structure。
def fact(n): #一个老掉牙的例子,计算阶乘
if n == 1:
return 1
else:
return n * fact(n-1)
if __name__ == '__main__':
print(fact(4))
下面的例子是想对字符串进行反转的,但是程序会报错,为什么呢?超过了最大递归深度,Python防止你写的程序有bug,无休止的递归会很浪费计算资源。之前用效率最快的C语言写递归的时候,递归层数过多的时候,代码会执行的很慢,毕竟递归这玩意是用栈实现的,保存断点在返回,还是很费时间的。所以,某种程度上递归也不是个好东西。
def reverse(str):
reverse(str[1:] + str[0])
if __name__ == '__main__':
s = reverse("123456789")
print(s)
>>>RecursionError: maximum recursion depth exceeded