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】文件夹可以删掉

 

 

 

 

 

 

 

 

 

  

 

posted @ 2019-09-30 17:56  kuluma  阅读(500)  评论(0编辑  收藏  举报