一、函数
1、函数定义
def 函数名(参数列表):
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】文件夹可以删掉