Python之函数

it2022-05-05  127

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')

最新回复(0)