2.函数
定义一个函数并调用:
不带参数的函数:
def MyFunction():
print ("这是我创建的第一个函数")
print ("我表示很鸡冻~")
MyFunction()
>>>这是我创建的第一个函数
>>>我表示很鸡冻~
带参数的函数:
def add(figure1,figure2):
print (figure1+figure2)
add(1,2)
>>>3
带返回值的参数:
def add(figure1,figure2):
return (figure1+figure2)
sum=add(1,2)
print(sum)
>>>3
实参与形参
定义函数时括号里的参数是形参,调用函数时括号里的参数是实参。
默认参数
定义函数时可以给形参赋初值,这样调用时即使无参数也不会报错。
收集参数
当定义的一个函数不知道它有多少个参数时,可以使用收集参数,只需将形参前加*即可。例如:
def test(*params):
print("参数的长度是:",len(params))
print("第一个参数是:",params[0])
test('我是第一个参数',3.14,1,2,3,4,5)
>>>参数的长度是: 7
>>>第一个参数是: 我是第一个参数
局部变量与全局变量
在函数里定义的变量为局部变量,不要试图在函数里修改全局变量,因为python会屏蔽它,只是创建了一个名字与全局变量相同的局部变量,只可访问。例如:
count = 5
def test():
count = 10
print(count)
test()
print(count)
>>>10
>>>5
输出结果是10,5而不是10,10,若想在函数中修改全局变量怎么办呢?只需在函数中用global修饰全局变量即可。
count = 5
def test():
global count
count = 10
print(count)
test()
print(count)
>>>10
>>>10
内嵌函数
python支持函数的嵌套,被嵌套的函数只能在嵌套它的函数中被调用。
def fun1():
print("fun1被调用")
def fun2():
print("fun2被调用")
fun2()
fun1()
>>>fun1被调用
>>>fun2被调用
闭包
如果在一个内部函数里,对外部作用域(但不是全局作用域)的变量进行了引用,那么内部函数就认为是闭包。
def funX(x):
def funY(y):
return (x*y)
return funY
print(funX(8)(5))
>>>40
匿名函数(lambda)
Python写一些脚本函数时,使用lambda可以省略函数的定义过程,也不用考虑命名的问题,使程序更加简洁。:左边是参数,右边是返回值。
add = lambda x,y : x + y
print(add(3,4))
>>>7
两个牛逼的BIF
filter(function,iterable):过滤函数,过滤的内容为iterable,过滤条件是使function返回值为0的参数。例:
print(list(filter(lambda x : x % 2,range(1,10))))
>>>[1, 3, 5, 7, 9]
map(function,iterable):将iterable的每个元素作为function的参数进行运算。例:
print(list(map(lambda x : x * 2,range(1,10))))
>>>[2, 4, 6, 8, 10, 12, 14, 16, 18]
递归
递归的算法用条件和循环都能搞定,目的是使得程序变得简洁易懂,但是也扩大了内存的消耗。例如著名的斐波那契数列问题,用普通的算法如下,可以运算到100都没有问题:
def Fibonacci(n):
if n == 1 or n == 2:
return 1
else:
return Fibonacci(n-1)+Fibonacci(n-2)
n = int(input("请输入一个正整数"))
result = Fibonacci(n)
print("%d的斐波那契数列是%d"%(n,result))
>>>请输入一个正整数40
>>>40的斐波那契数列是102334155
用递归的方法:本人的电脑最多只能到40,而且速度非常慢:
def F(n):
n1 = n2 =n3 =1
while((n-2)> 0):
n3 = n1 + n2
n1 = n2
n2 = n3
n -= 1
return n3
n = int(input("请输入一个正整数"))
result = F(n)
print("%d的斐波那契数列是%d"%(n,result))
>>>请输入一个正整数100
>>>100的斐波那契数列是354224848179261915075
下面讲一个特别有趣的汉诺塔问题,用递归的方法实现,设有三根柱子为‘X’,‘Y’,‘Z’,汉诺塔层数为n。
def Hanoi(n,x,y,z):
if n == 1:
print(x," -> ",z)
else:
Hanoi(n-1,x,z,y)#将n-1层从x移动到y
print(x," -> ",z)#将最底层从x移动到z
Hanoi(n-1,y,x,z)#将n-1层从y移动到z
n = int(input("输入汉诺塔的层数"))
Hanoi(n,'X','Y','Z')