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)
函数的优势:
- 降低编程的难度(分而治之的思想)
- 代码重用。避免了重复劳动,提供了工作效率。
变量作用域
局部变量
全局变量
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))