python-代码复用(函数、lambda、递归、PyInstaller库)
一、函数
1、函数定义
def 函数名(参数列表):
<body>
2、返回值 return
返回值可以有多个,其实是返回一个tuple
##多个返回值 def sumDiff(x,y): return x+y,x-y n1,n2 = eval(input('输入两个数:')) s,d = sumDiff(n1,n2) print('和为{},差为{}'.format(s,d))
##计算三角形周长 import math def square(x): return x*x #计算两点之间的距离 def distance(x1,x2,y1,y2): dist = math.sqrt(square(x1-x2) + square(y1-y2)) return dist #判断三个点是否构成三角形 def isTriangle(x1,y1,x2,y2,x3,y3): flag = ((x1-x2)*(y3-y2) - (x3-x2)*(y1-y2)) != 0 return flag def main(): print('输入三个坐标点(x,y):') x1,y1 = eval(input('坐标点1(x1,y1)=')) x2, y2 = eval(input('坐标点2(x2,y2)=')) x3, y3 = eval(input('坐标点3(x3,y3)=')) #判断三个点是否构成三角形 if(isTriangle(x1,y1,x2,y2,x3,y3)): ##计算三角形周长 perim = distance(x1,y1,x2,y2)+distance(x2,y2,x3,y3)+distance(x3,y3,x1,y1) print('该三角形周长为:{:.2f}'.format(perim)) else: print('三个点无法构成三角形') main()
3、参数
①位置参数
②默认参数
一是必选参数在前,默认参数在后,否则Python的解释器会报错
二是如何设置默认参数----- 定义默认参数要牢记一点:默认参数必须指向不变对象!
空列表不可作为默认参数 def a(L=[]) -------> def a(L=None)
##列表最后加一个END
def add_end(L=None): if L is None: L = [] L.append('END') return L
③可变参数(参数名前面加*,*args)(可以传入0个或多个参数,这些可变参数在函数调用时自动组装为一个tuple)
## 计算 1*1+2*2+3*3+..... def calc(*numbers): sum = 0 for n in numbers: sum = sum + n * n return sum
## 传参的时候,把list的所有元素作为可变参数传进去 >>> nums = [1, 2, 3] >>> calc(*nums) 14
④关键字参数(**kw)(关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict)
def person(name, age, **kw): print('name:', name, 'age:', age, 'other:', kw) >>> person('Michael', 30) name: Michael age: 30 other: {} >>> person('Bob', 35, city='Beijing') name: Bob age: 35 other: {'city': 'Beijing'} >>> person('Adam', 45, gender='M', job='Engineer') name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
>>> extra = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, **extra)
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
⑤命名关键字参数
## name、age是位置参数; *后面的city和job是命名关键字参数 def person(name, age, *, city, job): print(name, age, city, job)
>>> person('Jack', 24, city='Beijing', job='Engineer') ##命名关键字参数必须传入参数名 Jack 24 Beijing Engineer
## name、age是位置参数;*args是可变参数, city和job是命名关键字参数
def person(name, age, *args, city, job):
print(name, age, args, city, job)
⑥参数组合
参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
def wrapper(*args, **kw): ##可以接受任意参数的调用
⑦如果变量是可变对象【列表】,返回到调用程序后,对象会呈现被修改后的状态
def addInterest(balances,rate): for i in range(len(balances)): balances[i] = balances[i] * (1+rate) def test(): amounts = [1000,500,1200,789] rate = 0.05 addInterest(amounts,rate) print(amounts) test() ##[1050.0, 525.0, 1260.0, 828.45]
**************实例**************
def calculateNum(principal): # 计算星号的个数 total = int(principal*4/1000) return total def createTable(principal,apr): # 为每一年绘制星号的增长图 for year in range(1,11): principal = principal * (1+apr) print("%2d"%year,end='') total = calculateNum(principal) print('*'*total) print('0.0K 2.5k 5.0k 7.5k 10.0k') def main(): #输入本金和利率 principal = eval(input('输入本金:')) apr = eval(input('输入利率:')) #建立图表 createTable(principal,apr) main()
⑧参数检查(先对参数的数据类型做检查,抛出TypeError错误)
def my_abs(x): if not isinstance(x, (int, float)): ## isinstance(x, (int, float) ) ------- 传入参数是否为 int 或 float 类型,返回 True // False raise TypeError('bad operand type') if x >= 0: return x else: return -x
4、空函数
def nop():
pass
二、全局变量和局部变量
1、可以用 global 保留字在函数内部使用全局变量
n , s = 10,100 def fact(n): s = 1 ##局部变量s for i in range(1,n+1): s *= i return s print(fact(n),s) #362880000 100 n , s = 10,100 def fact(n): global s ##声明全局变量s for i in range(1,n+1): s *= i return s print(fact(n),s) #362880000 362880000
2、局部变量为组合类型且未创建,等同于全局变量
ls = ['a','d'] def func(a): ls.append(a) return func('g') print(ls) #['a', 'd', 'g']
ls = ['a','d'] def func(a): ls = [] ls.append(a) print(ls) return func('g') #['g'] print(ls) #['a', 'd']
三、lambda函数(特殊情况使用,建议使用def,固定情况使用)
<函数名> = <参数> : <表达式>
f = lambda x,y:x+y print(f(3,4))
四、递归
在函数的定义中使用函数自身
1、函数+分支结构(if...else...)
2、基例
3、链条
##递归 ##n!---n的阶乘 def fact(n): if n == 0: return 1 else: return n*fact(n-1) print(fact(5))
##字符串反转 s[::-1] def reverse(s): if s == '': return s else: return reverse(s[1:]) + s[0] print(reverse('Hello'))
斐波那契数列
def f(n): if n == 1 or n == 2: return 1 else: return f(n-1) + f(n-2)
五、PyInstaller库(第三方库)
将 .py文件 转换成 无需源代码的可执行文件 exe文件
先安装pyinstaller库
将print1.py文件转换成exe文件,在【dist】文件夹中,【_pycache_】和【build】文件夹可以删掉