函数
一、函数的理解和定义
1.函数是一段具有特定功能的、可重用的语句组
2.函数是执行特定功能的代码的封装,将函数内部的代码与主体代码分离开
3.输入(实参形参)、处理(语句)、输出(return)
4.两个作用:降低编程难度、实现代码复用
5.函数是IPO(import process output)
二、def 与 return
1.函数可以有参数,也可以没有参数,当运行函数时,不管有没有返回值,整个函数都会运行一遍,最后如果有返回值,return返回值。Return 0 也表示程序什么都不返回
2.局部变量,就是用来占位的,本身并不是真正的变量,所以即使和全局变量重名,也没有关系。
3.global保留字:在函数内部使用全局变量。很形象:让global 后的变量,变成全球都是使用的,而不仅仅是在函数里面使用的。
4.函数中没有创建列表,却操作了列表,这是列表默认是全局变量,不需要global。但如果创建了,该列表就是局部变量了,局部变量不return出来的话,就被释放了,也就没什么用了。
5.#global 须写在def后的第一行!
三、参数传递
1.即可以是,位置传参,也可以是关键字传参
2.可选参数传递:有默认值的参数(default argument),在用户看来,就是可以输入,也可以不输入直接使用默认值的参数,即可选参数。位置在
3.可变参数传递:*a 参数的数量不确定。也就是说,a是组合数据类型(一般是tuple),是一个可以容纳多个变量的容器。
4.关键参数:传参时,必须使用赋值语句,a = ?
5.python参数顺序:正常参数(可以有多个)>默认参数>可变参数>关键字参数
(1)所有正常参数,必须在默认参数前面
(2)如果有可变参数,那么默认参数一定会被重新赋值,即使是可变参数,无参数传递进去,这时print(可变参数) 得 ( ) 即空元组
(3) 在可变参数后面,一定是关键字参数,需要使用赋值语句传参。
(4)关键字参数也有,可选关键字参数(默认关键字参数),和可变关键字参数(**a)(通常是字典类型)
def io (a,c,b=1,*d,f,g=3,**h):
print(a,b,c,d,f,g,h)
s = io(2,10,12,f=1,g=2,h=34,i=57,j=23)
print(s)
>>>2 12 10 () 1 2 {'h': 34, 'i': 57, 'j': 23}
四、lambda保留字 函数
1.格式:函数名 = lambda 变量1,变量2, :expression
2.例如:f = lambda s,r :s//r
f(10,3) = 3
3.谨慎使用lambda保留字
(1)Lambda定义的函数,主要用作参数
(2)有一些固定的使用方式
(3)建议使用def
五、实例:七段数码管绘制
1.If True :
Expression1
就是执行expression1 至于为什么不直接写expression1,是因为还有
If False:
Expression2
即,在只有两种选择的时候,可以分别使用true ,false作为分支条件
2. 第一版
import turtle as t
def drawline(draw):
t.pendown() if draw else t.penup()
t.fd(40)
t.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,3,4,5,6,7,8,9] else drawline(False)
drawline(True) if digit in [0,2,3,5,6,8] else drawline(False)
drawline(True) if digit in [0,1,2,6,8] else drawline(False)
t.left(90)
drawline(True) if digit in [0,1,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,2,3,4,7,8,9] else drawline(False)
t.left(180)
t.penup()
t.fd(20)
def drawdate(date):
for i in date:
drawdigit(eval(i))
def main():
t.setup(800,350,200,200)
t.penup()
t.fd(-300)
t.pensize(5)
drawdate('20191127')
t.hideturtle()
t.done()
main()
3.第二版
import turtle as t
import time
def drawgap():
t.penup()
t.fd(5)
def drawline(draw):
t.pendown() if draw else t.penup()
t.fd(40)
t.right(90)
def drawdigit(digit):
drawgap()
drawline(True) if digit in [2,3,4,5,6,8,9] else drawline(False)
drawgap()
drawline(True) if digit in [0,3,4,5,6,7,8,9] else drawline(False)
drawgap()
drawline(True) if digit in [0,2,3,5,6,8,9] else drawline(False)
drawgap()
drawline(True) if digit in [0,1,2,6,8] else drawline(False)
t.left(90)
drawgap()
drawline(True) if digit in [0,1,4,5,6,8,9] else drawline(False)
drawgap()
drawline(True) if digit in [0,2,3,5,6,7,8,9] else drawline(False)
drawgap()
drawline(True) if digit in [0,2,3,4,7,8,9] else drawline(False)
t.seth(0)
t.penup()
t.fd(20)
def drawdate(date):
for i in date:
if i == '-':
t.write('年',font=("Arial",18,"normal"))
t.pencolor('green')
t.fd(40)
elif i =='=':
t.write('月',font=("Arial",18,"normal"))
t.pencolor("blue")
t.fd(40)
elif i == '+':
t.write('日',font=("Arial",18,"normal"))
else:
drawdigit(eval(i))
def main():
t.penup()
t.fd(-300)
for i in range(10):
drawdigit(i)
t.seth(0)
t.penup()
t.fd(20)
def main2():
t.setup(800,350,200,200)
t.penup()
t.fd(-350)
t.pensize(5)
t.pencolor('red')
drawdate(time.strftime('%Y-%m=%d+',time.gmtime()))
t.hideturtle()
t.done()
main2()
六、Thoughts
1.函数:模块化思维,分而治之,“封装”,“接口”
2.规则化思维:不写特定场景下的函数,使用参数控制,让一个函数,能做一类事情,而不是一件事情
3.高内聚低耦合