- 函数的定义和使用:
python使用保留字def定义函数,函数就是IPO的一种实现,是对代码的一种抽象。
使用方法是:
def <函数体>(参数0或多个):
<函数体>
return <返回值>
定义可变数量参数(即参数数量不确定)
def <函数体>(参数, *b):
<函数体>
return <返回值>
- 局部变量和全局变量
- 局部变量:是在函数内部使用的变量
- 全局变量:是在函数外部定义的变量。
若要在函数内部定义全局变量使用global关键字
- lambda函数(匿名函数):返回函数名作为结果。使用lambda保留字定义,函数名是返回结果。用于定义简单的,能够在一行内表示的函数。
使用方法是:
<函数名> = lambda<参数>:<表达式>
例如:f = lambda x, y : x+y
lambda函数主要用作一些特定函数或方法的参数,仅特殊情况使用。
七段数码管实例:
#SevenDigiteDraw.py
#绘制七段数码管(电子表)
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 drawLine(False)
drawLine(True) if digit in [0,1,3,4,5,6,7,8,9] else drawLine(False)
drawLine(True) if digit in [0,2,3,5,6,8,9] else drawLine(False)
drawLine(True) if digit in [0,2,6,8] else drawLine(False)
turtle.left(90)
drawLine(True) if digit in [0,4,5,6,8,9] else drawLine(False)
drawLine(True) if digit in [0,2,3,5,6,7,8,9] else drawLine(False)
drawLine(True) if digit in [0,1,2,3,4,7,8,9] else drawLine(False)
turtle.left(180)
turtle.penup()
turtle.fd(20)
def drawDate(date):#date为日期,格式为 '%Y-%m=%d+'
turtle.pencolor("red")
for i in date:
if i == '-':
turtle.write('年',font=("Arial",18,"normal"))
#在turtle库中使用turtle.write()函数来绘制一个具体的汉字
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 mian():
turtle.setup(800,350,200,200)
turtle.penup()
turtle.fd(-300)
turtle.pensize(5)
drawDate(time.strftime('%Y-%m=%d+',time.gmtime()))
#time.gmtime()获取一个内部的时间类型的当前时间,并使用time.strftime()对时间进行格式化
turtle.hideturtle()#将海龟画笔隐藏
turtle.done()
mian()#函数定义并不运行,所以最后要调用main()启动函数的运行
- 代码复用与函数递归
- 模块化设计思想:模块内部紧耦合,模块之间松耦合。
- 紧耦合:两个部分之间交流很多,无法独立存在。
- 松耦合:两个部分之间交流很少,可以独立存在。 - 递归(是数学归纳法的编程体现)
递归的两个关键特性:链条和基例
- 链条:计算过程中存在递归链条
- 基例:存在一个或多个不需要再次递归的基例
实例:
#斐波那契数列的递归实现
def f(n):
if n ==1 or n == 2:
return 1
else:
return f(n-1) + f(n-2)
#汉诺塔问题递归实现
#hanoi.py
t = eval(input("请输入汉诺塔的层数:"))
count = 0
def hanoi(n,src,dst,mid):
global count
if n == 1:
print("{}:{}->{}".format(1,src,dst))
count += 1
else:
hanoi(n-1,src,mid,dst)
print("{}:{}->".format(n,src,dst))
count += 1
hanoi(n-1,mid,dst,src)
hanoi(t,"A","C","B")
print(count)
- 例题
-
eg1:题目来自python123.io平台
#参考代码
import random
def genpwd(length):
a = 10**(length-1)
b = 10**length - 1
return "{}".format(random.randint(a, b))
length = eval(input())
random.seed(17)
for i in range(3):
print(genpwd(length))
-
eg2:
题目来自python123.io平台
#参考代码
def prime(m):
for i in range(2,m):
if m % i == 0:
return False
return True
n = eval(input())
n_ = int(n)
n_ = n_+1 if n_ < n else n_
count = 5
while count > 0:
if prime(n_):
if count > 1:
print(n_, end=",")
else:
print(n_, end="")
count -= 1
n_ += 1