Python之函数

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')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唱戏先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值