from time import perf_counter
start = perf_counter()
//balabala
end = perf_counter()
五、函数和代码复用
5.1 函数的理解和定义
函数的定义
def <>(<>):
<>
return <>
函数定义时,所指定的参数是一种占位符
函数的使用及调用过程
调用时要给出实际参数
实际参数替换定义中的参数
函数调用后得到返回值
函数的参数传递
函数必须保留括号,无论有没有参数
可选参数传递
def fact(n, m = 1):
s = 1
for i in range(1, n+1):
s *= i
return s
可变参数传递
def fact(n, *b):
s = 1
for i in range(1, n+1):
s *= i
for item in b:
s *= item
return s
//fact(10, 3)
//fact(10,3,5,8)
//比如min(),max()
参数传递的两种方式
位置传递
名称传递
def fact(m, n)
fact(10, 5)
fact(n = 5, n = 10)
函数的返回值
函数可以返回0个或多个结果
return保留字用来传递返回值
函数可以有返回值,也可以没有
可以有return也可以没有
return可以传递0个返回值,也可以传递任意多个返回值
传递任意多个返回值的形式是元组类型
或者 a,b,c = fact(10,5)
局部变量和全局变量
局部变量和全局变量是不同变量
局部变量是函数内部的占位符,与全局变量可能重名但不同
函数运算结束后,局部变量被释放
可以使用global保留字在函数内部使用全局变量
局部变量为组合数据类型且未创建,等同于全局变量
lambda函数
lambda函数返回函数名作为结果
lambda函数是一种匿名函数,即没有名字的函数
使用lambda保留自定义,函数名是返回结果
lambda函数用于定义简单的、能够在一行内表示的函数
<函数名> = lambda<参数>:<表达式>
等价于
def <函数名>(<参数>):
<函数体>
return <返回值>
f = lambda x, y : x + y
f(10,15)
谨慎使用lambda函数
实例 : 七段代码管的绘制
import turtle, time
def drawgap():
turtle.penup()
turtle.fd(5)
def drawline(draw):
drawgap()
turtle.pendown() if draw else turtle.penup()
turtle.fd(40)
drawgap()
turtle.right(90)
def drawdigit(digit):
drawline(True) if digit in [2,3,4,5,6,8,9] else deawline(False)
drawline(True) if digit in [0,1,3,4,5,6,7,8,9] else deawline(False)
drawline(True) if digit in [0,2,3,5,6,8,9] else deawline(False)
drawline(True) if digit in [0,2,6,8] else deawline(False)
turtle.left(90)
drawline(True) if digit in [0,4,5,6,8,9] else deawline(False)
drawline(True) if digit in [0,2,3,5,6,7,8,9] else deawline(False)
drawline(True) if digit in [0,1,2,3,4,7,8,9] else deawline(False)
turtle.left(180)
turtle.penup()
turtle.fd(20)
def drawdate(date):
turtle.pencolor("red")
for i in date:
if i == '-':
turtle.write('年',font=("Arial",18,"normal"))
turtle.pencolor("green")
turtle.fd(40)
elif i == '=':
turtle.write('月',font=("Arial",18,"normal"))
turtle.pencolor("blue")
turtle.fd(40)
elif i == '+':
turtle.write('日',font=("Arial",18,"normal"))
else:
+drawdigit(eval(i))
def main():
turtle.setup(800,350,200,200)
turtle.penup()
turtle.fd(-300)
turtle.pensize(5)
drawdate(time.strftime('%Y-%m=%d+',time.gmtime()))
turtle.hideturtle()
turtle.done()
main()
思维:
模块化思维
规则化思维
5.2 代码复用与函数递归
代码复用与模块化设计
函数:将代码命名,在代码层面建立了初步抽象
对象:属性和方法,< a>.< b>和< a>.< b>(),在函数之上再次组织进行抽象
模块化设计:紧耦合,松耦合
模块内部紧耦合,模块之间松耦合
函数递归的理解
函数定义中调用函数自身的方式
链条:计算过程存在递归链条
基例:存在一个或多个不再递归的基例
类似于数学归纳法
函数递归的调用过程
def fact(n):
if n == 0"
return 1
else :
return n * fact(n - 1)
递归的实现:函数+分支语句
函数递归实例分析
字符串反转
s[::-1]
def rvs(s):
if s == "":
return s
else :
return rvs(s[1:])+s[0]
斐波那契数列
def F(n):
if n == 1 or n == 2:
return 1
else:
return F(1) + F(2)
import turtle
def koch(size, n):
if n == 0:
turtle.fd(size)
else:
for angle in [0,60,-120,60]:
turtle.left(angle)
koch(size/3, n-1)
def main():
turtle.setup(600,600)
turtle.penup()
turtle.goto(-200, 100)
turtle.pendown()
turtle.pensize(2)
level = 3
koch(400, level)
turtle.right(120)
koch(400, level)
turtle.right(120)
koch(400, level)
turtle.hideturtle()
main()
六、组合数据类型
6.1 集合类型及操作
集合类型定义
集合是多个元素的无序组合
集合类型与数学中的集合概念一致
集合元素之间无序,每个元素唯一,不存在相同元素
集合中不能出现可变数据类型
集合用大括号{}表示,元素间用逗号分隔
建立集合用{}或set()
建立空集合类型,必须使用set()
集合操作符
并 |
差 -
交 &
补 ^
<=、<
=、>
4个增强操作符 : op=
集合处理方法
S.add(x) //添加
S.discard(x) //移除,不报错
S.remove(x) //移除,若S中没有x,报错KeyError
S.clear() //清空所有
S.pop() //随机弹出一个元素
S.copy() //返回集合S的一个副本
len(S) //返回S的元素个数
x in S //是否存在
x not in S //
set(x) //将其他类型转换为集合类型
try:
while True:
print(A.pop(), end="")
except:
pass
集合类型应用场景
包含关系比较
数据去重
ls = ["p","p","y","y",123]
s = set(ls)
lt = list(s)
6.2 序列类型及操作
序列类型定义
序列是具有先后关系的一组元素
序列是一维元素向量,元素类型可以不同
类似数学元素序列
元素间由序列号引导,通过下标访问序列的特定元素
序列是一个基类类型
包括:字符串类型,元组类型,列表类型
6个操作符
x in s
x not in s
s + t
sn//ns
s[i]
s[i:j]//s[i:j:k]
通用函数和方法
len(s)
min(s)
max(s)
s.index(x)// s.index(x,i,j)
s.count(s)
元组类型定义
元组是序列类型的一种扩展
一旦创建就不能被修改
使用()或tuple()创建
可以使用或不使用小括号
元组继承序列类型的全部通用操作
列表类型定义
列表是序列类型的一种扩展
列表是一种序列类型,创建后可以随意被修改
使用[]或list()创建,元素间用逗号分隔
无长度限制
方括号[]真正创建一个列表,赋值仅传递引用
ls[i] = x
ls[i:j:k] = lt
del ls[i]
del ls[i:j:k]
ls += lt
ls *= n