Python之函数

Python之函数

函数

如果在开发程序时,需要某块代码多次,但是为了提高编写的效率以及代码的重用,所以把具有独立功能的代码块组织为一个小模块,这就是函数.

函数的创建和调用

函数返回值
所谓“返回值”,就是程序中函数完成一件事情后,最后给调用者的结果.
没有返回值,默认返回None
案例一 打印图形

def printOneLine():
    """ 打印一条横线"""
    print("-" * 30)

def printNumLine(num):
    """ 打印多条横线"""
    i = 0
    while i < num:
        printOneLine()
        i += 1

if __name__ =="__main__":
    printNumLine(3)
----------------------------------------------------------
------------------------------
------------------------------
------------------------------

案例二 数学计算

# 求三个数的和
def sum3Number(a,b,c):
    return a+b+c    #return的后面可以是数值也可以是表达式

def average3Number(a,b,c):
    sumResult = sum3Number(a,b,c)
    aveResult = sumResult/3.0
    return aveResult

if __name__=="__main__":
    result = average3Number(11,2,55)
    print("average is %d" % result)

函数的优势:

  1. 降低编程的难度(分而治之的思想)
  2. 代码重用。避免了重复劳动,提供了工作效率。

变量作用域

局部变量
在这里插入图片描述
全局变量
在这里插入图片描述
global的本质是声明可以修改全局变量的指向, 即变量可以指向新的数据。
1). 不可变类型的全局变量: 指向的数据不能修改, 不使用global时无法修改全局变量。
2). 可变类型的全局变量: 指向的数据可以修改, 不使用global时可以修改全局变量。

参数传递

在这里插入图片描述
调用函数时,如果参数个数不对,Python 解释器会自动检查出来,并抛出 TypeError;

  • 如果参数类型不对,Python 解释器就无法帮我们检查。

  • 数据类型检查可以用内置函数 isinstance 实现

参数总结
在这里插入图片描述

匿名函数

匿名函数指一类无需定义标识符的函数或子程序。Python用lambda语法定义匿名函数,只需用表达式而无需申明。(省略了用def声明函数额标准步骤)

#定义匿名函数
sum=lambda arg1,arg2:arg1+arg2

#调用sum函数
print('Value of total:', sum(10,20))
print('Value of total:', sum(7,2))
------------------------------------
Value of total: 30
Value of total: 9

lambda函数能接收任何数量的参数但只能返回一个表达式的值

应用场合1:函数作为参数传递

#a接收 b接收 fun接收函数名
def fun(a,b=2,myfun=pow):
    print('a=', a,end='; ')
    print('b=', b,end='; ')
    print('result= ',myfun(a,b))

fun(5)
fun(5,3)
fun(5,3,lambda x,y:x**y)
fun(5,3,lambda x,y:x+y)
---------------------------------
a= 5; b= 2; result=  25
a= 5; b= 3; result=  125
a= 5; b= 3; result=  125
a= 5; b= 3; result=  8

应用场合2:作为内置函数的参数
案例一

#用来生成美观的ASCII格式的表格的第三方模块
import prettytable as pt

def show(goods):
    table=pt.PrettyTable()
    table.field_names=["Name","Count","Price"]

    for good in goods:
        table.add_row(good)
    print(table)


goods=[
    #商品名称 商品数量 商品价格
    ('python核心编程', 200 ,70.30),
    ('java核心编程', 40 ,54.50),
    ('php核心编程', 40 ,85.30),
    ('ruby核心编程', 1000 ,50.60),
]


show(goods)

print("按照商品数量进行排序")
goods.sort(key=lambda x:x[1])
show(goods)

print("按照商品价格进行排序")
goods.sort(key=lambda x:x[2])
show(goods)

--------------------------------------------
+----------------+-------+-------+
|      Name      | Count | Price |
+----------------+-------+-------+
| python核心编程 |  200  |  70.3 |
|  java核心编程  |   40  |  54.5 |
|  php核心编程   |   40  |  85.3 |
|  ruby核心编程  |  1000 |  50.6 |
+----------------+-------+-------+
按照商品数量进行排序
+----------------+-------+-------+
|      Name      | Count | Price |
+----------------+-------+-------+
|  java核心编程  |   40  |  54.5 |
|  php核心编程   |   40  |  85.3 |
| python核心编程 |  200  |  70.3 |
|  ruby核心编程  |  1000 |  50.6 |
+----------------+-------+-------+
按照商品价格进行排序
+----------------+-------+-------+
|      Name      | Count | Price |
+----------------+-------+-------+
|  ruby核心编程  |  1000 |  50.6 |
|  java核心编程  |   40  |  54.5 |
| python核心编程 |  200  |  70.3 |
|  php核心编程   |   40  |  85.3 |
+----------------+-------+-------+

案例二

#问题描述:有一个整数列表,要求调整元素顺序,把所有的奇数放在前面,偶数放在后面
li=[30,10,21,34,453,4,56,7]
#三元运算符,x若为偶数,则x赋值为1;x若为奇数,则x赋值为0;然后进行由小到大的排序。
print(sorted(li, key=lambda x:1 if x % 2 == 0 else 0))
--------------------------------------------------------------------
[21, 453, 7, 30, 10, 34, 4, 56]

递归函数

已知:函数可以调用函数
结论:一个函数在内部调用自己本身,这个函数就是递归函数。

案例一 递归函数计算阶乘
递归函数原理
在这里插入图片描述

def factorial(num):
    if num >= 1:
        result=num * factorial(num-1)
    else:
        result=1
    return result


if __name__=='__main__':
    print(factorial(2))
    print("5的阶乘是%s" % (factorial(5)))
-----------------------------------------------
2
5的阶乘是120

案例二 递归函数计算斐波那契数列
斐波那契数列(Fibonacci sequence),又称黄金分割数列,指的是这样一个数列:
1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递推的方法定义:
F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)

def fib(num):
    """
    斐波那契数列
    :param num:
    :return:
    """
    if num <= 2:
        return 1
    else:
        return fib(num - 1) + fib(num - 2)
result = fib(29)
print(result) 
--------------------------------------------
514229

案例三 递归函数计算汉诺塔问题
在这里插入图片描述

moveCount = 0

def hanoi(n, a='A', b='B', c='C'):
    """

    :param n: 盘子个数
    :param a: 初始塔
    :param b: 缓存塔
    :param c: 目标塔
    :return: 移动次数


    思路:
    if 盘子个数==1:
       print 初始塔,'移到',目标塔
       return
    hanoi(盘子个数-1,初始塔,缓存塔,目标塔)
    print(初始塔,'移到',目标塔)
    hanoi(盘子个数-1,初始塔,缓存塔,目标塔)

    """
    if n==1:
        print(a,'--->',c)
        global moveCount
        moveCount += 1

    else:
        hanoi(n-1,a,c,b)
        hanoi(1,a,b,c)
        hanoi(n-1,b,a,c)

hanoi(6)
print("至少需要移动%s次" %(moveCount))
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值